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