TUTO une Grue avec openGL

Informations pour bien débuter en PureBasic
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

TUTO une Grue avec openGL

Message par microdevweb »

Bonjour à tous,

Je ne suis pas un spécialiste en OpenGl, mais je m'y intéresse actuellement, voici un petit tutoriel pour faire une grue animée (j'ai trouvé ce tutoriel sur le net pour le C++ et je l'ai adapté, il n'est pas de moi à l'origine)

Flèche Bas -->Agrandir le fil de la grue
Flèche Haut -->Réduire le fil de la grue
Flèche Gauche-->Augmente l'angle du petit bras
Shits+Flèche Gauche-->Augmente l'angle du grand bras
Flèche Droite-->Réduit l'angle du petit bras
Shits+Flèche Droite-->Réduit l'angle du grand bras

Et Voila ce que cela donne

Image

Et le code

Code : Tout sélectionner


;-*Contantes
#Largeur_Base=50
#Hauteur_Base=20
#Largeur_Bras_1=150
#Hauteur_Bras_1=15
#Largeur_Bras_2=50
#Hauteur_Bras_2=10
#Taille_Caisse=10
#Largeur_Ecran=(#Largeur_Base+#Largeur_Bras_1+#Hauteur_Bras_2+50)
#Hauteur_Ecran=(#Hauteur_Base+#Largeur_Bras_1+#Hauteur_Bras_2+50)
#LongueurMin=10
#LongueurMax=100
#angle1Min=10
#angle2Min=10
#angle1Max=90
#angle2Max=90
;}
;-*Variables
Global angle1=45
Global angle2=-20
Global longueur=50
Procedure OpenMainForm()
      OpenWindow(0,0,0,#Largeur_Ecran,#Hauteur_Ecran,"Grue OpenGL")
      OpenGLGadget(0,0,0,#Largeur_Ecran,#Hauteur_Ecran,#PB_OpenGL_Keyboard)
EndProcedure
Procedure InitOpenGl()
      glMatrixMode_(#GL_PROJECTION)
      glLoadIdentity_()
      gluOrtho2D_(0,#Largeur_Ecran,0,#Hauteur_Ecran)
EndProcedure
Procedure dessinRectangle(largeur.q,hauteur.q)
     glBegin_(#GL_QUADS);
    glVertex2d_(0,-hauteur/2);
    glVertex2d_(0,hauteur/2);
    glVertex2d_(largeur,hauteur/2);
    glVertex2d_(largeur,-hauteur/2);
    glEnd_();
EndProcedure
Procedure DessinGrue()
      glClear_(#GL_COLOR_BUFFER_BIT)
      glMatrixMode_(#GL_MODELVIEW)
      glLoadIdentity_()
      ;-*La base-----------------------------------------------
      ;En bas à gauche de l'écran
      glTranslated_(#Largeur_Base/2,#Hauteur_Base,0)
      glColor3ub_(254,128,1)
      dessinRectangle(#Largeur_Base,#Hauteur_Base)
      ;}---------------------------------------------------------
      ;-*Le grand Bras-----------------------------------------
      ;En haut et au milieu de la base
      glTranslated_(#Largeur_Base/2,#Hauteur_Base/2,0)
      glRotated_(angle1,0,0,1)
      glColor3ub_(248,230,7)
      dessinRectangle(#Largeur_Bras_1,#Hauteur_Bras_1)
      ;}---------------------------------------------------------
      ;-*Le petit Bras------------------------------------------
      ;Au bout du grand bras
      glTranslated_(#Largeur_Bras_1,0,0)
      glRotated_(angle2,0,0,1)
      glColor3ub_(186,234,21)
      dessinRectangle(#Largeur_Bras_2,#Hauteur_Bras_2)
      ;}---------------------------------------------------------
      ;-*Le fil de la grue---------------------------------------
      ;Au bout du petit Bras
      glTranslated_(#Largeur_Bras_2,0,0)
      ;On annule les rotations
      glRotated_(-angle1-angle2,0,0,1)
      glColor3ub_(255,255,255)
      glBegin_(#GL_LINES)
      glVertex2i_(0,0)
      glVertex2i_(0,-longueur)
      glEnd_()
      ;}---------------------------------------------------------
      ;-*La caisse----------------------------------------------
      ;En bas du fil avec un petit décalage sur X pour anticiper le dessin de la caisse
      glTranslated_(-#Taille_Caisse/2,-longueur,0)
      glColor3ub_(175,175,85)
      dessinRectangle(#Taille_Caisse,#Taille_Caisse)
      ;}---------------------------------------------------------
      glFlush_()
      SetGadgetAttribute(0, #PB_OpenGL_FlipBuffers, #True)  
EndProcedure
OpenMainForm() ;Ouverture de la fenêtre
InitOpenGl()   ;Initialisation de openGl
Global Event
Repeat
      Event=WindowEvent()
      Delay(10)
      If Event=#PB_Event_Gadget
            If EventGadget()=0
                  If EventType()=#PB_EventType_KeyDown
                        Select GetGadgetAttribute(0,#PB_OpenGL_Key)
                              Case #PB_Shortcut_Up
                                    longueur-1 ;Reduit la longueur du fil
                                    If longueur<#LongueurMin
                                          longueur=#LongueurMin
                                    EndIf
                              Case #PB_Shortcut_Down
                                    longueur+1 ;Augmante la longueur du fil
                                    If longueur>#LongueurMax
                                          longueur=#LongueurMax
                                    EndIf
                              Case #PB_Shortcut_Left
                                    If GetGadgetAttribute(0,#PB_OpenGL_Modifiers)=#PB_OpenGL_Shift
                                          angle1+1 ;Augmente l"angle du grand bras
                                          If angle1>#angle1Max
                                                angle1=#angle1Max
                                          EndIf
                                    Else
                                          angle2+1 ;Augmente l'angle du petit Bras
                                          If angle2>#angle2Max
                                                angle2=#angle2Max
                                          EndIf
                                    EndIf
                              Case #PB_Shortcut_Right
                                    If GetGadgetAttribute(0,#PB_OpenGL_Modifiers)=#PB_OpenGL_Shift
                                          angle1-1 ;Réduit l'angle du gran bras
                                          If angle1<#angle1Min
                                                angle1=#angle1Min
                                          EndIf
                                    Else
                                          angle2-1 ;Réduit l'angle du petit bras
                                          If angle2<#angle2Min
                                                angle2=#angle2Min
                                          EndIf
                                    EndIf
                        EndSelect
                  EndIf
                  
            EndIf
      EndIf
      DessinGrue() ;Dessin de la grue
Until Event=#PB_Event_CloseWindow
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Avatar de l’utilisateur
Kwai chang caine
Messages : 6962
Inscription : sam. 23/sept./2006 18:32
Localisation : Isere

Re: TUTO une Grue avec openGL

Message par Kwai chang caine »

Elle est rigolote ta grue... :D
Ca tombe bien j'en ai besoin pour chez moi..je vais en abbatre du boulot maintenant :wink:
Merci pour le partage 8)
ImageLe bonheur est une route...
Pas une destination

PureBasic Forum Officiel - Site PureBasic
Avatar de l’utilisateur
raven
Messages : 222
Inscription : jeu. 06/janv./2005 15:45

Re: TUTO une Grue avec openGL

Message par raven »

fonctionne pas sur la 5.23 Lts.
je viens de voir pourquoi:
5.30
- Ajouté: Nouveau gadget OpenGLGadget() avec le support des commandes et constantes OpenGL natives sous Windows, OSX et Linux.
j'ai pas fait attention à ta signature :oops:

pas encore essayé la 5.30.
mais c'a à l'air excéllent.
Pb5.24 Lts/5.31 Windows 7 64 nvidia 560 ti E8500 8g ram
G-Rom
Messages : 3627
Inscription : dim. 10/janv./2010 5:29

Re: TUTO une Grue avec openGL

Message par G-Rom »

Obsolète tout ca :mrgreen:
Cela sert à comprendre surtout la hiérarchie entre les matrices de transformation ( modélisation hiérarchique )
la référence maintenant : http://www.opengl-tutorial.org/

;)
Avatar de l’utilisateur
microdevweb
Messages : 1800
Inscription : mer. 29/juin/2011 14:11
Localisation : Belgique

Re: TUTO une Grue avec openGL

Message par microdevweb »

Bonjour G-Rom,
Comme je le dis bien au début de mon post, je ne suis en rien spécialiste en OpenGL. Je l'étudie actuellement et adapte se que je trouve au nouveau gadget de PB 5.30.
Windows 10 64 bits PB: 5.70 ; 5.72 LST
Work at Centre Spatial de Liège
Shadow
Messages : 1373
Inscription : mer. 04/nov./2015 17:39

Re: TUTO une Grue avec openGL

Message par Shadow »

Ah sympa ce petit code, j'ai remis un peu en forme car c'était trop condensé pour moi, merci du partage !
Je sais, déterrage de topic de plus de 8 ans, pas bien :mrgreen:

Code : Tout sélectionner

; Créer par microdevweb led 17/Sep / 2014.
; Code remis en forme par Shadow le 17/03 / 2022.

; Flèche Bas --> Agrandir le fil de la grue.
; Flèche Haut --> Réduire le fil de la grue.
; Flèche Gauche --> Augmente l'Angle du petit bras.
; Shits + Flèche Gauche --> Augmente l'Angle du grand bras.
; Flèche Droite --> Réduit l'Angle du petit bras.
; Shits + Flèche Droite --> Réduit l'Angle du grand bras.

; Contantes.
#Largeur_Base = 50
#Hauteur_Base = 20
#Largeur_Bras_1 = 150
#Hauteur_Bras_1 = 15
#Largeur_Bras_2 = 50
#Hauteur_Bras_2 = 10
#Taille_Caisse = 10
#Largeur_Ecran = (#Largeur_Base + #Largeur_Bras_1 + #Hauteur_Bras_2 + 50)
#Hauteur_Ecran = (#Hauteur_Base + #Largeur_Bras_1 + #Hauteur_Bras_2 + 50)
#LongueurMin = 10
#LongueurMax = 100
#Angle1Min = 10
#Angle2Min = 10
#Angle1Max = 90
#Angle2Max = 90

; Variables.
Global Angle1 = 45
Global Angle2 = -20
Global Longueur = 50

Procedure OpenMainForm()
  OpenWindow(0, 0, 0, #Largeur_Ecran, #Hauteur_Ecran, "Grue OpenGL")
  OpenGLGadget(0, 0, 0, #Largeur_Ecran, #Hauteur_Ecran, #PB_OpenGL_Keyboard)
EndProcedure

Procedure InitOpenGl()
  glMatrixMode_(#GL_PROJECTION)
  glLoadIdentity_()
  gluOrtho2D_(0, #Largeur_Ecran, 0, #Hauteur_Ecran)
EndProcedure

Procedure DessinRectAngle(Largeur.q, Hauteur.q)
  glBegin_(#GL_QUADS)
  glVertex2d_(0, -Hauteur / 2)
  glVertex2d_(0, Hauteur / 2)
  glVertex2d_(Largeur, Hauteur / 2)
  glVertex2d_(Largeur, -Hauteur / 2)
  glEnd_()
EndProcedure

Procedure DessinGrue()
  
  glClear_(#GL_COLOR_BUFFER_BIT)
  glMatrixMode_(#GL_MODELVIEW)
  glLoadIdentity_()
  
  ; La base-----------------------------------------------
  ; En bas à gauche de l'écran.
  glTranslated_(#Largeur_Base / 2, #Hauteur_Base, 0)
  glColor3ub_(254, 128, 1)
  DessinRectAngle(#Largeur_Base, #Hauteur_Base)
  ;---------------------------------------------------------
  
  ; Le grand Bras-----------------------------------------
  ; En haut et au milieu de la base.
  glTranslated_(#Largeur_Base / 2, #Hauteur_Base / 2, 0)
  glRotated_(Angle1, 0, 0, 1)
  glColor3ub_(248, 230, 7)
  DessinRectAngle(#Largeur_Bras_1, #Hauteur_Bras_1)
  ;---------------------------------------------------------
  
  ; Le petit Bras------------------------------------------
  ; Au bout du grand bras
  glTranslated_(#Largeur_Bras_1, 0, 0)
  glRotated_(Angle2, 0, 0, 1)
  glColor3ub_(186, 234, 21)
  DessinRectAngle(#Largeur_Bras_2, #Hauteur_Bras_2)
  ;---------------------------------------------------------
  
  ; Le fil de la grue---------------------------------------
  ;Au bout du petit Bras.
  glTranslated_(#Largeur_Bras_2, 0, 0)
  ; On annule les rotations
  glRotated_(-Angle1-Angle2, 0, 0, 1)
  glColor3ub_(255, 255, 255)
  glBegin_(#GL_LINES)
  glVertex2i_(0, 0)
  glVertex2i_(0, -Longueur)
  glEnd_()
  ;---------------------------------------------------------
  
  ; La caisse----------------------------------------------
  ; En bas du fil avec un petit décalage sur X pour anticiper le dessin de la caisse.
  glTranslated_(-#Taille_Caisse / 2, -Longueur, 0)
  glColor3ub_(175, 175, 85)
  DessinRectAngle(#Taille_Caisse, #Taille_Caisse)
  ;---------------------------------------------------------
  
  glFlush_()
  SetGadgetAttribute(0,  #PB_OpenGL_FlipBuffers,  #True)
  
EndProcedure

OpenMainForm() ; Ouverture de la fenêtre.
InitOpenGl()   ; Initialisation de OpenGl.

Global Event

Repeat
  
  Event = WindowEvent()
  
  Delay(10)
  
  If Event = #PB_Event_Gadget
    
    If EventGadget() = 0
      
      If EventType() = #PB_EventType_KeyDown
        
        Select GetGadgetAttribute(0, #PB_OpenGL_Key)
            
          Case #PB_Shortcut_Up
            
            Longueur -1 ; Reduit la Longueur du fil.
            
            If Longueur < #LongueurMin
              Longueur = #LongueurMin
            EndIf
            
          Case #PB_Shortcut_Down
            
            Longueur + 1 ; Augmante la Longueur du fil.
            
            If Longueur > #LongueurMax
              Longueur = #LongueurMax
            EndIf
            
          Case #PB_Shortcut_Left
            
            If GetGadgetAttribute(0, #PB_OpenGL_Modifiers) = #PB_OpenGL_Shift
              
              Angle1 + 1 ; Augmente l"Angle du grand bras.
              
              If Angle1 > #Angle1Max
                Angle1 = #Angle1Max
              EndIf
              
            Else
              
              Angle2 + 1 ; Augmente l'Angle du petit Bras.
              
              If Angle2 > #Angle2Max
                Angle2 = #Angle2Max
              EndIf
              
            EndIf
            
          Case #PB_Shortcut_Right
            
            If GetGadgetAttribute(0, #PB_OpenGL_Modifiers) = #PB_OpenGL_Shift
              
              Angle1 - 1 ; Réduit l'Angle du gran bras.
              
              If Angle1 < #Angle1Min
                Angle1 = #Angle1Min
              EndIf
              
            Else
              
              Angle2 -1 ; Réduit l'Angle du petit bras.
              
              If Angle2 < #Angle2Min
                Angle2 = #Angle2Min
              EndIf
              
            EndIf
            
        EndSelect
        
      EndIf
      
    EndIf
    
  EndIf
  
  DessinGrue() ; Dessin de la grue.
  
Until Event = #PB_Event_CloseWindow
Processeur: Intel Core I7-4790 - 4 Cœurs - 8 Thread: 3.60 Ghz.
Ram: 32 GB.
Disque: C: SDD 250 GB, D: 3 TB.
Vidéo: NVIDIA GeForce GTX 960: 2 GB DDR5.
Écran: Asus VX248 24 Pouces: 1920 x 1080.
Système: Windows 7 64 Bits.

PureBasic: 5.60 x64 Bits.
Répondre