Cube : Affichage et mouvements

Généralités sur la programmation 3D
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Cube : Affichage et mouvements

Message par Ollivier »

J'ai déplacé ce code parce que je ne vais pas en faire un tuto et que c'est quand même de la 3D.

Touches Haut/Bas/Gauche/Droite/Tab/A : rotations selon le décor
Touches du pavé numérique 4/6/2/8/3/9 : rotations selon le cube (suit les axes médians du cube)
Touches 1/2/3/4/5/6 : translation selon les directions des axes médians du cube
Touches C/V/B/N/G/H : translation selon les directions du décor
Touches Q/S/E/D/R/F : translation par décentrage, selon les directions des axes médians du cube

Le niveau maths c'est de la 3ème de collège, donc usage de la trigo et des vecteurs sur plan (une rotation n'est jamais que sur un plan, même dans l'espace)

Code : Tout sélectionner

;_______________________________________________________
;  Titre :                        AFFICHAGE D'UN CUBE
;            Mouvements de translation et de rotation
;  Auteur :                                  OLLIVIER
;  Date :                                  14/02/2011
;  Outil numérique utilisé :              MATRICE 2x2
;  Sens du repère :                          INDIRECT
;  Perspective                              /DISTANCE
;  Interface                                  CLAVIER
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
;¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
      Structure OIJK
            Ox.D: Oy.D: Oz.D
            Ix.D: Iy.D: Iz.D
            Jx.D: Jy.D: Jz.D
            Kx.D: Ky.D: Kz.D
      EndStructure

      Define Rep.OIJK: Rep\Ix = 1. : Rep\Jy = 1. : Rep\Kz = 1.

      Global.I DskW, DskH, DskD, DskF, AffW, AffH
      Global.D Zoom = 1000.
      
Macro Rect(mx, my, mw, mh, mc)
      Line(mx, my, mw, 1, mc)
      Line(mx, my, 1, mh, mc)
      Line(mx, my + mh - 1, mw, 1, mc)
      Line(mx + mw - 1, my, 1, mh, mc)
EndMacro


;{ Macros des rotations } 
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Macro Rotation(a, b, Cos, Sin)
      x = a
      y = b
      a = x * Cos - y * Sin
      b = x * Sin + y * Cos
EndMacro

Macro RotaAbso(axe, a, b, c) ; Rotation selon le repère du décor
      Cos = Cos(c)
      Sin = Sin(c)
      Rotation(axe\I#a, axe\I#b, Cos, Sin)
      Rotation(axe\J#a, axe\J#b, Cos, Sin)
      Rotation(axe\K#a, axe\K#b, Cos, Sin)
EndMacro

Macro RotaRela(axe, a, b, c) ; Rotation selon le repère de l'objet
      Cos = Cos(c)
      Sin = Sin(c)
      Rotation(axe\a#x, axe\b#x, Cos, Sin)
      Rotation(axe\a#y, axe\b#y, Cos, Sin)
      Rotation(axe\a#z, axe\b#z, Cos, Sin)
EndMacro
;} ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

;{ Mouvements autres } 
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
Macro Transla(mObject, mInitial, mFinal, mAxe, mStep)
      For MI = mInitial To mFinal
            mObject(MI)\mAxe + mStep
      Next
EndMacro
;} ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯

      Define.D x, y, z, Cos, Sin, v = 0.05, Perspective, dx, dy, dz, OnX, OnY
      Define.D x1, y1, x2, y2
      Global.D Chiffre
      InitSprite()
      InitSprite3D()
      InitKeyboard()
      ExamineDesktops()
      DskW = DesktopWidth(0)
      DskH = DesktopHeight(0)
      DskD = DesktopDepth(0)
      DskF = DesktopFrequency(0)
      AffW = DskW
      AffH = DskH
      OpenScreen(DskW, DskH, DskD, "PureScreen")    
      KeyboardMode(#PB_Keyboard_International)
      
;{ Sol }
; ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
      Global _Sol = 1, _Sol2 = 2

      CreateSprite(_Sol, 256, 256, #PB_Sprite_Texture)
      StartDrawing(SpriteOutput(_Sol) )
            Box(0, 0, 256, 256, RGB(1, 1, 128) )
            Box(1, 1, 254, 254, RGB(1, 1, 254) )
            For I = 0 To 15
                  Rect(16 + I, 16 + I, 224 - I * 2, 224 - I * 2, RGB(1, 1, 127 + I * 8) )
            Next
            ;Box(16, 16, 224, 224, RGB(0, 0, 0) )
            For XE = 0 To 255 Step 8
                  ;Box(XE, 0, 4, 256, RGB(254, 254, 254) )
            Next XE
      StopDrawing()
      CreateSprite3D(_Sol0, _Sol)
      CreateSprite3D(_Sol1, _Sol)
      CreateSprite3D(_Sol2, _Sol)
      CreateSprite3D(_Sol3, _Sol)
      CreateSprite3D(_Sol4, _Sol)
      CreateSprite3D(_Sol5, _Sol)
      Structure V3
            x.D: y.D : z.D      
      EndStructure
      
Macro SetV3(var, xv, yv, zv)
      var\x = xv
      var\y = yv
      var\z = zv
EndMacro
      
      Global Dim Sol.V3(7)
      SetV3(Sol(0),  1.,  1.,  1.)
      SetV3(Sol(1), -1.,  1.,  1.)
      SetV3(Sol(2), -1.,  1., -1.)
      SetV3(Sol(3),  1.,  1., -1.)
      SetV3(Sol(4),  1., -1.,  1.)
      SetV3(Sol(5), -1., -1.,  1.)
      SetV3(Sol(6), -1., -1., -1.)
      SetV3(Sol(7),  1., -1., -1.)
      
      Global.I Dim Vertex0(5)
      Global.I Dim Vertex1(5)
      Global.I Dim Vertex2(5)
      Global.I Dim Vertex3(5)
      
Macro SetVertices(Mn, Ma, Mb, Mc, Md)
      Vertex0(Mn) = Ma            
      Vertex1(Mn) = Mb            
      Vertex2(Mn) = Mc            
      Vertex3(Mn) = Md            
EndMacro            

      SetVertices(0, 0, 1, 2, 3)
      SetVertices(1, 1, 0, 4, 5)
      SetVertices(2, 4, 7, 6, 5)
      SetVertices(3, 2, 6, 7, 3)
      SetVertices(4, 0, 3, 7, 4)
      SetVertices(5, 1, 5, 6, 2)
      
      
Structure VertexDisplay
      x.D
      y.D
      z.D
EndStructure

      Global Dim VD.VertexDisplay(7)

Macro SetVertex(Mn, Mx, My, Mz)
      x1 = AffW / 2
      y1 = AffH / 2
      dx = Mx
      dy = My
      dz = Mz - 10.
      Perspective = 1. / Sqr(dx * dx + dy * dy + dz * dz)
      OnX = Mx * Perspective * Zoom
      OnY = My * Perspective * Zoom
      x2 = x1 + OnX
      y2 = y1 - OnY
      VD(Mn)\x = x2
      VD(Mn)\y = y2
      VD(Mn)\z = Chiffre + 10.59 - Mz
EndMacro


Macro TransformSprite(mn, ma, mb, mc, md)
      TransformSprite3D(mn, VD(ma)\x, VD(ma)\y, VD(ma)\z, VD(mb)\x, VD(mb)\y, VD(mb)\z, VD(mc)\x, VD(mc)\y, VD(mc)\z, VD(md)\x, VD(md)\y, VD(md)\z)
      DisplaySprite3D(mn, 0, 0)
EndMacro



Macro Applica(axe, mx, my, mz, mI, mJ, mK)
      mx = axe\Ox + mI * axe\Ix + mJ * axe\Jx + mK * axe\Kx
      my = axe\Oy + mI * axe\Iy + mJ * axe\Jy + mK * axe\Ky
      mz = axe\Oz + mI * axe\Iz + mJ * axe\Jz + mK * axe\Kz
EndMacro



Macro Dessin(axe)
      For I = 0 To 7
            Applica(axe, x, y, z, Sol(I)\x, Sol(I)\y, Sol(I)\z)
            SetVertex(I, x, y, z)
      Next
      Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)
      For I = 0 To 5
            TransformSprite(_Sol0, Vertex0(I), Vertex1(I), Vertex2(I), Vertex3(I) )
      Next      
EndMacro

Macro Deplace(axe, mx, my, mz)
      Applica(axe, axe\Ox, axe\Oy, axe\Oz, mx, my, mz)
EndMacro

;} ¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯¯
      
      Repeat
            Delay(16)
            ExamineKeyboard()
            If KeyboardPushed(#PB_Key_Up)   : RotaAbso(Rep, y, z, v) : EndIf
            If KeyboardPushed(#PB_Key_Down) : RotaAbso(Rep, y, z, -v): EndIf
            If KeyboardPushed(#PB_Key_Tab)  : RotaAbso(Rep, x, z, v) : EndIf
            If KeyboardPushed(#PB_Key_A)    : RotaAbso(Rep, x, z, -v): EndIf
            If KeyboardPushed(#PB_Key_Left) : RotaAbso(Rep, x, y, v) : EndIf
            If KeyboardPushed(#PB_Key_Right): RotaAbso(Rep, x, y, -v): EndIf
            If KeyboardPushed(#PB_Key_Pad8) : RotaRela(Rep, J, K, v) : EndIf
            If KeyboardPushed(#PB_Key_Pad2) : RotaRela(Rep, J, K, -v): EndIf
            If KeyboardPushed(#PB_Key_Pad4) : RotaRela(Rep, I, J, v) : EndIf
            If KeyboardPushed(#PB_Key_Pad6) : RotaRela(Rep, I, J, -v): EndIf
            If KeyboardPushed(#PB_Key_Pad9) : RotaRela(Rep, K, I, v) : EndIf
            If KeyboardPushed(#PB_Key_Pad3) : RotaRela(Rep, K, I, -v): EndIf
            If KeyboardPushed(#PB_Key_T)    : Zoom * 1.01            : EndIf
            If KeyboardPushed(#PB_Key_Y)    : Zoom * 0.99            : EndIf
            If KeyboardPushed(#PB_Key_Q)    : Rep\Ox - 0.1           : EndIf
            If KeyboardPushed(#PB_Key_S)    : Rep\Ox + 0.1           : EndIf
            If KeyboardPushed(#PB_Key_E)    : Rep\Oy + 0.1           : EndIf
            If KeyboardPushed(#PB_Key_D)    : Rep\Oy - 0.1           : EndIf
            If KeyboardPushed(#PB_Key_R)    : Rep\Oz - 0.1           : EndIf
            If KeyboardPushed(#PB_Key_F)    : Rep\Oz + 0.1           : EndIf
            If KeyboardPushed(#PB_Key_C): Transla(Sol, 0, 7, x, 0.1)    : EndIf
            If KeyboardPushed(#PB_Key_V): Transla(Sol, 0, 7, x, (-0.1) ): EndIf
            If KeyboardPushed(#PB_Key_B): Transla(Sol, 0, 7, y, 0.1)    : EndIf
            If KeyboardPushed(#PB_Key_N): Transla(Sol, 0, 7, y, (-0.1) ): EndIf
            If KeyboardPushed(#PB_Key_G): Transla(Sol, 0, 7, z, 0.1)    : EndIf
            If KeyboardPushed(#PB_Key_H): Transla(Sol, 0, 7, z, (-0.1) ): EndIf
            If KeyboardPushed(#PB_Key_1): Deplace(Rep, (-0.1), 0., 0.) : EndIf
            If KeyboardPushed(#PB_Key_2): Deplace(Rep,   0.1 , 0., 0.) : EndIf
            If KeyboardPushed(#PB_Key_3): Deplace(Rep, 0., (-0.1), 0.) : EndIf
            If KeyboardPushed(#PB_Key_4): Deplace(Rep, 0.,   0.1 , 0.) : EndIf
            If KeyboardPushed(#PB_Key_5): Deplace(Rep, 0., 0., (-0.1)) : EndIf
            If KeyboardPushed(#PB_Key_6): Deplace(Rep, 0., 0.,   0.1 ) : EndIf
            ClearScreen(RGB(254, 254, 254) )
            StartDrawing(ScreenOutput() )
                  DrawingMode(#PB_2DDrawing_Transparent)
                  DrawText(0, 0, "Haut/Bas  Gauche/Droite  Tab/A  T/Y  Q/S  E/D  R/F  C/V  B/N  G/H  1/2  3/4  5/6  Pad4/Pad6  Pad2/Pad8  Pad3/Pad9", RGB(1, 1, 1) )
            StopDrawing()
            Start3D()
                  Sprite3DQuality(#PB_Sprite3D_BilinearFiltering)
                  Dessin(Rep)
            Stop3D()
            FlipBuffers()
      Until KeyboardPushed(#PB_Key_Escape)
Avatar de l’utilisateur
Ar-S
Messages : 9477
Inscription : dim. 09/oct./2005 16:51
Contact :

Re: Cube : Affichage et mouvements

Message par Ar-S »

Merci Ollivier.
~~~~Règles du forum ~~~~
⋅.˳˳.⋅ॱ˙˙ॱ⋅.˳Ar-S ˳.⋅ॱ˙˙ॱ⋅.˳˳.⋅
W11x64 PB 6.x
Section HORS SUJET : ICI
LDV MULTIMEDIA : Dépannage informatique & mes Logiciels PB
UPLOAD D'IMAGES : Uploader des images de vos logiciels
Répondre