utilisation du mode de rendu GL_SELECT OPENGL pour rechercher une collision entre deux objets.
Permet de déterminer sans aucun calcul une collision entre un objet fixe et un objet mobile.
En attribuant un numéro à chaque objet de la scène on sélectionne uniquement celui qui nous intéresse.
Source / Exemple :
le code intéressant;
affichScene proc
LOCAL Q1:QWORD
LOCAL Q45:QWORD
LOCAL proche:QWORD
LOCAL loin:QWORD
;initialisation des variables pour GL_PROJECTION
mov DWORD PTR[ebp-4],3FF00000h
mov DWORD PTR[ebp-8],0h
mov DWORD PTR[ebp-12],40468000h
mov DWORD PTR[ebp-16],0h
mov DWORD PTR[ebp-20],3FB99999h
mov DWORD PTR[ebp-24],9999999Ah
mov DWORD PTR[ebp-28],43960000h
mov DWORD PTR[ebp-32],0h
;effacement des buffers
invoke glClear,GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
;-----------------------------------
;dessin de la scène en mode GL_RENDER
;------------------------------------
;definition du repère de visualisation
invoke glMatrixMode,GL_MODELVIEW
invoke glLoadIdentity
;définition de la projection
invoke glMatrixMode,GL_PROJECTION
invoke glLoadIdentity
invoke gluPerspective,DWORD PTR Q45,DWORD PTR Q45+4,
DWORD PTR Q1,DWORD PTR Q1+4,DWORD PTR proche,
DWORD PTR proche+4,DWORD PTR loin,DWORD PTR loin+4
invoke glPushMatrix ;boule rouge
fld x_rouge
fadd P0V005
fstp x_rouge
invoke glTranslatef,x_rouge,P0V5,M4
invoke glColor3f,P1,P0,P0
invoke gluNewQuadric
mov quadric,eax
invoke gluQuadricDrawStyle,quadric,GLU_LINE
invoke gluSphere,quadric,rayon,meridien,parallele
invoke glPopMatrix
invoke glPushMatrix ;boule bleu
fld x_bleu
fadd P0V008
fstp x_bleu
invoke glTranslatef,x_bleu,P0V5,M4
invoke glColor3f,P0,P0,P1
invoke gluNewQuadric
mov quadric,eax
invoke gluQuadricDrawStyle,quadric,GLU_LINE
invoke gluSphere,quadric,rayon,meridien,parallele
invoke glPopMatrix
;materialisation du volume defini par glOrtho
invoke glColor3f,P1,P1,P1
invoke glBegin,GL_LINE_LOOP
invoke glVertex3f,P1,P0,M4
invoke glVertex3f,P1,P1,M4
invoke glEnd
;passage en mode GL_SELECT,boule rouge traverse le volume étudié ?
;----------------------------------------------------------------
invoke glSelectBuffer,40,addr tableau_HITS ;stockage des hits
invoke glRenderMode,GL_SELECT ;mode select
invoke glInitNames ;vide la pile de noms
invoke glPushName,0 ;aucun nom dans la pile au début
invoke glPushMatrix
;définition du volume où l'on va rechercher le passage de la boule rouge
invoke glMatrixMode,GL_PROJECTION
invoke glLoadIdentity
invoke glOrtho,dword ptr gauche,DWORD PTR gauche+4,
DWORD PTR droite,DWORD PTR droite+4,
dword ptr bas,DWORD PTR bas+4,
DWORD PTR top,DWORD PTR top+4,
DWORD PTR pres,DWORD PTR pres+4,
dword ptr lon,DWORD PTR lon+4
invoke glMatrixMode,GL_MODELVIEW
invoke glLoadIdentity
;dessin des objets à étudier en les identifiants par un "nom"
invoke glLoadName,1 ;on ne s'occupe que de la boule rouge
invoke glPushMatrix
fld x_rouge
fadd P0V005
fstp x_rouge
invoke glTranslatef,x_rouge,P0V5,M4
invoke glColor3f,P1,P0,P0
invoke gluNewQuadric
mov quadric,eax
invoke gluQuadricDrawStyle,quadric,GLU_LINE
invoke gluSphere,quadric,rayon,meridien,parallele
invoke glPopMatrix
invoke glPopMatrix ;restauration matrice GL_PROJECTION du mode RENDER
;on repasse en mode GL_RENDER
xor eax,eax
invoke glRenderMode,GL_RENDER
mov HITS,eax ;HITS contient le nombre d'objets présent dans le volume étudier
.if eax==1
lea eax,tableau_HITS
mov esi,[eax+12] ;esi contient le n° de l'objet à étudier (1=boule rouge)
.if esi==1
MB "la sphère rouge a touchée la ligne","CONTACT"
invoke SendMessage,IDwindow,WM_DESTROY,0,0
.endif
.endif
ret
AffichScene endp
Conclusion :
vive Opengl et MASM !
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.