Code : Tout sélectionner
InitSprite() : InitKeyboard()
OpenScreen(640,480,32,"")
#Xoff = 320
#Yoff = 240
#Zoff = 1500
; Structure de notre monde 3D, on represente les points3D la dedans.
Structure WORLD3D
x.f
y.f
z.f
WaveHeight_A.f
WaveHeight_B.f
EndStructure
Structure MATRIX4
_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 VECTOR3
x.f:y.f:z.f
EndStructure
Structure CAMERA
Position.VECTOR3
LookAT.VECTOR3
Rotation.VECTOR3
Pitch.f
Yaw.f
Roll.f
EndStructure
Global Dim Map3D.WORLD3D(100,100)
Global Dim Map2D.WORLD3D(100,100)
Global Dim Sommet.WORLD3D(100,100)
Global Matrice_Rotation.MATRIX4 ; Notre matrice de rotation
Global Matrice_Translation.MATRIX4 ; Notre matrice de Translation
Global Matrice_Finale.MATRIX4 ; Matrice finale
; NOTRE CAMERA
Global Camera.CAMERA
Camera\Position\x=-50000
Camera\Position\y=7000
Camera\Position\z=-50000
; Initialisation de notre map 3D
For z = 0 To 100
For x = 0 To 100
Sommet(x,z)\x= x*1000
Sommet(x,z)\z= z*1000
Sommet(x,z)\y = 0
Next x
Next z
; Procedure de tracage de ligne optimisé
Procedure lineXY2(x1.f,y1.f,x2.f,y2.f,Couleur.l,ScreenX=640,ScreenY=480)
Shared dx.f,dy.f,xincr.l,yincr.l,x.l,y.l,erreur.f
If x1<>0 And y1<>0 And x2<>0 And y2<>0
;/* On initialise nos variables */
dx = Abs(x2-x1)
dy = Abs(y2-y1)
If x1<x2
xincr = 1
Else
xincr = -1
EndIf
If y1<y2
yincr = 1
Else
yincr = -1
EndIf
;/* Trace de ligne */
x = x1
y = y1
If dx>dy
erreur = dx/2 ; /* c'est plus esthetique comme ca */
For i= 0 To dx
x = x+xincr;
erreur = erreur+dy
If erreur > dx
erreur = erreur - dx
y = y+yincr
EndIf
If x>0 And x<ScreenX-1 And y>0 And y<ScreenY-1
Plot(x,y,Couleur)
EndIf
Next i
Else
erreur = dy/2; /* c'est plus esthetique comme ca */
For i=0 To dy
y = y + yincr
erreur = erreur + dx
If erreur>dy
erreur = erreur - dy
x = x + xincr
EndIf
If x>0 And x<ScreenX-1 And y>0 And y<ScreenY-1
Plot(x,y,Couleur)
EndIf
Next i
EndIf
EndIf
EndProcedure
; procedure de projection 3D --> 2D
Procedure Projection3D2D()
Static WaveSpeed.f
WaveSpeed-0.1
For z = 0 To 100
For x = 0 To 100
;Calcul des vagues 3D, puis affectation à la hauteur (y).
Map3D(x,z)\WaveHeight_A = (1000+1000*Cos(WaveSpeed*#PI/180)) *Cos((x*20*2*0.144)+WaveSpeed)
Map3D(z,x)\WaveHeight_B = (1000+1000*Cos(WaveSpeed*#PI/180)) *Sin((x*20*2*0.144)+WaveSpeed)
Map3D(x,z)\y = Map3D(x,z)\y -(Map3D(x,z)\WaveHeight_A + Map3D(x,z)\WaveHeight_B)/2
; ;Map3D(x,z)\y - ((Map3D(x,z)\x*Map3D(x,z)\x)/Map3D(x,z)\z)/5 ; Donne un effet déformer aux points
;
;FORMULE DE PROJECTION
Map2D(x,z)\x=(Map3D(x,z)\x*512)/(Map3D(x,z)\z+#Zoff)+#Xoff;
Map2D(x,z)\y=(Map3D(x,z)\y*512)/(Map3D(x,z)\z+#Zoff)+#Yoff;
; LE *512 joue sur le FOV
; Y a plus qu'a trouvé une formule pour la gestion du FOV
; Couleur.l = Map3D(x,z)\z / 255
; Couleur = Couleur-Couleur*3
If Map3D(x,z)\z>0 And Map2D(x,z)\x>-100 And Map2D(x,z)\x < 900 And Map2D(x,z)\y>-100 And Map2D(x,z)\y<700
If x+1<100
lineXY2(Map2D(x,z)\x,Map2D(x,z)\y,Map2D(x+1,z)\x,Map2D(x+1,z)\y,RGB(255 ,Couleur ,Couleur))
EndIf
If z+1<100
lineXY2(Map2D(x,z)\x,Map2D(x,z)\y,Map2D(x,z+1)\x,Map2D(x,z+1)\y,RGB(Couleur ,Couleur ,255))
EndIf
EndIf
Next x
Next z
EndProcedure
; Proc pour effectuer une translation
Procedure Translation(*Translation.VECTOR3)
Matrice_Translation\_11 = 1
Matrice_Translation\_12 = 0
Matrice_Translation\_13 = 0
Matrice_Translation\_14 = 0
Matrice_Translation\_21 = 0
Matrice_Translation\_22 = 1
Matrice_Translation\_23 = 0
Matrice_Translation\_24 = 0
Matrice_Translation\_31 = 0
Matrice_Translation\_32 = 0
Matrice_Translation\_33 = 1
Matrice_Translation\_34 = 0
Matrice_Translation\_41 = *Translation\x
Matrice_Translation\_42 = *Translation\y
Matrice_Translation\_43 = *Translation\z
Matrice_Translation\_44 = 1
EndProcedure
; Multiplication de la matrice finale et de la matrice de rotation
Procedure MultiplyMAT()
Matrice_Finale\_11 = Matrice_Translation\_11 * Matrice_Rotation\_11 + Matrice_Translation\_12 * Matrice_Rotation\_21 + Matrice_Translation\_13 * Matrice_Rotation\_31 + Matrice_Translation\_14 * Matrice_Rotation\_41
Matrice_Finale\_12 = Matrice_Translation\_11 * Matrice_Rotation\_12 + Matrice_Translation\_12 * Matrice_Rotation\_22 + Matrice_Translation\_13 * Matrice_Rotation\_32 + Matrice_Translation\_14 * Matrice_Rotation\_42
Matrice_Finale\_13 = Matrice_Translation\_11 * Matrice_Rotation\_13 + Matrice_Translation\_12 * Matrice_Rotation\_23 + Matrice_Translation\_13 * Matrice_Rotation\_33 + Matrice_Translation\_14 * Matrice_Rotation\_43
Matrice_Finale\_14 = Matrice_Translation\_11 * Matrice_Rotation\_14 + Matrice_Translation\_12 * Matrice_Rotation\_24 + Matrice_Translation\_13 * Matrice_Rotation\_34 + Matrice_Translation\_14 * Matrice_Rotation\_44
Matrice_Finale\_21 = Matrice_Translation\_21 * Matrice_Rotation\_11 + Matrice_Translation\_22 * Matrice_Rotation\_21 + Matrice_Translation\_23 * Matrice_Rotation\_31 + Matrice_Translation\_24 * Matrice_Rotation\_41
Matrice_Finale\_22 = Matrice_Translation\_21 * Matrice_Rotation\_12 + Matrice_Translation\_22 * Matrice_Rotation\_22 + Matrice_Translation\_23 * Matrice_Rotation\_32 + Matrice_Translation\_24 * Matrice_Rotation\_42
Matrice_Finale\_23 = Matrice_Translation\_21 * Matrice_Rotation\_13 + Matrice_Translation\_22 * Matrice_Rotation\_23 + Matrice_Translation\_23 * Matrice_Rotation\_33 + Matrice_Translation\_24 * Matrice_Rotation\_43
Matrice_Finale\_24 = Matrice_Translation\_21 * Matrice_Rotation\_14 + Matrice_Translation\_22 * Matrice_Rotation\_24 + Matrice_Translation\_23 * Matrice_Rotation\_34 + Matrice_Translation\_24 * Matrice_Rotation\_44
Matrice_Finale\_31 = Matrice_Translation\_31 * Matrice_Rotation\_11 + Matrice_Translation\_32 * Matrice_Rotation\_21 + Matrice_Translation\_33 * Matrice_Rotation\_31 + Matrice_Translation\_34 * Matrice_Rotation\_41
Matrice_Finale\_32 = Matrice_Translation\_31 * Matrice_Rotation\_12 + Matrice_Translation\_32 * Matrice_Rotation\_22 + Matrice_Translation\_33 * Matrice_Rotation\_32 + Matrice_Translation\_34 * Matrice_Rotation\_42
Matrice_Finale\_33 = Matrice_Translation\_31 * Matrice_Rotation\_13 + Matrice_Translation\_32 * Matrice_Rotation\_23 + Matrice_Translation\_33 * Matrice_Rotation\_33 + Matrice_Translation\_34 * Matrice_Rotation\_43
Matrice_Finale\_34 = Matrice_Translation\_31 * Matrice_Rotation\_14 + Matrice_Translation\_32 * Matrice_Rotation\_24 + Matrice_Translation\_33 * Matrice_Rotation\_34 + Matrice_Translation\_34 * Matrice_Rotation\_44
Matrice_Finale\_41 = Matrice_Translation\_41 * Matrice_Rotation\_11 + Matrice_Translation\_42 * Matrice_Rotation\_21 + Matrice_Translation\_43 * Matrice_Rotation\_31 + Matrice_Translation\_44 * Matrice_Rotation\_41
Matrice_Finale\_42 = Matrice_Translation\_41 * Matrice_Rotation\_12 + Matrice_Translation\_42 * Matrice_Rotation\_22 + Matrice_Translation\_43 * Matrice_Rotation\_32 + Matrice_Translation\_44 * Matrice_Rotation\_42
Matrice_Finale\_43 = Matrice_Translation\_41 * Matrice_Rotation\_13 + Matrice_Translation\_42 * Matrice_Rotation\_23 + Matrice_Translation\_43 * Matrice_Rotation\_33 + Matrice_Translation\_44 * Matrice_Rotation\_43
Matrice_Finale\_44 = Matrice_Translation\_41 * Matrice_Rotation\_14 + Matrice_Translation\_42 * Matrice_Rotation\_24 + Matrice_Translation\_43 * Matrice_Rotation\_34 + Matrice_Translation\_44 * Matrice_Rotation\_44
Matrice_Translation\_11 = Matrice_Finale\_11
Matrice_Translation\_11 = Matrice_Finale\_12
Matrice_Translation\_11 = Matrice_Finale\_13
Matrice_Translation\_11 = Matrice_Finale\_14
Matrice_Translation\_21 = Matrice_Finale\_21
Matrice_Translation\_21 = Matrice_Finale\_22
Matrice_Translation\_21 = Matrice_Finale\_23
Matrice_Translation\_21 = Matrice_Finale\_24
Matrice_Translation\_31 = Matrice_Finale\_31
Matrice_Translation\_31 = Matrice_Finale\_32
Matrice_Translation\_31 = Matrice_Finale\_33
Matrice_Translation\_31 = Matrice_Finale\_34
Matrice_Translation\_41 = Matrice_Finale\_41
Matrice_Translation\_41 = Matrice_Finale\_42
Matrice_Translation\_41 = Matrice_Finale\_43
Matrice_Translation\_41 = Matrice_Finale\_44
; Mise à jour de tout les points 3D
For z = 0 To 100
For x = 0 To 100
Map3D(x,z)\x = Matrice_Finale\_11*Sommet(x,z)\x + Matrice_Finale\_21*Sommet(x,z)\y + Matrice_Finale\_31*Sommet(x,z)\z + Matrice_Finale\_41
Map3D(x,z)\y = Matrice_Finale\_12*Sommet(x,z)\x + Matrice_Finale\_22*Sommet(x,z)\y + Matrice_Finale\_32*Sommet(x,z)\z + Matrice_Finale\_42
Map3D(x,z)\z = Matrice_Finale\_13*Sommet(x,z)\x + Matrice_Finale\_23*Sommet(x,z)\y + Matrice_Finale\_33*Sommet(x,z)\z + Matrice_Finale\_43
Next x
Next z
; Projection3D2D()
EndProcedure
; Proc pour la rotation xyz de la matrice
Procedure Rotation(*Rotation.VECTOR3)
Matrice_Rotation\_11 = Cos(*Rotation\z)*Cos(*Rotation\y)
Matrice_Rotation\_12 = Cos(*Rotation\z)*Sin(*Rotation\y)*Sin(*Rotation\x) - Sin(*Rotation\z)*Cos(*Rotation\x)
Matrice_Rotation\_13 = Cos(*Rotation\z)*Sin(*Rotation\y)*Cos(*Rotation\x) + Sin(*Rotation\z)*Sin(*Rotation\x)
Matrice_Rotation\_14 = 0
Matrice_Rotation\_21 = Sin(*Rotation\z)*Cos(*Rotation\y)
Matrice_Rotation\_22 = Sin(*Rotation\z)*Sin(*Rotation\y)*Sin(*Rotation\x) + Cos(*Rotation\x)*Cos(*Rotation\z)
Matrice_Rotation\_23 = Sin(*Rotation\z)*Sin(*Rotation\y)*Cos(*Rotation\x) - Cos(*Rotation\z)*Sin(*Rotation\x)
Matrice_Rotation\_24 = 0
Matrice_Rotation\_31 =-Sin(*Rotation\y)
Matrice_Rotation\_32 = Sin(*Rotation\x)*Cos(*Rotation\y)
Matrice_Rotation\_33 = Cos(*Rotation\x)*Cos(*Rotation\y)
Matrice_Rotation\_34 = 0
Matrice_Rotation\_41 = 0
Matrice_Rotation\_42 = 0
Matrice_Rotation\_43 = 0
Matrice_Rotation\_44 = 1
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) * Cos((*Camera\Yaw))
*Camera\LookAT\z = *Camera\Position\z + KeyboardPushed(#PB_Key_Up) * Sin((*Camera\Yaw))
*Camera\LookAT\y = *Camera\Position\y + KeyboardPushed(#PB_Key_Up) * Sin((*Camera\Pitch))
*Camera\Position\x = *Camera\LookAT\x + KeyboardPushed(#PB_Key_Up) * Cos((*Camera\Yaw))
*Camera\Position\z = *Camera\LookAT\z + KeyboardPushed(#PB_Key_Up) * Sin((*Camera\Yaw))
*Camera\Position\y = *Camera\LookAT\y + KeyboardPushed(#PB_Key_Up) * 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
InitMouse()
FPS_TIMER.l
FPS_COUNT.l
FPS_.l
;-BOUCLE PRINCIPALE
Repeat
ClearScreen(0) : ExamineKeyboard() : ExamineMouse()
;======================================
;CALCUL DU FPS
;======================================
If FPS_TIMER<ElapsedMilliseconds()
FPS_TIMER=ElapsedMilliseconds()+1000
FPS_=FPS_COUNT
FPS_COUNT=0
EndIf
If FPS_TIMER>ElapsedMilliseconds()
FPS_COUNT+1
EndIf
;======================================
;======================================
Translation(Camera\Position) ; Procedure de translation
Rotation(Camera\Rotation) ; de rotation
Free_Camera(Camera) ; Gestion de la camera
MultiplyMAT() ; Multiplication des matrices de transformations
;======================================
;======================================
StartDrawing(ScreenOutput())
DrawText(0,0,"MATRICE3D SOFTWARE PAR CPL.BATOR. FPS = "+Str(FPS_))
Projection3D2D() ; Projection à l'écran
StopDrawing()
;======================================
FlipBuffers(0)
Until KeyboardPushed(#PB_Key_Escape)