Canvas Rotation Cube3D

Partagez votre expérience de PureBasic avec les autres utilisateurs.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Canvas Rotation Cube3D

Message par kernadec »

bonjour à tous
je viens d'adapter pour mes besoins un code VB de dessin d'un cube en rotation avec matrice
voici le code pour le Fun, Avec un ptit clin d' œil à la fête de noël qui approche :D

Cordialement

Code : Tout sélectionner

;##################################################################################################
;  http://codes-sources.commentcamarche.net/source/31525-rotation-dans-l-espace-3d-2d
;  Code Visual basic 5 en 2005 , auteur: cs_Stephane
;  Adapté en PB 5.00 par kernadec - Nov 2014
;##################################################################################################

Structure Point3D
  X.d
  Y.d
  Z.d
EndStructure

Global Dim cube.Point3D(8)
Global Dim trace.Point3D(8)
Global Dim col(8)
Global Coordonnee.Point3D
Global R.Point3D
Global Rot.Point3D
Global Zoom.d = 100
Pos1.Point3D
Pos2.Point3D


Procedure Pos_Point(X.d, Y.d, Z.d)
  
  Coordonnee\X = (Zoom + 50 * X)
  Coordonnee\Y = (Zoom * Y)
  Coordonnee\Z = (Zoom * Z)
  
EndProcedure 

Procedure Rotation()     
  
  Rot\X = Coordonnee\X * ( Cos(R\Z) * Cos(R\Y))  + Coordonnee\Y * ( Sin(R\Z) * Cos(R\X) - Cos(R\Z) * Sin(R\Y) * Sin(R\X)) + Coordonnee\Z * (Sin(R\Z) * Sin(R\X) + Cos(R\Z) * Sin(R\Y) * Cos(R\X))
  Rot\Y = Coordonnee\X * (-Sin(R\Z) * Cos(R\Y))  + Coordonnee\Y * ( Cos(R\Z) * Cos(R\X) + Sin(R\Z) * Sin(R\Y) * Sin(R\X)) + Coordonnee\Z * (Cos(R\Z) * Sin(R\X) + Sin(R\Z) * Sin(R\Y) * Cos(R\X))
  Rot\Z = Coordonnee\X * (-Sin(R\Y))             + Coordonnee\Y * (-Cos(R\Y) * Sin(R\X))                                  + Coordonnee\Z * (Cos(R\Y) * Cos(R\X))
  
EndProcedure  

Procedure tableau()                                  
  
  Pos_Point(1, 1, 1)
  cube(1) = Coordonnee
  Pos_Point(1, -1, 1)
  cube(2) = Coordonnee
  Pos_Point(-1, -1, 1)
  cube(3) = Coordonnee
  Pos_Point(-1, 1, 1)
  cube(4) = Coordonnee
  Pos_Point(-1, 1, -1)
  cube(5) = Coordonnee
  Pos_Point(-1, -1, -1)
  cube(6) = Coordonnee
  Pos_Point(1, -1, -1)
  cube(7) = Coordonnee
  Pos_Point(1, 1, -1)
  cube(8) = Coordonnee
  
EndProcedure

If OpenWindow(0, 0, 0, 500,500, "Cube 3D Rotation", #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  CanvasGadget(0, 10, 10, 480, 480,#PB_Canvas_DrawFocus|#PB_Canvas_Keyboard)
  
  AxeX.l = 480 / 2
  AxeY.l = 480 / 2
  AxeZ.l = 480 / 2
  
  Angle.d = 0
  Pas.d = Radian(10)
  SetActiveGadget(0)
  
  Repeat
    
    event = WindowEvent()
    
    Delay(120)                                           ; timer
    
    StartDrawing(CanvasOutput(0))
    Box(0, 0, 480, 480,RGB(255, 255, 255))
    
    Angle = Mod(Angle + Pas, 360)
    
    R\Z = Angle
    R\Y = Angle / 2
    R\X = Angle / 3
    
    ;Axe X -----------------------------------------------
    
    Pos_Point(1, 0, 0) : Rotation()
    Pos1\X = AxeX + Rot\X
    Pos1\Z = AxeZ + Rot\Z
    
    Pos_Point(-1, 0, 0) : Rotation()
    Pos2\X = AxeX + Rot\X
    Pos2\Z = AxeZ + Rot\Z
    LineXY(Pos1\X, Pos1\Z, Pos2\X, Pos2\Z, #Blue)
    DrawText(Pos2\X, Pos2\Z, "X", #Blue, #White)
    
    ;Axe Y ------------------------------------------------
    
    Pos_Point(0, 1, 0) : Rotation()
    Pos1\X = AxeX + Rot\X
    Pos1\Z = AxeZ + Rot\Z
    
    Pos_Point(0, -1, 0) : Rotation()
    Pos2\X = AxeX + Rot\X
    Pos2\Z = AxeZ + Rot\Z
    LineXY(Pos1\X, Pos1\Z, Pos2\X, Pos2\Z, #Red)
    DrawText(Pos2\X, Pos2\Z, "Y", #Red, #White)
    
    ;Axe Z ------------------------------------------------
    
    Pos_Point(0, 0, 1) : Rotation()
    Pos1\X = AxeX + Rot\X
    Pos1\Z = AxeZ + Rot\Z
    
    Pos_Point(0, 0, -1) : Rotation()
    Pos2\X = AxeX + Rot\X
    Pos2\Z = AxeZ + Rot\Z
    LineXY(Pos1\X, Pos1\Z, Pos2\X, Pos2\Z, #Green)
    DrawText(Pos2\X, Pos2\Z, "Z", #Green, #White)
    
    ;------------------------------------------------
    
    tableau()
    
    For i = 1 To 8
      
      Coordonnee = cube(i)
      Rotation()
      Pos1\X = AxeX + Rot\X
      Pos1\Z = AxeZ + Rot\Z
      col(i) = RGB(Random(255),Random(255),Random(255))
      Circle(Pos1\X, Pos1\Z, 10, col(i))
      
      trace(i)\X = Pos1\X
      trace(i)\Y = Pos1\Y
      trace(i)\Z = Pos1\Z
      
    Next
    
    ;Aretes du Cube 
    LineXY(trace(1)\X, trace(1)\Z, trace(2)\X, trace(2)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(2)\X, trace(2)\Z, trace(3)\X, trace(3)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(3)\X, trace(3)\Z, trace(4)\X, trace(4)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(4)\X, trace(4)\Z, trace(1)\X, trace(1)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(5)\X, trace(5)\Z, trace(6)\X, trace(6)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(6)\X, trace(6)\Z, trace(7)\X, trace(7)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(7)\X, trace(7)\Z, trace(8)\X, trace(8)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(8)\X, trace(8)\Z, trace(5)\X, trace(5)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(1)\X, trace(1)\Z, trace(8)\X, trace(8)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(2)\X, trace(2)\Z, trace(7)\X, trace(7)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(3)\X, trace(3)\Z, trace(6)\X, trace(6)\Z, RGB(Random(255),Random(255),Random(255)))
    LineXY(trace(4)\X, trace(4)\Z, trace(5)\X, trace(5)\Z, RGB(Random(255),Random(255),Random(255)))
    
    DrawText(trace(1)\X - 4, trace(1)\Z - 8, "1", #White, col(1))
    DrawText(trace(2)\X - 4, trace(2)\Z - 8, "2", #White, col(2))
    DrawText(trace(3)\X - 4, trace(3)\Z - 8, "3", #White, col(3))
    DrawText(trace(4)\X - 4, trace(4)\Z - 8, "4", #White, col(4))
    DrawText(trace(5)\X - 4, trace(5)\Z - 8, "5", #White, col(5))
    DrawText(trace(6)\X - 4, trace(6)\Z - 8, "6", #White, col(6))
    DrawText(trace(7)\X - 4, trace(7)\Z - 8, "7", #White, col(7))
    DrawText(trace(8)\X - 4, trace(8)\Z - 8, "8", #White, col(8))
    
    StopDrawing()
    
    
    Select EventType()                                              ; zoom souris
      Case #PB_EventType_MouseWheel 
        Zoom = Zoom - GetGadgetAttribute(0,#PB_Canvas_WheelDelta)*5 
    EndSelect
    
  Until  event = #PB_Event_CloseWindow
EndIf
Dernière modification par kernadec le sam. 15/nov./2014 20:08, modifié 1 fois.
Avatar de l’utilisateur
Micoute
Messages : 2522
Inscription : dim. 02/oct./2011 16:17
Localisation : 35520 La Mézière

Re: Canvas Rotation Cube3D

Message par Micoute »

Merci Kernadec, c'est du bon travail !
Microsoft Windows 10 Famille 64 bits : Carte mère : ASRock 970 Extreme3 R2.0 : Carte Graphique NVIDIA GeForce RTX 3080 : Processeur AMD FX 6300 6 cœurs 12 threads 3,50 GHz PB 5.73 PB 6.00 LTS (x64)
Un homme doit être poli, mais il doit aussi être libre !
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Canvas Rotation Cube3D

Message par Lord Nelson »

Totalement, Royalement, Sublimement bluffant :o
C'est franchement déconcertant même :?

Tu imagine que on pourrais faire un jeu 3D avec que des fonction 2D :o
Par contre se serait très lent mais très jolie !

Très beau travail à toi kernadec et Merci, c'est tous simplement à couper le souffle
moi je trouve, ça me met sur le cul, je suis vraiment bluffé :wink:
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Canvas Rotation Cube3D

Message par G-Rom »

...
Dernière modification par G-Rom le sam. 15/nov./2014 23:48, modifié 1 fois.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Canvas Rotation Cube3D

Message par kernadec »

bonjour G-Rom
Merci, :D je connaissais pas ce code !
c'est la même ossature sans Ogre également :D

tous les chemin mènent à Rom :mrgreen:

Cordialement
Lord Nelson
Messages : 355
Inscription : dim. 01/déc./2013 15:29

Re: Canvas Rotation Cube3D

Message par Lord Nelson »

@kernadec même pas un petit merci :cry:
Avatar de l’utilisateur
SPH
Messages : 4722
Inscription : mer. 09/nov./2005 9:53

Re: Canvas Rotation Cube3D

Message par SPH »

Lord Nelson a écrit :@kernadec même pas un petit merci :cry:
un petit merci : merci
http://HexaScrabble.com/
!i!i!i!i!i!i!i!i!i!
!i!i!i!i!i!i!
!i!i!i!
//// Informations ////
Intel Core i7 4770 64 bits - GTX 650 Ti
Version de PB : 6.00 - 64 bits
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Canvas Rotation Cube3D

Message par kernadec »

Lord Nelson
regarde l' entête du code que j'ai poste, il y a l'adresse ou le code est écrit en VisualBasic et cela depuis que je l'ai posté
c'est celui dont je me suis servi pour adapter ce cube.

comme je l'ai dit :roll: je connaissais pas ce code de G-Rom :?
j'en ai regardé pleins des codes de Cube 3D dans la même ossature,
j'ai pris celui en VB car il était pour moi plus simple à adapter tout simplement

Cordialement
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Canvas Rotation Cube3D

Message par kernadec »

et pour Finir Mr Lord Nelson
je dois ajouter que si tu regarde le poste que G-Rom il est du Lun 23/Jan/2006 23:1 tout cela sans dévaloriser le travail de G-ROM
Alors le code Visual-Basic dont je me suis servi est de 2005 :roll:
Donc voilà !! si j'ai une personne à remercié c'est Mr cs_Stephane

Pour vérifier ce que je dis télécharger avec l'adresse indiquée dans mon code le projet et visualiser le fichier test.Frm
http://codes-sources.commentcamarche.ne ... pace-3d-2d
Cordialement
G-Rom
Messages : 3626
Inscription : dim. 10/janv./2010 5:29

Re: Canvas Rotation Cube3D

Message par G-Rom »

On ne peu même plus posté du code sans que cela parte en cacahuète ...
Avatar de l’utilisateur
GallyHC
Messages : 1703
Inscription : lun. 17/déc./2007 12:44

Re: Canvas Rotation Cube3D

Message par GallyHC »

...............................................
Dernière modification par GallyHC le lun. 17/nov./2014 8:01, modifié 3 fois.
Configuration : Tower: Windows 10 (Processeur: i7 "x64") (Mémoire: 16Go) (GeForce GTX 760 - 2Go) - PureBasic 5.72 (x86 et x64)
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Canvas Rotation Cube3D

Message par kernadec »

bonjour G-Rom
Vraiment Désolé que cela se soit passé comme çà !
et il n'y a pas de cacahuètes entre nous.
j'avais bien compris ta démarche altruiste et je ne l'avais pas interprétée autrement.

Cordialement
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Canvas Rotation Cube3D

Message par Ollivier »

Bonjour Kernadec,

à l'instar de Micoute, je te présente les mêmes éloges. Ce code est une belle application de la 3D dans un canvas.

De plus, le calcul relatif de rotation est parfait, chose EXTREMEMENT rare sur les forum. Donc l'hommage à cs_stephane en est vraiment honoré.

Si je puis me permettre, en toute logique, je pourrais me sentir "soufflé" puisque tu parles de choix de simplicité de calcul trouvé sur un autre forum, alors que dans ce propre forum, cette simplicité de calcul, je l'ai publié (On effleure l'économie de 50% de calculs...) :
http://www.purebasic.fr/french/viewtopi ... =6&t=11283.

Pourtant, je ne me sens pas soufflé du tout. Tu cherchais avant tout à faire ce pas de la 3D sur ce "nouveau" support d'affichage. Tu t'es renseigné d'une certaine manière. Tu as débusqué une oeuvre de plus d'un programmeur de plus qui a grâcieusement offert ses connaissances applicatives.

Donc vraiment merci pour ce petit pied de nez que j'ai eu sourire à découvrir et voir fonctionner quelques minutes avant que mon p... d'e... de b... de m... d'ordi ne replonge dans les limbes du non fonctionnement matériel.
Avatar de l’utilisateur
kernadec
Messages : 1594
Inscription : ven. 25/avr./2008 11:14

Re: Canvas Rotation Cube3D

Message par kernadec »

bonjour Ollivier
Merci! :D et pour le lien, c'est vrai que c'est un très bon post pour ce sujet
je n' avais pas vu qu'il y avait eu d'autres post à sa suite notamment celui de graph100

encore merci pour le rappel mémoire :D

Cordialement
Ollivier
Messages : 4190
Inscription : ven. 29/juin/2007 17:50
Localisation : Encore ?
Contact :

Re: Canvas Rotation Cube3D

Message par Ollivier »

Répondre