Moteur 3D Software open source en PB

Généralités sur la programmation 3D
Gratteur
Messages : 147
Inscription : ven. 22/avr./2005 23:02

Message 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
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message 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.
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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
tonton
Messages : 315
Inscription : mar. 26/avr./2005 15:19

Message 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.....
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Anonyme

Message par Anonyme »

Merci Dridi , c'est sympa d'avoir adapté , c'est un bon gain de perf :D
Coolman
Messages : 432
Inscription : sam. 01/janv./2005 16:07

Message 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)
Anonyme

Message par Anonyme »

Merci coolman, je vais dabord essayé de testé, puis pourquoi pas convertir la chose ^^
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message 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
Anonyme

Message 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
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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
tmyke
Messages : 1554
Inscription : lun. 24/juil./2006 6:44
Localisation : vosges (France) 47°54'39.06"N 6°20'06.39"E

Message 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)
Force et sagesse...
Anonyme

Message 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 ;)
Répondre