Page 2 sur 3

Publié : mar. 24/avr./2007 21:34
par Anonyme
J'ai pas pu m'empécher ^^
voici une mouture de code qui t'aidera sans aucun doute :

Code : Tout sélectionner

Global SCREEN_W.l=800
Global SCREEN_H.l=600

;-STRUCT
Structure VECTOR3
  x.f : y.f : z.f
EndStructure

Structure MATRIX4x4
  _11.f : _21.f : _31.f : _41.f
  _12.f : _22.f : _32.f : _42.f 
  _13.f : _23.f : _33.f : _43.f 
  _14.f : _24.f : _34.f : _44.f 
EndStructure 

Structure FACES
  _A.l : _B.l : _C.l
  AB.l : BC.l : CA.l
EndStructure

Structure MESH
  *Sommets_List.l
  *Point3D_List.l
  *Point2D_List.l
  *Face_List.l
  Nbr_Vertice.l
  
  Position.VECTOR3
  Rotation.VECTOR3
  ScaleFactor.f
  
  Mat_Projection.MATRIX4x4
  Mat_Rotation.MATRIX4x4
  Mat_Translate.MATRIX4x4
  Mat_Scale.MATRIX4x4
  Mat_Identity.MATRIX4x4
  
  
EndStructure


Structure CAMERA
  Position.VECTOR3
  Rotation.VECTOR3
  
  Mat_Projection.MATRIX4x4
  Mat_Rotation.MATRIX4x4
  Mat_Translate.MATRIX4x4
  Mat_Scale.MATRIX4x4
  Mat_Identity.MATRIX4x4
EndStructure


Global NewList PipeLine.l()

;-MATRICES PROCS
Procedure MATRICE_ROTATE(*MATRICE.MATRIX4x4 , Xa.f,Ya.f,Za.f)
  *MATRICE\_11 = Cos(Za)*Cos(Ya)                             : *MATRICE\_21 = Sin(Za)*Cos(Ya)                              : *MATRICE\_31 = -Sin(Ya)        :  *MATRICE\_41 = 0
  *MATRICE\_12 = Cos(Za)*Sin(Ya)*Sin(Xa) - Sin(Za)*Cos(Xa)   : *MATRICE\_22 = Sin(Za)*Sin(Ya)*Sin(Xa) + Cos(Xa)*Cos(Za)    : *MATRICE\_32 = Sin(Xa)*Cos(Ya) :  *MATRICE\_42 = 0
  *MATRICE\_13 = Cos(Za)*Sin(Ya)*Cos(Xa) + Sin(Za)*Sin(Xa)   : *MATRICE\_23 = Sin(Za)*Sin(Ya)*Cos(Xa) - Cos(Za)*Sin(Xa)    : *MATRICE\_33 = Cos(Xa)*Cos(Ya) :  *MATRICE\_43 = 0
  *MATRICE\_14 = 0                                           : *MATRICE\_24 = 0                                            : *MATRICE\_34 = 0               :  *MATRICE\_44 = 1 
EndProcedure

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

Procedure MATRICE_ROTATE_Y(*MATRICE.MATRIX4x4,Angle.f)
  *MATRICE\_11 = Cos(Angle) : *MATRICE\_21 = 0          : *MATRICE\_31 = -Sin(Angle) : *MATRICE\_41 = 0
  *MATRICE\_12 = 0          : *MATRICE\_22 = 1          : *MATRICE\_32 = 0           : *MATRICE\_42 = 0
  *MATRICE\_13 = Sin(Angle) : *MATRICE\_23 = 0          : *MATRICE\_33 = Cos(Angle)  : *MATRICE\_43 = 0
  *MATRICE\_14 = 0          : *MATRICE\_24 = 0          : *MATRICE\_34 = 0           : *MATRICE\_44 = 1
EndProcedure

Procedure MATRICE_ROTATE_Z(*MATRICE.MATRIX4x4,Angle.f)
  *MATRICE\_11 = Cos(Angle) : *MATRICE\_21 = -Sin(Angle): *MATRICE\_31 = 0 : *MATRICE\_41 = 0
  *MATRICE\_12 = Sin(Angle) : *MATRICE\_22 = Cos(Angle) : *MATRICE\_32 = 0 : *MATRICE\_42 = 0
  *MATRICE\_13 = 0          : *MATRICE\_23 = 0          : *MATRICE\_33 = 1 : *MATRICE\_43 = 0
  *MATRICE\_14 = 0          : *MATRICE\_24 = 0          : *MATRICE\_34 = 0 : *MATRICE\_44 = 1
EndProcedure

Procedure MATRICE_SCALE(*MATRICE.MATRIX4x4,Factor.f)
  *MATRICE\_11 * Factor  
  *MATRICE\_22 * Factor 
  *MATRICE\_33 * Factor 
  *MATRICE\_44 * Factor 
EndProcedure  

Procedure MATRICE_SCALEXYZ(*MATRICE.MATRIX4x4,xFactor.f,yFactor.f,zFactor.f)
  *MATRICE\_11 * xFactor  
  *MATRICE\_22 * yFactor 
  *MATRICE\_33 * zFactor 
  *MATRICE\_44 * 1
EndProcedure  

Procedure MATRICE_TRANSLATE(*MATRICE.MATRIX4x4 , x.f,y.f,z.f)
  Global V.VECTOR3
  *MATRICE\_11 = 1 : *MATRICE\_21 = 0 : *MATRICE\_31 = 0 : *MATRICE\_41 =  x
  *MATRICE\_12 = 0 : *MATRICE\_22 = 1 : *MATRICE\_32 = 0 : *MATRICE\_42 =  y
  *MATRICE\_13 = 0 : *MATRICE\_23 = 0 : *MATRICE\_33 = 1 : *MATRICE\_43 =  z
  *MATRICE\_14 = 0 : *MATRICE\_24 = 0 : *MATRICE\_34 = 0 : *MATRICE\_44 = 1
  V\x=*MATRICE\_41
  V\y=*MATRICE\_42
  V\z=*MATRICE\_43
EndProcedure

Procedure MATRICE_MULTIPLY(*m1.MATRIX4x4,*m2.MATRIX4x4,*MatriceF.MATRIX4x4)
  *MatriceF\_11 = *m1\_11 * *m2\_11 + *m1\_12 * *m2\_21 + *m1\_13 * *m2\_31 + *m1\_14 * *m2\_41
  *MatriceF\_12 = *m1\_11 * *m2\_12 + *m1\_12 * *m2\_22 + *m1\_13 * *m2\_32 + *m1\_14 * *m2\_42
  *MatriceF\_13 = *m1\_11 * *m2\_13 + *m1\_12 * *m2\_23 + *m1\_13 * *m2\_33 + *m1\_14 * *m2\_43
  *MatriceF\_14 = *m1\_11 * *m2\_14 + *m1\_12 * *m2\_24 + *m1\_13 * *m2\_34 + *m1\_14 * *m2\_44
  
  *MatriceF\_21 = *m1\_21 * *m2\_11 + *m1\_22 * *m2\_21 + *m1\_23 * *m2\_31 + *m1\_24 * *m2\_41
  *MatriceF\_22 = *m1\_21 * *m2\_12 + *m1\_22 * *m2\_22 + *m1\_23 * *m2\_32 + *m1\_24 * *m2\_42
  *MatriceF\_23 = *m1\_21 * *m2\_13 + *m1\_22 * *m2\_23 + *m1\_23 * *m2\_33 + *m1\_24 * *m2\_43
  *MatriceF\_24 = *m1\_21 * *m2\_14 + *m1\_22 * *m2\_24 + *m1\_23 * *m2\_34 + *m1\_24 * *m2\_44
  
  *MatriceF\_31 = *m1\_31 * *m2\_11 + *m1\_32 * *m2\_21 + *m1\_33 * *m2\_31 + *m1\_34 * *m2\_41
  *MatriceF\_32 = *m1\_31 * *m2\_12 + *m1\_32 * *m2\_22 + *m1\_33 * *m2\_32 + *m1\_34 * *m2\_42
  *MatriceF\_33 = *m1\_31 * *m2\_13 + *m1\_32 * *m2\_23 + *m1\_33 * *m2\_33 + *m1\_34 * *m2\_43
  *MatriceF\_34 = *m1\_31 * *m2\_14 + *m1\_32 * *m2\_24 + *m1\_33 * *m2\_34 + *m1\_34 * *m2\_44
  
  *MatriceF\_41 = *m1\_41 * *m2\_11 + *m1\_42 * *m2\_21 + *m1\_43 * *m2\_31 + *m1\_44 * *m2\_41
  *MatriceF\_42 = *m1\_41 * *m2\_12 + *m1\_42 * *m2\_22 + *m1\_43 * *m2\_32 + *m1\_44 * *m2\_42
  *MatriceF\_43 = *m1\_41 * *m2\_13 + *m1\_42 * *m2\_23 + *m1\_43 * *m2\_33 + *m1\_44 * *m2\_43
  *MatriceF\_44 = *m1\_41 * *m2\_14 + *m1\_42 * *m2\_24 + *m1\_43 * *m2\_34 + *m1\_44 * *m2\_44
EndProcedure 

Procedure MATRICE_ADD(*m1.MATRIX4x4,*m2.MATRIX4x4)
  *m1\_11 = *m1\_11 + *m2\_11 
  *m1\_12 = *m1\_12 + *m2\_12 
  *m1\_13 = *m1\_13 + *m2\_13 
  *m1\_14 = *m1\_14 + *m2\_14 
                           
  *m1\_21 = *m1\_21 + *m2\_21 
  *m1\_22 = *m1\_22 + *m2\_22 
  *m1\_23 = *m1\_23 + *m2\_23 
  *m1\_24 = *m1\_24 + *m2\_24 
                             
  *m1\_31 = *m1\_31 + *m2\_31 
  *m1\_32 = *m1\_32 + *m2\_32 
  *m1\_33 = *m1\_33 + *m2\_33 
  *m1\_34 = *m1\_34 + *m2\_34 
                             
  *m1\_41 = *m1\_41 + *m2\_41 
  *m1\_42 = *m1\_42 + *m2\_42 
  *m1\_43 = *m1\_43 + *m2\_43 
  *m1\_44 = *m1\_44 + *m2\_44 
EndProcedure               

;-MESHS PROCS
Procedure CreateEmptyMesh()
  *Mesh.MESH = AllocateMemory(SizeOf(MESH))
  ProcedureReturn *Mesh
EndProcedure

Procedure AllocateVertex(*Mesh.MESH,Number)
  *Mesh\Sommets_List = AllocateMemory(SizeOf(VECTOR3)*Number+SizeOf(VECTOR3))
  *Mesh\Point3D_List = AllocateMemory(SizeOf(VECTOR3)*Number+SizeOf(VECTOR3))
  *Mesh\Point2D_List = AllocateMemory(SizeOf(POINT)*Number+SizeOf(POINT))
  *Mesh\Nbr_Vertice  = Number
EndProcedure

Procedure AllocateFace(*Mesh.MESH,Number)
  *Mesh\Face_List = AllocateMemory(SizeOf(FACES)*Number+SizeOf(FACES))
EndProcedure

Procedure SET_VERTEX(*Mesh.MESH,Vertex,x.f,y.f,z.f)
  PokeF( *Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+0),x)
  PokeF( *Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+4),y)
  PokeF( *Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+8),z)
EndProcedure   

Procedure.f GET_VERTEX(*Mesh.MESH,Vertex,Axis) 
  Select Axis
    Case 0 : ProcedureReturn PeekF(*Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+0))
    Case 1 : ProcedureReturn PeekF(*Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+4))
    Case 2 : ProcedureReturn PeekF(*Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+8))
  EndSelect                           
EndProcedure

Procedure SET_POINT2D(*Mesh.MESH,Vertex,x.f,y.f)
  If Vertex<=*Mesh\Nbr_Vertice
    PokeF(*Mesh\Point2D_List+(Vertex*8)+0,x)
    PokeF(*Mesh\Point2D_List+(Vertex*8)+4,y)
  EndIf 
EndProcedure  

Procedure.f GET_POINT2D(*Mesh.MESH,Vertex,Axis) 
  Select Axis
    Case 0 : ProcedureReturn PeekF(*Mesh\Point2D_List+((Vertex*8)+0))
    Case 1 : ProcedureReturn PeekF(*Mesh\Point2D_List+((Vertex*8)+4))
  EndSelect          
EndProcedure

Procedure SET_POINT3D(*Mesh.MESH,Vertex,x.f,y.f,z.f)
  If Vertex<=*Mesh\Nbr_Vertice
    PokeF(*Mesh\Point3D_List+(Vertex*SizeOf(VECTOR3))+0,x)
    PokeF(*Mesh\Point3D_List+(Vertex*SizeOf(VECTOR3))+4,y)
    PokeF(*Mesh\Point3D_List+(Vertex*SizeOf(VECTOR3))+8,z)
  EndIf 
EndProcedure  

Procedure.f GET_POINT3D(*Mesh.MESH,Vertex,Axis) 
  Select Axis
    Case 0 : ProcedureReturn PeekF(*Mesh\Point3D_List+((Vertex*SizeOf(VECTOR3))+0))
    Case 1 : ProcedureReturn PeekF(*Mesh\Point3D_List+((Vertex*SizeOf(VECTOR3))+4))
    Case 2 : ProcedureReturn PeekF(*Mesh\Point3D_List+((Vertex*SizeOf(VECTOR3))+8))
  EndSelect          
EndProcedure


Procedure VERTEX_EXIST(*Mesh.MESH,Vertex)
  If Vertex<=*Mesh\Nbr_Vertice
    ProcedureReturn 1
  Else
    ProcedureReturn -1
  EndIf
EndProcedure


Procedure MeshPosition(*Mesh.MESH,x.f,y.f,z.f)
  *Mesh\Position\x=x
  *Mesh\Position\y=y
  *Mesh\Position\z=z
EndProcedure

Procedure MeshRotation(*Mesh.MESH,x.f,y.f,z.f)
  *Mesh\Rotation\x=x
  *Mesh\Rotation\y=y
  *Mesh\Rotation\z=z
EndProcedure

Procedure Meshscale(*Mesh.MESH,Factor.f)
  *Mesh\ScaleFactor = Factor
EndProcedure


Procedure MeshProjection(*Mesh.MESH)
  
  AddElement(PipeLine())
  PipeLine() = *Mesh
  
  With *Mesh
    
    MATRICE_TRANSLATE(\Mat_Translate,\Position\x,\Position\y,\Position\z)
      MATRICE_ROTATE(\Mat_Rotation,\Rotation\x,\Rotation\y,\Rotation\z)
       MATRICE_SCALE(\Mat_Translate,\ScaleFactor)
          MATRICE_MULTIPLY(\Mat_Rotation,\Mat_Translate,\Mat_Projection)
    
   
       For Vx = 1 To \Nbr_Vertice
        
            VERTEXx.f = GET_VERTEX(*Mesh,Vx,0)
            VERTEXy.f = GET_VERTEX(*Mesh,Vx,1)
            VERTEXz.f = GET_VERTEX(*Mesh,Vx,2)
            
                POINT3Dx.f = \Mat_Projection\_11*VERTEXx + \Mat_Projection\_21*VERTEXy + \Mat_Projection\_31*VERTEXz + \Mat_Projection\_41
                POINT3Dy.f = \Mat_Projection\_12*VERTEXx + \Mat_Projection\_22*VERTEXy + \Mat_Projection\_32*VERTEXz + \Mat_Projection\_42
                POINT3Dz.f = \Mat_Projection\_13*VERTEXx + \Mat_Projection\_23*VERTEXy + \Mat_Projection\_33*VERTEXz + \Mat_Projection\_43
              
                SET_POINT3D(*Mesh,Vx,POINT3Dx,POINT3Dy,POINT3Dz)
      Next
      
        
    EndWith
EndProcedure


;-CAMERAS PROCS
Procedure CreateCam()
  *Cam.CAMERA = AllocateMemory(SizeOf(CAMERA))
  ProcedureReturn *Cam
EndProcedure

Procedure CameraRendering(*camera.CAMERA,FOV.f=0.00063)
  
  With *camera
    MATRICE_TRANSLATE(\Mat_Translate,\Position\x,\Position\y,\Position\z)
    MATRICE_ROTATE(\Mat_Rotation,\Rotation\x,\Rotation\y,\Rotation\z)
    MATRICE_MULTIPLY(\Mat_Translate,\Mat_Rotation,\Mat_Projection)
    
    
    
    
    ForEach PipeLine()
      
      *Mesh.MESH = PipeLine()
      
      For Vx = 1 To *Mesh\Nbr_Vertice
        
        POINT3Dx.f = GET_POINT3D(*Mesh,Vx,0) 
        POINT3Dy.f = GET_POINT3D(*Mesh,Vx,1) 
        POINT3Dz.f = GET_POINT3D(*Mesh,Vx,2) 
        
        POINT3Dx + \Mat_Projection\_11*POINT3Dx + \Mat_Projection\_21*POINT3Dy + \Mat_Projection\_31*POINT3Dz + \Mat_Projection\_41
        POINT3Dy + \Mat_Projection\_12*POINT3Dx + \Mat_Projection\_22*POINT3Dy + \Mat_Projection\_32*POINT3Dz + \Mat_Projection\_42
        POINT3Dz + \Mat_Projection\_13*POINT3Dx + \Mat_Projection\_23*POINT3Dy + \Mat_Projection\_33*POINT3Dz + \Mat_Projection\_43
                                                                                                 
        POINT2Dx.f=(POINT3Dx*955)/(POINT3Dz+1)+SCREEN_W/2
        POINT2Dy.f=(POINT3Dy*955)/(POINT3Dz+1)+SCREEN_H/2
        
        SET_POINT2D(*Mesh,Vx,POINT2Dx,POINT2Dy)
        SET_POINT3D(*Mesh,Vx,POINT3Dx,POINT3Dy,POINT3Dz)
        ; a étudier
        
        POINT2Dx=POINT3Dx/(POINT3Dz*FOV)+SCREEN_W/2
        POINT2Dy=POINT3Dy/(POINT3Dz*FOV)+SCREEN_H/2
        ;2D.X = 3D.X / (3D.Z * FOV)
        ;2D.Y = 3D.Y / (3D.Z * FOV) 
        
        If POINT2Dx>0 And POINT2Dx<SCREEN_W And POINT2Dy>0 And POINT2Dy<SCREEN_H
          Circle(POINT2Dx,POINT2Dy,2)
          ;DrawText(POINT2Dx-5,POINT2Dy-20,"Z="+StrF(POINT3Dz))
        EndIf
        
        
        
        
      Next 
      
      
      
      
      
    Next
  EndWith
  
  
  ClearList(PipeLine())
EndProcedure


Procedure CameraPosition(*camera.CAMERA,x.f,y.f,z.f)
  *camera\Position\x=x
  *camera\Position\y=y
  *camera\Position\z=z
EndProcedure

Procedure CameraRotation(*camera.CAMERA,x.f,y.f,z.f)
  *camera\Rotation\x+x
  *camera\Rotation\y+y
  *camera\Rotation\z+z
EndProcedure




;-EXEMPLE

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
  End
EndIf


OpenScreen(SCREEN_W,SCREEN_H,32,"")


; ******************************************
; CUBE
; ******************************************
Cube = CreateEmptyMesh()   ; Création d'un mesh vide

AllocateVertex(Cube,8) ; Allocation de 8 vertices

    ; On place nos vertices
    SET_VERTEX(Cube,1,-100,-100,100)
    SET_VERTEX(Cube,2,100,-100,100)
    SET_VERTEX(Cube,3,100,100,100)
    SET_VERTEX(Cube,4,-100,100,100)
    
    SET_VERTEX(Cube,5,-100,-100,-100)
    SET_VERTEX(Cube,6,100,-100,-100)
    SET_VERTEX(Cube,7,100,100,-100)
    SET_VERTEX(Cube,8,-100,100,-100)
  
    
; ******************************************
; SPHERE   ( thx comtois ;) )
; ******************************************
Sphere = CreateEmptyMesh()
    
Meridian=20
Parallel=20

AllocateVertex(Sphere,Meridian*Parallel+Parallel)
Vx=0

  
For i = 0 To Meridian
  
  theta.f =i*3.14159*2/(Meridian+1)
  ctheta.f=Cos(theta)
  stheta.f=Sin(theta) 
  
  For j = 1 To Parallel
    Vx+1
    Alpha.f =j*3.14159/(Parallel+1)
    calpha.f = Cos(Alpha)
    salpha.f = Sin(Alpha)
    
    SET_VERTEX(Sphere,Vx, salpha*ctheta,salpha*stheta,calpha)
    
  Next   
Next


Camera = CreateCam()

MeshPosition(Cube,0,0,-1000)


Repeat
  ExamineKeyboard() : ExamineMouse()
  ClearScreen(RGB(255,255,255))
 
  
  
  y.f + 0.01
  
  
  ; Meshs
  Meshscale(Cube,1)
    MeshPosition(Cube,-100,0,1000)
      MeshRotation(Cube,0,y,0)
        MeshProjection(Cube)
       
        
     Meshscale(Sphere,100)
       MeshPosition(Sphere,250,0,1000)
        MeshRotation(Sphere,0,y,0)
          MeshProjection(Sphere)

          
    ;Camera      
          CameraRotation(Camera,-MouseDeltaY()/1000,MouseDeltaX()/1000,0)
  
  
  
  StartDrawing(ScreenOutput())
   CameraRendering(Camera) ; Rendering
  StopDrawing()
  
  FlipBuffers() 
Until KeyboardPushed(#PB_Key_Escape)


Le code est long, mais il manque pas mal de chose, comme la gestion des faces et autres joyeustés :D

Donc pour faire simple :
se code est réutilisable ( les fonctions et structures ) je te laisse l'amelliorer :wink:

Ce pseudo moteur possède un "Pipeline" primaire qui regroupe tout les mesh passé en paramètre de la fonction MeshProjection()
ce pipeline est sous forme de liste chainée , ce pipeline est appelé lors du rendu avec l'appel de CameraRendering() , et ensuite ce pipeline est remis à zero en attente de nouveaux mesh à afficher.
Se pipeline ne gère pas le clipping , càd tout ce qui se trouve derrière la camera sera rendu quand meme, a toi de rajouté une condition basic lors de l'affichage du " Circle()" : if 3DZ>0 ou 3DZ<0 , comme tu veut...

Pour la théorie, tu remarqueras que chaque mesh possède ses propres matrices, rotation , translation,mise a l'échelle etc...
on calcul dans un premier temps les coordonées des vertices suivant ces matrices de transformation, ensuite on envois le mesh dans le pipeline.

La caméra quand à elle , récupère tout ce qui sort du pipeline, puis recalcule à nouveau les vertices dans l'espace 3D suivant ses propres matrices de transformations, et il n'y a plus qu'a convertir les vertices en coordonées 2D puis de les affichés à l'écran :wink:

Vouali :wink:

@++

Publié : mar. 24/avr./2007 22:07
par Anonyme
il y a qq erreurs de projections, je reglerais ca plus tard :?

Publié : mer. 25/avr./2007 6:38
par Thyphoon
c'est génial ... c'est de plus en plus claire pour moi ! Merci beaucoup
lolllllll c'est dommage que j'ai mon jeu en 2D a finir car j'aurais bien commencer un petit truc en 3D plus evolué. Mais bon je vais continuer a travailler sur mon planetarium ... voir si j'ai tout compris...

Merci beaucoup !

Publié : mer. 25/avr./2007 9:33
par tmyke
C'est carement l'embrillon d'un moteur 3D software ou je ne m'y connais pas... :wink:

Publié : mer. 25/avr./2007 10:07
par Backup
tmyke a écrit :C'est carement l'embrillon d'un moteur 3D software ou je ne m'y connais pas... :wink:
on sait bien que t'y connais rien ! :lol: :lol:

Publié : mer. 25/avr./2007 10:14
par Thyphoon
Une fois que j'aurais finit mon jeu "aliens" j'aimerais bien faire un "3D Construction Kit" j'en avais déjà parlé sur ce forum. ça permet de faire des jeux d'aventure en 3D simplement...si il y en a que ça intéresse on pourra faire ça a plusieurs :P

Publié : mer. 25/avr./2007 10:58
par tmyke
Dobro a écrit : on sait bien que t'y connais rien ! :lol: :lol:
Disons que c'est surtout une passion, et que quand on est passionnée, on apprend
plus vite. Mon regret est le manque de temps, jaurais bien aimé tripatouiller
le code avec Cpl.Bator et Typhoon :(
Thyphoon a écrit :Une fois que j'aurais finit mon jeu "aliens" j'aimerais bien faire un
"3D Construction Kit" j'en avais déjà parlé sur ce forum. ça permet de faire des jeux
d'aventure en 3D simplement...si il y en a que ça intéresse on pourra faire ça a plusieurs :P
Projet très ambitieux, mais possionnant, et a ne pas affronter seul. Tu as raisons de
demander des partennaires. Perso, je ne m'engagerais pas pour le moment, car DM3D me
prend tout mon temps dispo (qui n'est pas enorme en plus) , meme venir sur les forum
n'est pas toujours facile. Mais meme si c'est pas pour du code, pour le reste (conseils,
tuto divers, etc...) je suivrait cela avec beaucoups d'attention...
;)

Publié : mer. 25/avr./2007 11:04
par Progi1984
Et je ne pense pas que tu seras le seul !

Publié : mer. 25/avr./2007 17:28
par Anonyme
Voila, c'est corrigé :

Code : Tout sélectionner

Global SCREEN_W.l=800
Global SCREEN_H.l=600

;-STRUCT
Structure VECTOR3
  x.f : y.f : z.f
EndStructure

Structure MATRIX4x4
  _11.f : _21.f : _31.f : _41.f
  _12.f : _22.f : _32.f : _42.f 
  _13.f : _23.f : _33.f : _43.f 
  _14.f : _24.f : _34.f : _44.f 
EndStructure 

Structure FACES
  _A.l : _B.l : _C.l
  AB.l : BC.l : CA.l
EndStructure

Structure MESH
  *Sommets_List.l
  *Point3D_List.l
  *Point2D_List.l
  *Face_List.l
  Nbr_Vertice.l
  
  Position.VECTOR3
  Rotation.VECTOR3
  ScaleFactor.f
  
  Mat_Projection.MATRIX4x4
  Mat_Rotation.MATRIX4x4
  Mat_Translate.MATRIX4x4
  Mat_Scale.MATRIX4x4
  Mat_Identity.MATRIX4x4
  
  
EndStructure


Structure CAMERA
  Position.VECTOR3
  LookAT.VECTOR3
  Rotation.VECTOR3
  Pitch.f
  Yaw.f
  Roll.f
  
  
  
  Mat_Projection.MATRIX4x4
  Mat_Rotation.MATRIX4x4
  Mat_Translate.MATRIX4x4
  Mat_Scale.MATRIX4x4
  Mat_Identity.MATRIX4x4
  
  
EndStructure


Global NewList PipeLine.l()


Procedure Distance(x1,y1,z1,x2,y2,z2)
  Protected Result.f
  Result = Sqr(  (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2) )
  ProcedureReturn Result
EndProcedure



;-MATRICES PROCS

Procedure MATRICE_INDENTITY(*MATRICE.MATRIX4x4)
  *MATRICE\_11 = 1 : *MATRICE\_21 = 0          : *MATRICE\_31 = 0           : *MATRICE\_41 = 0
  *MATRICE\_12 = 0 : *MATRICE\_22 = 1          : *MATRICE\_32 = 0           : *MATRICE\_42 = 0
  *MATRICE\_13 = 0 : *MATRICE\_23 = 0          : *MATRICE\_33 = 1           : *MATRICE\_43 = 0
  *MATRICE\_14 = 0 : *MATRICE\_24 = 0          : *MATRICE\_34 = 0           : *MATRICE\_44 = 1
  
  ; *MATRICE\_11 = 1
  ; *MATRICE\_22 = 1
  ; *MATRICE\_33 = 1
  ; *MATRICE\_44 = 1
  
EndProcedure

Procedure MATRICE_ROTATE(*MATRICE.MATRIX4x4 , Xa.f,Ya.f,Za.f)
  *MATRICE\_11 = Cos(Za)*Cos(Ya)                             : *MATRICE\_21 = Sin(Za)*Cos(Ya)                              : *MATRICE\_31 = -Sin(Ya)        :  *MATRICE\_41 = 0
  *MATRICE\_12 = Cos(Za)*Sin(Ya)*Sin(Xa) - Sin(Za)*Cos(Xa)   : *MATRICE\_22 = Sin(Za)*Sin(Ya)*Sin(Xa) + Cos(Xa)*Cos(Za)    : *MATRICE\_32 = Sin(Xa)*Cos(Ya) :  *MATRICE\_42 = 0
  *MATRICE\_13 = Cos(Za)*Sin(Ya)*Cos(Xa) + Sin(Za)*Sin(Xa)   : *MATRICE\_23 = Sin(Za)*Sin(Ya)*Cos(Xa) - Cos(Za)*Sin(Xa)    : *MATRICE\_33 = Cos(Xa)*Cos(Ya) :  *MATRICE\_43 = 0
  *MATRICE\_14 = 0                                           : *MATRICE\_24 = 0                                            : *MATRICE\_34 = 0               :  *MATRICE\_44 = 1 
EndProcedure

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

Procedure MATRICE_ROTATE_Y(*MATRICE.MATRIX4x4,Angle.f)
  *MATRICE\_11 = Cos(Angle) : *MATRICE\_21 = 0          : *MATRICE\_31 = -Sin(Angle) : *MATRICE\_41 = 0
  *MATRICE\_12 = 0          : *MATRICE\_22 = 1          : *MATRICE\_32 = 0           : *MATRICE\_42 = 0
  *MATRICE\_13 = Sin(Angle) : *MATRICE\_23 = 0          : *MATRICE\_33 = Cos(Angle)  : *MATRICE\_43 = 0
  *MATRICE\_14 = 0          : *MATRICE\_24 = 0          : *MATRICE\_34 = 0           : *MATRICE\_44 = 1
EndProcedure

Procedure MATRICE_ROTATE_Z(*MATRICE.MATRIX4x4,Angle.f)
  *MATRICE\_11 = Cos(Angle) : *MATRICE\_21 = -Sin(Angle): *MATRICE\_31 = 0 : *MATRICE\_41 = 0
  *MATRICE\_12 = Sin(Angle) : *MATRICE\_22 = Cos(Angle) : *MATRICE\_32 = 0 : *MATRICE\_42 = 0
  *MATRICE\_13 = 0          : *MATRICE\_23 = 0          : *MATRICE\_33 = 1 : *MATRICE\_43 = 0
  *MATRICE\_14 = 0          : *MATRICE\_24 = 0          : *MATRICE\_34 = 0 : *MATRICE\_44 = 1
EndProcedure

Procedure MATRICE_SCALE(*MATRICE.MATRIX4x4,Factor.f)
  *MATRICE\_11 * Factor  
  *MATRICE\_22 * Factor 
  *MATRICE\_33 * Factor 
  *MATRICE\_44 * Factor 
EndProcedure  

Procedure MATRICE_SCALEXYZ(*MATRICE.MATRIX4x4,xFactor.f,yFactor.f,zFactor.f)
  *MATRICE\_11 * xFactor  
  *MATRICE\_22 * yFactor 
  *MATRICE\_33 * zFactor 
  *MATRICE\_44 * 1
EndProcedure  

Procedure MATRICE_TRANSLATE(*MATRICE.MATRIX4x4 , x.f,y.f,z.f)
  Global V.VECTOR3
  *MATRICE\_11 = 1 : *MATRICE\_21 = 0 : *MATRICE\_31 = 0 : *MATRICE\_41 =  x
  *MATRICE\_12 = 0 : *MATRICE\_22 = 1 : *MATRICE\_32 = 0 : *MATRICE\_42 =  y
  *MATRICE\_13 = 0 : *MATRICE\_23 = 0 : *MATRICE\_33 = 1 : *MATRICE\_43 =  z
  *MATRICE\_14 = 0 : *MATRICE\_24 = 0 : *MATRICE\_34 = 0 : *MATRICE\_44 = 1
  V\x=*MATRICE\_41
  V\y=*MATRICE\_42
  V\z=*MATRICE\_43
EndProcedure

Procedure MATRICE_MULTIPLY(*m1.MATRIX4x4,*m2.MATRIX4x4,*MatriceF.MATRIX4x4)
  *MatriceF\_11 = *m1\_11 * *m2\_11 + *m1\_12 * *m2\_21 + *m1\_13 * *m2\_31 + *m1\_14 * *m2\_41
  *MatriceF\_12 = *m1\_11 * *m2\_12 + *m1\_12 * *m2\_22 + *m1\_13 * *m2\_32 + *m1\_14 * *m2\_42
  *MatriceF\_13 = *m1\_11 * *m2\_13 + *m1\_12 * *m2\_23 + *m1\_13 * *m2\_33 + *m1\_14 * *m2\_43
  *MatriceF\_14 = *m1\_11 * *m2\_14 + *m1\_12 * *m2\_24 + *m1\_13 * *m2\_34 + *m1\_14 * *m2\_44
  
  *MatriceF\_21 = *m1\_21 * *m2\_11 + *m1\_22 * *m2\_21 + *m1\_23 * *m2\_31 + *m1\_24 * *m2\_41
  *MatriceF\_22 = *m1\_21 * *m2\_12 + *m1\_22 * *m2\_22 + *m1\_23 * *m2\_32 + *m1\_24 * *m2\_42
  *MatriceF\_23 = *m1\_21 * *m2\_13 + *m1\_22 * *m2\_23 + *m1\_23 * *m2\_33 + *m1\_24 * *m2\_43
  *MatriceF\_24 = *m1\_21 * *m2\_14 + *m1\_22 * *m2\_24 + *m1\_23 * *m2\_34 + *m1\_24 * *m2\_44
  
  *MatriceF\_31 = *m1\_31 * *m2\_11 + *m1\_32 * *m2\_21 + *m1\_33 * *m2\_31 + *m1\_34 * *m2\_41
  *MatriceF\_32 = *m1\_31 * *m2\_12 + *m1\_32 * *m2\_22 + *m1\_33 * *m2\_32 + *m1\_34 * *m2\_42
  *MatriceF\_33 = *m1\_31 * *m2\_13 + *m1\_32 * *m2\_23 + *m1\_33 * *m2\_33 + *m1\_34 * *m2\_43
  *MatriceF\_34 = *m1\_31 * *m2\_14 + *m1\_32 * *m2\_24 + *m1\_33 * *m2\_34 + *m1\_34 * *m2\_44
  
  *MatriceF\_41 = *m1\_41 * *m2\_11 + *m1\_42 * *m2\_21 + *m1\_43 * *m2\_31 + *m1\_44 * *m2\_41
  *MatriceF\_42 = *m1\_41 * *m2\_12 + *m1\_42 * *m2\_22 + *m1\_43 * *m2\_32 + *m1\_44 * *m2\_42
  *MatriceF\_43 = *m1\_41 * *m2\_13 + *m1\_42 * *m2\_23 + *m1\_43 * *m2\_33 + *m1\_44 * *m2\_43
  *MatriceF\_44 = *m1\_41 * *m2\_14 + *m1\_42 * *m2\_24 + *m1\_43 * *m2\_34 + *m1\_44 * *m2\_44
EndProcedure 

Procedure MATRICE_ADD(*m1.MATRIX4x4,*m2.MATRIX4x4)
  *m1\_11 = *m1\_11 + *m2\_11 
  *m1\_12 = *m1\_12 + *m2\_12 
  *m1\_13 = *m1\_13 + *m2\_13 
  *m1\_14 = *m1\_14 + *m2\_14 
                           
  *m1\_21 = *m1\_21 + *m2\_21 
  *m1\_22 = *m1\_22 + *m2\_22 
  *m1\_23 = *m1\_23 + *m2\_23 
  *m1\_24 = *m1\_24 + *m2\_24 
                             
  *m1\_31 = *m1\_31 + *m2\_31 
  *m1\_32 = *m1\_32 + *m2\_32 
  *m1\_33 = *m1\_33 + *m2\_33 
  *m1\_34 = *m1\_34 + *m2\_34 
                             
  *m1\_41 = *m1\_41 + *m2\_41 
  *m1\_42 = *m1\_42 + *m2\_42 
  *m1\_43 = *m1\_43 + *m2\_43 
  *m1\_44 = *m1\_44 + *m2\_44 
EndProcedure               

;-MESHS PROCS
Procedure CreateEmptyMesh()
  *Mesh.MESH = AllocateMemory(SizeOf(MESH))
  ProcedureReturn *Mesh
EndProcedure

Procedure AllocateVertex(*Mesh.MESH,Number)
  *Mesh\Sommets_List = AllocateMemory(SizeOf(VECTOR3)*Number+SizeOf(VECTOR3))
  *Mesh\Point3D_List = AllocateMemory(SizeOf(VECTOR3)*Number+SizeOf(VECTOR3))
  *Mesh\Point2D_List = AllocateMemory(SizeOf(POINT)*Number+SizeOf(POINT))
  *Mesh\Nbr_Vertice  = Number
EndProcedure

Procedure AllocateFace(*Mesh.MESH,Number)
  *Mesh\Face_List = AllocateMemory(SizeOf(FACES)*Number+SizeOf(FACES))
EndProcedure

Procedure MeshCopy(*Mesh.MESH)
  *Cpy.MESH = AllocateMemory(SizeOf(MESH))
  
  *Cpy\Sommets_List = AllocateMemory(SizeOf(VECTOR3)**Mesh\Nbr_Vertice+SizeOf(VECTOR3))
  *Cpy\Point3D_List = AllocateMemory(SizeOf(VECTOR3)**Mesh\Nbr_Vertice+SizeOf(VECTOR3))
  *Cpy\Point2D_List = AllocateMemory(SizeOf(POINT)**Mesh\Nbr_Vertice+SizeOf(POINT))
  
  CopyMemory(*Mesh\Sommets_List,*Cpy\Sommets_List,MemorySize(*Mesh\Sommets_List))
  CopyMemory(*Mesh\Point3D_List,*Cpy\Point3D_List,MemorySize(*Mesh\Point3D_List))
  CopyMemory(*Mesh\Point2D_List,*Cpy\Point2D_List,MemorySize(*Mesh\Point2D_List))
  *Cpy\Nbr_Vertice  = *Mesh\Nbr_Vertice
  ProcedureReturn *Cpy 
EndProcedure

Procedure SET_VERTEX(*Mesh.MESH,Vertex,x.f,y.f,z.f)
  PokeF( *Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+0),x)
  PokeF( *Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+4),y)
  PokeF( *Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+8),z)
EndProcedure   

Procedure.f GET_VERTEX(*Mesh.MESH,Vertex,Axis) 
  Select Axis
    Case 0 : ProcedureReturn PeekF(*Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+0))
    Case 1 : ProcedureReturn PeekF(*Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+4))
    Case 2 : ProcedureReturn PeekF(*Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+8))
  EndSelect                           
EndProcedure

Procedure SET_POINT2D(*Mesh.MESH,Vertex,x.f,y.f)
  If Vertex<=*Mesh\Nbr_Vertice
    PokeF(*Mesh\Point2D_List+(Vertex*8)+0,x)
    PokeF(*Mesh\Point2D_List+(Vertex*8)+4,y)
  EndIf 
EndProcedure  

Procedure.f GET_POINT2D(*Mesh.MESH,Vertex,Axis) 
  Select Axis
    Case 0 : ProcedureReturn PeekF(*Mesh\Point2D_List+((Vertex*8)+0))
    Case 1 : ProcedureReturn PeekF(*Mesh\Point2D_List+((Vertex*8)+4))
  EndSelect          
EndProcedure

Procedure SET_POINT3D(*Mesh.MESH,Vertex,x.f,y.f,z.f)
  If Vertex<=*Mesh\Nbr_Vertice
    PokeF(*Mesh\Point3D_List+(Vertex*SizeOf(VECTOR3))+0,x)
    PokeF(*Mesh\Point3D_List+(Vertex*SizeOf(VECTOR3))+4,y)
    PokeF(*Mesh\Point3D_List+(Vertex*SizeOf(VECTOR3))+8,z)
  EndIf 
EndProcedure  

Procedure SET_SOMMET(*Mesh.MESH,Vertex,x.f,y.f,z.f)
  If Vertex<=*Mesh\Nbr_Vertice
    PokeF(*Mesh\Sommets_List+(Vertex*SizeOf(VECTOR3))+0,x)
    PokeF(*Mesh\Sommets_List+(Vertex*SizeOf(VECTOR3))+4,y)
    PokeF(*Mesh\Sommets_List+(Vertex*SizeOf(VECTOR3))+8,z)
  EndIf 
EndProcedure 

Procedure.f GET_SOMMET(*Mesh.MESH,Vertex,Axis) 
  Select Axis
    Case 0 : ProcedureReturn PeekF(*Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+0))
    Case 1 : ProcedureReturn PeekF(*Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+4))
    Case 2 : ProcedureReturn PeekF(*Mesh\Sommets_List+((Vertex*SizeOf(VECTOR3))+8))
  EndSelect          
EndProcedure

Procedure.f GET_POINT3D(*Mesh.MESH,Vertex,Axis) 
  Select Axis
    Case 0 : ProcedureReturn PeekF(*Mesh\Point3D_List+((Vertex*SizeOf(VECTOR3))+0))
    Case 1 : ProcedureReturn PeekF(*Mesh\Point3D_List+((Vertex*SizeOf(VECTOR3))+4))
    Case 2 : ProcedureReturn PeekF(*Mesh\Point3D_List+((Vertex*SizeOf(VECTOR3))+8))
  EndSelect          
EndProcedure


Procedure VERTEX_EXIST(*Mesh.MESH,Vertex)
  If Vertex<=*Mesh\Nbr_Vertice
    ProcedureReturn 1
  Else
    ProcedureReturn -1
  EndIf
EndProcedure


Procedure MeshPosition(*Mesh.MESH,x.f,y.f,z.f)
  *Mesh\Position\x=x
  *Mesh\Position\y=y
  *Mesh\Position\z=z
EndProcedure

Procedure MeshRotation(*Mesh.MESH,x.f,y.f,z.f)
  *Mesh\Rotation\x=x
  *Mesh\Rotation\y=y
  *Mesh\Rotation\z=z
EndProcedure

Procedure Meshscale(*Mesh.MESH,Factor.f)
  *Mesh\ScaleFactor = Factor
EndProcedure


Procedure MeshProjection(*Mesh.MESH)
  
  AddElement(PipeLine())
  PipeLine() = *Mesh
  
  With *Mesh
     
    MATRICE_INDENTITY(\Mat_Projection)
    MATRICE_INDENTITY(\Mat_Translate)
    MATRICE_INDENTITY(\Mat_Rotation)
    
    MATRICE_TRANSLATE(\Mat_Translate,\Position\x,\Position\y,\Position\z)
    MATRICE_ROTATE(\Mat_Rotation,\Rotation\x,\Rotation\y,\Rotation\z)
    MATRICE_SCALE(\Mat_Translate,\ScaleFactor)
    MATRICE_MULTIPLY(\Mat_Rotation,\Mat_Translate,\Mat_Projection)
    
   
       For Vx = 1 To \Nbr_Vertice
        
             VERTEXx.f = GET_SOMMET(*Mesh,Vx,0)
             VERTEXy.f = GET_SOMMET(*Mesh,Vx,1)
             VERTEXz.f = GET_SOMMET(*Mesh,Vx,2)
                         
             POINT3Dx.f = \Mat_Projection\_11*VERTEXx + \Mat_Projection\_21*VERTEXy + \Mat_Projection\_31*VERTEXz + \Mat_Projection\_41
             POINT3Dy.f = \Mat_Projection\_12*VERTEXx + \Mat_Projection\_22*VERTEXy + \Mat_Projection\_32*VERTEXz + \Mat_Projection\_42
             POINT3Dz.f = \Mat_Projection\_13*VERTEXx + \Mat_Projection\_23*VERTEXy + \Mat_Projection\_33*VERTEXz + \Mat_Projection\_43
              
             SET_POINT3D(*Mesh,Vx,POINT3Dx,POINT3Dy,POINT3Dz)
      Next
      
        
    EndWith
EndProcedure

;- MESH PREFABS
Procedure CreateCube(Size.f)
  ; ******************************************
  ; CUBE
  ; ****************************************** 
  
  *Temp = CreateEmptyMesh()   ; Création d'un mesh vide
  
  AllocateVertex(*Temp,8) ; Allocation de 8 vertices
  
  ; On place nos vertices
  SET_VERTEX(*Temp,1,-Size,-Size,Size)
  SET_VERTEX(*Temp,2,Size,-Size,Size)
  SET_VERTEX(*Temp,3,Size,Size,Size)
  SET_VERTEX(*Temp,4,-Size,Size,Size)
  
  SET_VERTEX(*Temp,5,-Size,-Size,-Size)
  SET_VERTEX(*Temp,6,Size,-Size,-Size)
  SET_VERTEX(*Temp,7,Size,Size,-Size)
  SET_VERTEX(*Temp,8,-Size,Size,-Size)
  ProcedureReturn *Temp
EndProcedure



Procedure CreateSphere(Meridian,Parallel)
  ; ******************************************
  ; SPHERE   ( thx comtois ;) )
  ; ******************************************
  
  *Temp = CreateEmptyMesh()
  
  
  AllocateVertex(*Temp,Meridian*Parallel+Parallel)
  Vx=0
  
  
  For i = 0 To Meridian
    
    theta.f =i*3.14159*2/(Meridian+1)
    ctheta.f=Cos(theta)
    stheta.f=Sin(theta) 
    
    For j = 1 To Parallel
      Vx+1
      Alpha.f =j*3.14159/(Parallel+1)
      calpha.f = Cos(Alpha)
      salpha.f = Sin(Alpha)
      
      SET_VERTEX(*Temp,Vx, salpha*ctheta,salpha*stheta,calpha)
      
    Next   
  Next
  
  ProcedureReturn *Temp
EndProcedure






;-CAMERAS PROCS
Procedure CreateCam()
  *Cam.CAMERA = AllocateMemory(SizeOf(CAMERA))
  ProcedureReturn *Cam
EndProcedure

Procedure CameraRendering(*camera.CAMERA)
  
  With *camera
    MATRICE_INDENTITY(\Mat_Projection)
    MATRICE_INDENTITY(\Mat_Translate)
    MATRICE_INDENTITY(\Mat_Rotation)
    
    MATRICE_TRANSLATE(\Mat_Translate,\Position\x,\Position\y,\Position\z)
    MATRICE_ROTATE(\Mat_Rotation,\Rotation\x,\Rotation\y,\Rotation\z)
    MATRICE_SCALE(\Mat_Translate,1)
    MATRICE_MULTIPLY(\Mat_Translate,\Mat_Rotation,\Mat_Projection)
    
    
    
    
    ForEach PipeLine()
      
      *Mesh.MESH = PipeLine()
      
      For Vx = 1 To *Mesh\Nbr_Vertice
        

        VX3Dx.f = GET_POINT3D(*Mesh,Vx,0)
        VX3Dy.f = GET_POINT3D(*Mesh,Vx,1)
        VX3Dz.f = GET_POINT3D(*Mesh,Vx,2)
                   
        POINT3Dx.f = \Mat_Projection\_11*VX3Dx + \Mat_Projection\_21*VX3Dy + \Mat_Projection\_31*VX3Dz + \Mat_Projection\_41
        POINT3Dy.f = \Mat_Projection\_12*VX3Dx + \Mat_Projection\_22*VX3Dy + \Mat_Projection\_32*VX3Dz + \Mat_Projection\_42
        POINT3Dz.f = \Mat_Projection\_13*VX3Dx + \Mat_Projection\_23*VX3Dy + \Mat_Projection\_33*VX3Dz + \Mat_Projection\_43
                                                                                                 
        POINT2Dx.f=(POINT3Dx*555)/(POINT3Dz+15)+SCREEN_W/2
        POINT2Dy.f=(POINT3Dy*555)/(POINT3Dz+15)+SCREEN_H/2
      
       
    
        If POINT2Dx>0 And POINT2Dx<SCREEN_W And POINT2Dy>0 And POINT2Dy<SCREEN_H And POINT3Dz>-15
          Circle(POINT2Dx,POINT2Dy,1,RGB(64,128,255))
          ;DrawText(POINT2Dx-5,POINT2Dy-20,"Z="+StrF(POINT3Dz))
        EndIf
        
        SET_POINT2D(*Mesh,Vx,POINT2Dx,POINT2Dy)
        SET_POINT3D(*Mesh,Vx,POINT3Dx,POINT3Dy,POINT3Dz)
        
        
        
      Next 
      
   
    Next
  EndWith
  
  
  ClearList(PipeLine())
EndProcedure

Procedure Free_Camera(*camera.CAMERA)
  
  *camera\Pitch = *camera\Pitch - MouseDeltaY()/1000
  *camera\Yaw   = *camera\Yaw   - MouseDeltaX()/1000
  
  *camera\LookAT\x = *camera\Position\x + (KeyboardPushed(#PB_Key_Up)-KeyboardPushed(#PB_Key_Down))/10 * Cos((*camera\Yaw))
  *camera\LookAT\z = *camera\Position\z + (KeyboardPushed(#PB_Key_Up)-KeyboardPushed(#PB_Key_Down))/10 * Sin((*camera\Yaw))
  *camera\LookAT\y = *camera\Position\y + (KeyboardPushed(#PB_Key_Up)-KeyboardPushed(#PB_Key_Down))/10 * Sin((*camera\Pitch))
  
  *camera\Position\x = *camera\LookAT\x + (KeyboardPushed(#PB_Key_Up)-KeyboardPushed(#PB_Key_Down))/10 * Cos((*camera\Yaw))
  *camera\Position\z = *camera\LookAT\z + (KeyboardPushed(#PB_Key_Up)-KeyboardPushed(#PB_Key_Down))/10 * Sin((*camera\Yaw))
  *camera\Position\y = *camera\LookAT\y + (KeyboardPushed(#PB_Key_Up)-KeyboardPushed(#PB_Key_Down))/10 * Sin((*camera\Pitch))
  

  
  *camera\Rotation\x= *camera\Pitch+(#PI/180)
  *camera\Rotation\y=-*camera\Yaw+(270*#PI/180)
  *camera\Rotation\z= *camera\Roll  ; GLIMBAL LOCK   :(
  
EndProcedure

Procedure GetCameraPos(*camera.CAMERA,Axis)
  Select Axis
    Case 0 : ProcedureReturn  *camera\Position\x 
    Case 1 : ProcedureReturn  *camera\Position\y
    Case 2 : ProcedureReturn  *camera\Position\z  
  EndSelect                   
EndProcedure                 

Procedure GetCameraRot(*camera.CAMERA,Axis)
  Select Axis
    Case 0 : ProcedureReturn  *camera\Rotation\x*180/#PI
    Case 1 : ProcedureReturn  *camera\Rotation\y*180/#PI
    Case 2 : ProcedureReturn  *camera\Rotation\z*180/#PI
  EndSelect                   
EndProcedure                 


Procedure GetCameraLookAt(*camera.CAMERA,Axis)
  Select Axis
    Case 0 : ProcedureReturn  *camera\LookAT\x;*180/#PI
    Case 1 : ProcedureReturn  *camera\LookAT\y;*180/#PI
    Case 2 : ProcedureReturn  *camera\LookAT\z;*180/#PI
  EndSelect                   
EndProcedure    




Procedure CameraPosition(*camera.CAMERA,x.f,y.f,z.f)
  *camera\Position\x=x
  *camera\Position\y=y
  *camera\Position\z=z
EndProcedure






;-EXEMPLE

If InitSprite() = 0 Or InitKeyboard() = 0 Or InitMouse() = 0 Or InitSound() = 0
  End
EndIf

OpenScreen(SCREEN_W,SCREEN_H,32,"")

#sphere=10

Global Dim Sphere(#sphere,#sphere)

For z = 1 To #sphere
  For x = 1 To #sphere
    Sphere(x,z) = CreateSphere(10,10)
    MeshPosition(Sphere(x,z),x*500,0,z*500)
    Meshscale(Sphere(x,z),100)
  Next
Next

Camera = CreateCam()

CameraPosition(Camera,-8700,1100,-2600)


Repeat
  ExamineKeyboard() : ExamineMouse()
  ClearScreen(RGB(255,255,255))
 
  

  ; Meshs
    Ang.f=ElapsedMilliseconds()/1000
    For z = 1 To #sphere
      For x = 1 To #sphere
        MeshRotation(Sphere(x,z),Ang,Ang,0)
        MeshProjection(Sphere(x,z))
      Next
    Next
      
          
  ;Camera  
  Free_Camera(Camera)
  
  StartDrawing(ScreenOutput())
  CameraRendering(Camera) ; Rendering
  
  DrawText(10,10,"CAMERA POS X : " +Str(GetCameraPos(Camera,0)))
  DrawText(10,30,"CAMERA POS Y : " +Str(GetCameraPos(Camera,1)))
  DrawText(10,50,"CAMERA POS Z : " +Str(GetCameraPos(Camera,2)))
  
  DrawText(10,70, "CAMERA ROT X : " +Str(GetCameraRot(Camera,0)))
  DrawText(10,90, "CAMERA ROT Y : " +Str(GetCameraRot(Camera,1)))
  DrawText(10,110,"CAMERA ROT Z : " +Str(GetCameraRot(Camera,2)))
  

      
  
  StopDrawing()
  
  FlipBuffers() 
Until KeyboardPushed(#PB_Key_Escape)


j'ai rajouté le clipping primaire lors du rendu ( if 3DZ>0 ) :wink:

Publié : mer. 25/avr./2007 17:52
par Thyphoon
c'est vraiment exelent !!
faut que je regarde de plus prêt !
d'ailleur une question de noobs que je me pose..lorsqu'on utilise le GPU pour le rendu..les calculs de matrice c'est toujours fait par le CPU ou part le GPU ?

Publié : mer. 25/avr./2007 17:58
par Anonyme
ici, tout est software, je ne balance rien à la carte graphique directement, seul flipbuffers() le fait, attention tout de même , ca bouffe pas mal de ressources cpu ^^ , mais déjà avec cette base de moteur tu peut facilement rajouté une couche opengl dessus et faire la concurence à dreamotion3D :D

Publié : mer. 25/avr./2007 18:09
par Thyphoon
oui j'avais compris que tout ici était software. Mais ma question est juste est ce que les calcules de matrice reste toujours pour le CPU ou bien les cartes graphiques peuvent aussi s'en occupé !

En tout cas pour moi c'est géant car je comprend beaucoup mieu le fonctionnement d'un moteur 3D... :)

Publié : mer. 25/avr./2007 18:13
par Anonyme
Arf excuse moi, j'ai lu en diagonale ta question :?
logiquement oui, quand tu programme en directx ou en opengl, les calculs matricielles se font via l'api graphique, donc j'en déduis que oui ^^
mais le software , y a que ca de vrai ^^ , si je veut faire de la 3D sous dx j'utilise Drea3D , pour le challenge, je code tout à zero ^^

Publié : mer. 25/avr./2007 18:37
par Thyphoon
Moi ce que j'aime de coder depuis zero c'est que tu maitrise tout et que c'est portable. Apres je suis d'accord c'est plus lent.
D'ailleur une question y a t'il une façon générique de parler a la carte graphique ? y a t'il une adresse mémoire bien précise ou lui donne les infos ou bien dans tout les cas on est obligé de passé part le driver et les API system quelques soit le system ?

Publié : mer. 25/avr./2007 18:42
par Anonyme
en fait, de mon point de vue, chaque carte gfx est différente au niveau de l'architecture électronique, et Dx et opgl fait le tri et envois le tout aux bonnes adresses, cela doit être possible en asm je pense, mais ce qui est valable pour une carte ne l'est pas forcement pour l'autre, si tu veut tirer profit d'une carte gfx, mieux vaut passé par une api et ne pas réinventé la roue pour toutes les cartes existantes :P