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 »

De rien, le fait que ça vous interesse me fait plaisir, autant partager :D
J'ai refais l'archive avec les sources réorganisées, spécifiées et un poil modifiées, ça devrait être beaucoup plus lisible.
Toujours le même lien : http://ns.gratteur.free.fr/Autre/Moteur3D.zip

Cpl.Bator je suis interessé par ce que tu as fais puisque je n'ai pas encore attaqué les déplacements ni les déplacements de caméra (les matrices me répugnent un peu), tu as implémenté le clipping 3D pour éviter d'afficher ce qui est derrière la caméra et ce qui te tape dans l'oeil (vive les divisions par 0, ceux qui ont essayé de la projection comprendront) ?

Edit : Je viens de résoudre un petit bug qui foutait en l'air les éclairages, le résultat est désormais plutot pas mal et le lissage des facettes fonctionne enfin, regardez plutot :
Image
Anonyme

Message par Anonyme »

non , je n'ai pas implémenté le clipping, à vrai dire je ne l'ai jamais vraiment fait, c'était plus de la bidouille qu'autre chose ^^
je testais le point moyen d'une face[z=(P1->Z + P2->Z + P3->Z)] , et si <0 je ne l'affiche pas.
je met les sources au propre se week end pour les caméras et je balance ici.
Frenchy Pilou
Messages : 2194
Inscription : jeu. 27/janv./2005 19:07

Message par Frenchy Pilou »

Le canard de l'espace ! :)
Cela a l'air de bien marcher et il y a du choix d'affichage!
Je ne sais si on vole dans l'espace, on plane plutôt :D
Backup
Messages : 14526
Inscription : lun. 26/avr./2004 0:40

Message par Backup »

Frenchy Pilou a écrit :Je ne sais si on vole dans l'espace, on plane plutôt :D
pareil! pour planer il faut de l'air ! :?

je parlerai plutot de "dérive" :D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

@Gratteur
je disais ça pour le code de Cpl.Bator, mais de toute manière faut éviter de faire deux fois un même gros calcul dans une fonction.

Dri ;)

PS. j'ai pas encore regardé ton code et pis j'ai pas PB sur cette machine
Anonyme

Message par Anonyme »

ou simplement ne pas appeller deux fois les fonctions de trigo pour le même angle
c'est déjà un bon début d'optimisation
je disais ça pour le code de Cpl.Bator, mais de toute manière faut éviter de faire deux fois un même gros calcul dans une fonction.
tu as vu ca où ? j'ai filé que des fct° 8O

@++ :wink:
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Cpl.Bator a écrit :

Code : Tout sélectionner

Procedure MATRICE_ROTATE_X(*MATRICE.MATRIX4x4,Angle.f)
  *MATRICE\_11 = 1 : *MATRICE\_21 = 0          : *MATRICE\_31 = 0           : *MATRICE\_41 = 0
  *MATRICE\_12 = 0 : *MATRICE\_22 = Cos(Angle) : *MATRICE\_32 = -Sin(Angle) : *MATRICE\_42 = 0
  *MATRICE\_13 = 0 : *MATRICE\_23 = Sin(Angle) : *MATRICE\_33 = Cos(Angle)  : *MATRICE\_43 = 0
  *MATRICE\_14 = 0 : *MATRICE\_24 = 0          : *MATRICE\_34 = 0           : *MATRICE\_44 = 1
EndProcedure
Dans ce code tu as deux sinus et cosinus pour le même angle... Sinon il est possible d'apporter des optimisations supplémentaires en assembleur, avec par exemple l'instruction du FPU qui calcule le cosinus et le sinus en même temps...

Dri
Anonyme

Message par Anonyme »

Effectivement , c'est pas bête du tout, en revanche j'y connais pas grand chose en asm... si t'a un exemple qui traine ^^
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

voila un petit exemple

Code : Tout sélectionner

Procedure MATRICE_ROTATE_X(*MATRICE.MATRIX4x4, Angle.f)
  Protected Cos.f, Sin.f
  
  !FLD  dword [p.v_Angle]
  !FSINCOS
  !FSTP dword [p.v_Cos]
  !FSTP dword [p.v_Sin]
  
  *MATRICE\_11 = 1.0 : *MATRICE\_21 = 0.0 : *MATRICE\_31 =  0.0 : *MATRICE\_41 = 0.0
  *MATRICE\_12 = 0.0 : *MATRICE\_22 = Cos : *MATRICE\_32 = -Sin : *MATRICE\_42 = 0.0
  *MATRICE\_13 = 0.0 : *MATRICE\_23 = Sin : *MATRICE\_33 =  Cos : *MATRICE\_43 = 0.0
  *MATRICE\_14 = 0.0 : *MATRICE\_24 = 0.0 : *MATRICE\_34 =  0.0 : *MATRICE\_44 = 1.0
EndProcedure
Dri ;)
Anonyme

Message par Anonyme »

Merki Mr.Dri :D
Dr. Dri
Messages : 2527
Inscription : ven. 23/janv./2004 18:10

Message par Dr. Dri »

Juste histoire de donner une idée du gain voila ce qu'on trouve dans FPU.HLP

Code : Tout sélectionner

----------------------------------------------------------------
 FSIN           | fsin                    | 486 257-354 *
----------------------------------------------------------------
 FCOS           | fcos                    | 486 257-354 *
----------------------------------------------------------------
 FSINCOS        | fsincos                 | 486 292-365 *
----------------------------------------------------------------
FSIN et FCOS prennent au mieux 257 cycles processeur et au pire 354.
Si on doit calculer Sin et Cos d'un angle ca fait au mieux 514 cycles.
Si on utilise FSINCOS on aura toujours au pire 365 cycles.

Dri ;)
Anonyme

Message par Anonyme »

File:1->Moteur3D_Software.rar
Image

Voila mes sources, cepandant ca déconne un peu au niveau du rendu du terrain en Flat, je défini mal les faces (Terrain.pbi)
le rendu se fait dans "Camera.pbi" , les opérations sur les mesh dans mesh.pbi
je vous laisse jetez un oeil, si vous z'avez des questions, j'chui là ^^
Dri, essaye , si tu peut de voir comment adaptez ton code asm dans les procédure Matrice_rotateXYZ(x,y,z) , j'ai 3 variables en paramètre (4 avec la matrice pointée)

@++
Gratteur
Messages : 147
Inscription : ven. 22/avr./2005 23:02

Message par Gratteur »

Utilise plutot des valeurs précalculées pour les sinus et cosinus (en plus ça évite de convertir les angles en radians :

Code : Tout sélectionner

  #CPI = 0.017453292
  Global Dim _Sin.f(360)
  Global Dim _Cos.f(360)
  For i=0 To 359
    _Sin(i) = Sin(i*#CPI)
    _Cos(i) = Cos(i*#CPI)
  Next i
Sinon ton source à l'air pas mal, mais je crois qu'on peut faire toutes les opérations matricielles en une fois au lieu de 3 avec du calcul vectoriel.
Anonyme

Message par Anonyme »

merci, j'ai essayé de faire au plus simple, pour les cos/sin précalculé j'y ai pensé mais ca déconne lors des rotations, je vais voir ce qe je peut faire 8)
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message par Guimauve »

J'ai pas testé mais c'est dans la même logique que Dr.Dri pour la Rotation Rx, Ry et Rz.

Code : Tout sélectionner

Procedure MATRICE_ROTATE(*MATRICE.MATRIX4x4 , Rx.f, Ry.f, Rz.f)
  
  Protected SinRx.f, CosRx.f, SinRy.f, CosRy.f, SinRy.f, CosRz.f
  
  !FLD  dword [p.v_Rx]
  !FSINCOS
  !FSTP dword [p.v_CosRx]
  !FSTP dword [p.v_SinRx] 
  
  !FLD  dword [p.v_Ry]
  !FSINCOS
  !FSTP dword [p.v_CosRy]
  !FSTP dword [p.v_SinRy] 
  
  !FLD  dword [p.v_Rz]
  !FSINCOS
  !FSTP dword [p.v_CosRz]
  !FSTP dword [p.v_SinRz] 
  
  *MATRICE\_11 = CosRy * CosRz                                                       
  *MATRICE\_12 = SinRx * SinRy * CosRz - CosRx * SinRz   
  *MATRICE\_13 = CosRx * SinRy * CosRz + SinRx * SinRz   
  *MATRICE\_14 = 0                                       
  
  *MATRICE\_21 = CosRy * SinRz
  *MATRICE\_22 = CosRx * CosRz + SinRx * SinRy * SinRz
  *MATRICE\_23 = CosRx * SinRy * SinRz - SinRx * CosRz
  *MATRICE\_24 = 0
  
  *MATRICE\_31 = -SinRy
  *MATRICE\_32 = SinRx * CosRy
  *MATRICE\_33 = CosRx * CosRy
  *MATRICE\_34 = 0 
  
  *MATRICE\_41 = 0
  *MATRICE\_42 = 0
  *MATRICE\_43 = 0
  *MATRICE\_44 = 1
  
EndProcedure
P.S. Avec une table de valeur précalculé, c'est impossible d'avoir de la précision. À moins d'être hyper chanceux et de tomber toujours sur des valeurs entières pour les angles. Dès l'instant que l'on a besoin d'un angle du genre : 25.5° on a toujours +/- 0.5° d'erreur qui s'accumule.

A+
Guimauve
Répondre