Page 3 sur 4

Publié : dim. 13/mai/2007 12:37
par Gratteur
Voila pour la matrice de rotation d'angle x, y, z que j'utilise :

Dim matrice.f(3,3)

Code : Tout sélectionner

Protected coszXsiny.f = _Cos(z)*_Sin(y), sinzXsiny.f = _Sin(z)*_Sin(y)
matrice(0,0) = _Cos(z)*_Cos(y)
matrice(1,0) = _Sin(z)*_Cos(y)
matrice(2,0) = -_Sin(y)
matrice(0,1) = coszXsiny*_Sin(x) - _Sin(z)*_Cos(x)
matrice(1,1) = sinzXsiny*_Sin(x) + _Cos(x)*_Cos(z)
matrice(2,1) = _Sin(x)*_Cos(y)
matrice(0,2) = coszXsiny*_Cos(x) + _Sin(z)*_Sin(x)
matrice(1,2) = sinzXsiny*_Cos(x) - _Cos(z)*_Sin(x)
matrice(2,2) = _Cos(x)*_Cos(y)
(En remplacant ça par la matrice de Guimauve ça devrait un poil améliorer les perfs).

Puis après avoir calculé cette matrice vous pouvez réduire le nombre de multiplication de 12 à 6 en factorisant judicieusement comme ça :
Dim a.f(3)

Code : Tout sélectionner

a(0) = -(matrice(0,1)*matrice(0,0))
a(1) = -(matrice(1,1)*matrice(1,0))
a(2) = -(matrice(2,1)*matrice(2,0))
Et enfin il faut utiliser les résultats pour faire bouger les sommets :
Avec Point3D(nb_sommets) les sommets utilisés pour l'affichage, Sommet(nb_sommets) précalculé les positions des sommets sans rotation dont Sommet(i)\xy = Sommet(i)\x*Sommet(i)\y.

Code : Tout sélectionner

For i=0 To derniersommet
  Point3D(i)\x = (matrice(0,1)+sommet(i)\x)*(matrice(0,0)+sommet(i)\y) + a(0)+sommet(i)\xy + matrice(0,2)*sommet(i)\z
  Point3D(i)\y = (matrice(1,1)+sommet(i)\x)*(matrice(1,0)+sommet(i)\y) + a(1)+sommet(i)\xy + matrice(1,2)*sommet(i)\z
  Point3D(i)\z = (matrice(2,1)+sommet(i)\x)*(matrice(2,0)+sommet(i)\y) + a(2)+sommet(i)\xy + matrice(2,2)*sommet(i)\z
Next i

Publié : dim. 13/mai/2007 14:09
par tonton
quelle utilité de optimiser les calcule sin et cos , que ce soit en sincos ou precalculé.
ce calcule a lieu 1 fois par image ou par rotation quelque soit la complexité de la scene.

Publié : dim. 13/mai/2007 16:04
par Guimauve
tonton a écrit :quelle utilité de optimiser les calcule sin et cos , que ce soit en sincos ou precalculé.
ce calcule a lieu 1 fois par image ou par rotation quelque soit la complexité de la scene.
Non le calcul doit être fait pour chacune des entitées à chaque changement de position qu'elles soient visible ou non. Il ne faut pas oublier qu'ensuite il faut passer tout les polygones en fonction des mouvements correspondants.

On doit impérativment optimiser les calculs par tout les moyens.

A+
Guimauve

Publié : dim. 13/mai/2007 18:57
par tonton
on ne doit pas voir ca sous le meme angle.
dans mes applications, le pti sinus et insignifiant par rapport au reste.
mais c est sur que si c est pour faire tourner un cube fils de fer de 3 pixels.....

Publié : lun. 14/mai/2007 20:10
par Guimauve
Et bien ça dépand si on veux afficher une scène Statique ou une scène dynamique. Il est certain que pour une scène statique on peut donner l'impression de mouvement simplement en déplaçant la caméra.

Mais dans le cas d'une scène dynamique, on doit repositionner les vertices de tout les triangles, recalculer les normales, etc, avant de les afficher à l'écran.

Donc on doit re-calculer une matrice de rotation pour chacune des entités présente dans la scène.

Pour économiser les calculs on calcul une matrice concaténé de toute les transformations géométriques (Translation, Rotation, Mirroir, Scale). Ensuite avec cette matrice on passe tout les points à la moulinette pour mettre à jour la scène.

Exemple : 2 cube sont visible par la caméra l'un d'eux tourne (Rx=45.0°, Ry =33.330°, Rz=65.0°) l'autre (Rx=-2.5°, Ry=-35.0°, Rz=-22.0°) de façon continue. Donc on n'a pas vraiment le choix, 2 matrices de rotation (1 pour chaque cube) doivent être calculées pour afficher la scène correctement.

A+
Guimauve

Publié : lun. 14/mai/2007 20:36
par Dr. Dri
bah techniquement on peut pousser les matrices jusqu'à la projection
un truc sympa que j'avais testé c'est d'empiler les matrices
on empile une matrice et si y'en avait déjà une on empile la multiplication des deux comme ca au moment de changer de mesh on dépile la matrice du mesh et on empile celle du nouveau (et techniquement pour chaque mesh on empile les matrices des membres etc)

Dri

Publié : ven. 18/mai/2007 9:45
par Dr. Dri
@Cpl.Bator
j'ai changé tes fonctions de rotation avec la petite astuce asm et je passe de 8 à 30 de FPS avec le debugger et je passe de 20 à 60~62 sans. Je posterais le code même si c'est pas compliqué à faire à partir de mon exemple.

Dri

Publié : ven. 18/mai/2007 11:28
par Anonyme
Merci Dridi , c'est sympa d'avoir adapté , c'est un bon gain de perf :D

Publié : ven. 18/mai/2007 14:40
par Coolman
J'ai visité le site de blitzmax pour voir les evolutions du language, je suis tombé sur un moteur 3d 8O qui m'a l'air interessant, alors au lieu de reinventer la roue, peut etre qu'il serait possible de readapter le code a purebasic, le code source est fourni ave gestion de camera, collision, animation model, sprites ....

C'est par ici (MiniB3D):

http://www.si-design.co.uk/

la licence est tres permissive :)

8)

Publié : ven. 18/mai/2007 19:09
par Anonyme
Merci coolman, je vais dabord essayé de testé, puis pourquoi pas convertir la chose ^^

Publié : sam. 19/mai/2007 23:01
par Dr. Dri
je viens de regarder et effectivement ça a l'air "assez" puissant
le hic pour adapter en PB c'est que c'est une approche objet

Dri

Publié : sam. 19/mai/2007 23:26
par Anonyme
C'est pas très grave, dès que j'arrive à mettre la main sur une démo de blitz je teste, si ca me plait bien, je convertit l'engin :D

Publié : dim. 20/mai/2007 2:27
par Guimauve
Il y a un autre moteur 3D que j'ai trouvé par hasard. Parcontre c'est en C++
orienté objet (OpenGL et SDL)

http://little3d.free.fr/index.htm

A+
Guimauve

Publié : dim. 20/mai/2007 9:14
par tmyke
Cpl.Bator a écrit :C'est pas très grave, dès que j'arrive à mettre la main sur une démo de blitz je teste, si ca me plait bien, je convertit l'engin :D
Connaissant bien BMax et la POO, s'il y a besoin d'un coups de main, je serais pas loin...
(accessoirement sur la 3D aussi)

Publié : dim. 20/mai/2007 9:19
par Anonyme
@Guimauve , merci je ne conaissais pas, je me suis mis au c++ facon poo, je ne suis pas encore un pro, mais la lecture d'un code ne me fait plus fumé la cervelle :D


@Tmyke , merci ;)