J'ai commencé avec un cube, pas de caméra, et j'ai des problèmes lorsque je fais tourner le cube sur lui-même. Je commence à comprendre pourquoi les matrices ne sont pas fiable pour calculer des rotations 3D successives.
Je donne le code maintenant, je n'ai pas vraiment atteind l'objectif du challenge. Hélas, j'ai trop de chose à faire et pas assez de temps pour le faire.
Code : Tout sélectionner
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; Nom du projet : Mini Moteur 3D - Cube 2
; Fichier : Cube 2.pb
; Version : 1.0.0
; Programmation = Truc bizarre dans l'animation
; Programmé par : Guimauve
; Date : 07-09-2006
; Mise à jour : 07-09-2006
; Codé avec PureBasic V4.00
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
;
; Pendant l'animation, le cube ne ressemble plus
; à un cube, pourquoi ? Après un certain temps le
; cube redevient un cube.
;
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
#Xoff = 400
#Yoff = 300
#Zoff = 500
Global Dim SinTable.d(359)
Global Dim CosTable.d(359)
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; CODE GÉNÉRÉ AUTOMATIQUEMENT, NE PAS MODIFIER À
; MOINS D'AVOIR UNE RAISON TRÈS TRÈS VALABLE !!!
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Déclaration de la Structure >>>>>
Structure Point3
x.l
y.l
z.l
EndStructure
; <<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les mutateurs >>>>>
Macro SetPoint3x(ObjetA, P_x)
ObjetA\x = P_x
EndMacro
Macro SetPoint3y(ObjetA, P_y)
ObjetA\y = P_y
EndMacro
Macro SetPoint3z(ObjetA, P_z)
ObjetA\z = P_z
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Les observateurs >>>>>
Macro GetPoint3x(ObjetA)
ObjetA\x
EndMacro
Macro GetPoint3y(ObjetA)
ObjetA\y
EndMacro
Macro GetPoint3z(ObjetA)
ObjetA\z
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< L'opérateur Update >>>>>
Macro UpdatePoint3(ObjetA, P_x, P_y, P_z)
SetPoint3x(ObjetA, P_x)
SetPoint3y(ObjetA, P_y)
SetPoint3z(ObjetA, P_z)
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Macro de déboguage >>>>>
Macro DebugPoint3(ObjetA)
Debug "(" + Str(GetPoint3x(ObjetA)) + ", " + Str(GetPoint3y(ObjetA)) + ", " + Str(GetPoint3z(ObjetA)) + ")"
EndMacro
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Code généré en : 16 ms <<<<<
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Procedure InitSinCosTable()
For Index = 0 To 359
SinTable(Index) = Sin(Index *#PI /180)
CosTable(Index) = Cos(Index *#PI /180)
Next
EndProcedure
Procedure RotationCube(Sommet.Point3(1), Point3D.Point3(1), Xa, Ya, Za)
; Initialisation de la matrice de rotation 3*3
Dim Matrice.f(2,2)
Matrice(0, 0) = CosTable(Za) * CosTable(Ya)
Matrice(1, 0) = SinTable(Za) * CosTable(Ya)
Matrice(2, 0) = -SinTable(Ya)
Matrice(0, 1) = CosTable(Za) * SinTable(Ya) * SinTable(Xa) - SinTable(Za) * CosTable(Xa)
Matrice(1, 1) = SinTable(Za) * SinTable(Ya) * SinTable(Xa) + CosTable(Xa) * CosTable(Za)
Matrice(2, 1) = SinTable(Xa) * CosTable(Ya)
Matrice(0, 2) = CosTable(Za) * SinTable(Ya) * CosTable(Xa) + SinTable(Za) * SinTable(Xa)
Matrice(1, 2) = SinTable(Za) * SinTable(Ya) * CosTable(Xa) - CosTable(Za) * SinTable(Xa)
Matrice(2, 2) = CosTable(Xa) * CosTable(Ya)
; Calcul de la rotation
For i = 0 To 7
SetPoint3x(Point3D(i), Matrice(0, 0) * GetPoint3x(Sommet(i)) + Matrice(1, 0) * GetPoint3y(Sommet(i)) + Matrice(2, 0) * GetPoint3z(Sommet(i)))
SetPoint3y(Point3D(i), Matrice(0, 1) * GetPoint3x(Sommet(i)) + Matrice(1, 1) * GetPoint3y(Sommet(i)) + Matrice(2, 1) * GetPoint3z(Sommet(i)))
SetPoint3z(Point3D(i), Matrice(0, 2) * GetPoint3x(Sommet(i)) + Matrice(1, 2) * GetPoint3y(Sommet(i)) + Matrice(2, 2) * GetPoint3z(Sommet(i)))
Next
EndProcedure
Procedure InitCube(Array.Point3(1))
UpdatePoint3(Array(0), -100, -100, -100)
UpdatePoint3(Array(1), 100, -100, -100)
UpdatePoint3(Array(2), 100, 100, -100)
UpdatePoint3(Array(3), -100, 100, -100)
UpdatePoint3(Array(4), 100, -100, 100)
UpdatePoint3(Array(5), -100, -100, 100)
UpdatePoint3(Array(6), -100, 100, 100)
UpdatePoint3(Array(7), 100, 100, 100)
EndProcedure
Procedure DrawCubeLine(Array.Point3(1), a,b,Couleur)
x1 = (GetPoint3x(Array(a))*256)/(GetPoint3z(Array(a)) + #Zoff) + #Xoff
y1 = (GetPoint3y(Array(a))*256)/(GetPoint3z(Array(a)) + #Zoff) + #Yoff
x2 = (GetPoint3x(Array(b))*256)/(GetPoint3z(Array(b)) + #Zoff) + #Xoff
y2 = (GetPoint3y(Array(b))*256)/(GetPoint3z(Array(b)) + #Zoff) + #Yoff
LineXY(x1, y1, x2, y2, Couleur)
EndProcedure
Procedure WireFrame(Array.Point3(1), Couleur)
StartDrawing(ScreenOutput()) ;>
DrawCubeLine(Array(), 0, 1, Couleur)
DrawCubeLine(Array(), 1, 2, Couleur)
DrawCubeLine(Array(), 2, 3, Couleur)
DrawCubeLine(Array(), 3, 0, Couleur)
DrawCubeLine(Array(), 4, 5, Couleur)
DrawCubeLine(Array(), 5, 6, Couleur)
DrawCubeLine(Array(), 6, 7, Couleur)
DrawCubeLine(Array(), 7, 4, Couleur)
DrawCubeLine(Array(), 0, 5, Couleur)
DrawCubeLine(Array(), 1, 4, Couleur)
DrawCubeLine(Array(), 2, 7, Couleur)
DrawCubeLine(Array(), 3, 6, Couleur)
StopDrawing() ;<
EndProcedure
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
Dim Sommet.Point3(7) ; Cube Original
Dim Point3D.Point3(7) ; Cube après la rotation
; Dim Point2D.Point2(7) ; Projection 2D du cube après la rotation
; <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<
; <<<<< Initialize DirectX >>>>>
If InitKeyboard() = 0 Or InitSprite() = 0
MessageRequester("ERROR","Cant initialize DirectX!",#MB_ICONERROR)
End
EndIf
; <<<<<<<<<<<<<<<<<<<<<<
; <<<<< OpenScreen >>>>>
ScreenW = GetSystemMetrics_(#SM_CXSCREEN)
ScreenH = GetSystemMetrics_(#SM_CYSCREEN)
If OpenScreen(ScreenW, ScreenH, 32, "Mini Moteur 3D") = 0
If OpenScreen(ScreenW, ScreenH, 24, "Mini Moteur 3D") = 0
If OpenScreen(ScreenW, ScreenH, 16, "Mini Moteur 3D") = 0
MessageRequester("ERROR", "Cant open DirectX screen!", #MB_ICONERROR)
End
EndIf
EndIf
EndIf
InitSinCosTable()
InitCube(Sommet())
Repeat
If IsScreenActive()
ClearScreen(#Black)
RotationCube(Sommet(), Point3D(), Xa.w, Ya.w, Za.w);
WireFrame(Point3D(), #Red)
Xa = (Xa + 1) % 360
Ya = (Ya + 2) % 360
Za = (Za + 3) % 360
StartDrawing(ScreenOutput());>
DrawingMode(#PB_2DDrawing_Transparent)
DrawText(5, 5, "Angle de rotation autour de x = " + Str(Xa), #Yellow)
DrawText(5,25, "Angle de rotation autour de y = " + Str(Ya), #Yellow)
DrawText(5,45, "Angle de rotation autour de z = " + Str(Za), #Yellow)
StopDrawing();<
FlipBuffers()
Else
Delay(10)
EndIf
ExamineKeyboard()
Until KeyboardReleased(#PB_Key_Escape)
CloseScreen()
End
; <<<<<<<<<<<<<<<<<<<<<<<<
; <<<< FIN DU FICHIER <<<<
; <<<<<<<<<<<<<<<<<<<<<<<<