Collision open gl

Description

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 !

Codes Sources

A voir également

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.