Page 2 sur 4
Publié : ven. 11/mai/2007 21:14
par Gratteur
De rien, le fait que ça vous interesse me fait plaisir, autant partager

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 :

Publié : ven. 11/mai/2007 22:45
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.
Publié : sam. 12/mai/2007 0:37
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

Publié : sam. 12/mai/2007 7:37
par Backup
Frenchy Pilou a écrit :Je ne sais si on vole dans l'espace, on plane plutôt

pareil! pour planer il faut de l'air !
je parlerai plutot de "dérive"

Publié : sam. 12/mai/2007 9:47
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
Publié : sam. 12/mai/2007 22:16
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°
@++

Publié : sam. 12/mai/2007 23:04
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
Publié : dim. 13/mai/2007 0:18
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 ^^
Publié : dim. 13/mai/2007 1:20
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

Publié : dim. 13/mai/2007 9:21
par Anonyme
Merki Mr.Dri

Publié : dim. 13/mai/2007 9:59
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

Publié : dim. 13/mai/2007 10:06
par Anonyme
File:1->
Moteur3D_Software.rar
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)
@++
Publié : dim. 13/mai/2007 11:24
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.
Publié : dim. 13/mai/2007 11:35
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

Publié : dim. 13/mai/2007 11:58
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