TUTO une Grue avec openGL
Publié : mer. 17/sept./2014 14:59
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

Et le code
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

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