Collision Detection??

Started by
7 comments, last by azjerei 19 years, 6 months ago
I have tried now for several days to get collision detection to work in my OpenGL game. Here is what I have: Level is loaded from 3ds using the 3ds loading tutorial from Nehe's site. This means that faces, vertex data and similar stuff is all saved to structures, which are then used in the RenderScene() function to draw the scene. Anyways... I have a character model that moves on the screen when I supply input. With this character model comes three vectors: one facing left to right, the second goes front to back, and the third goes above to below. I intended to use these vectors for detecting collisions with faces in the level, using another tutorial from GameTutorials.com (a line colliding with a triangle). But the problems are: 1) I cannot for the love of god store the face's vertex data into a 3d vector so I can compare it to either of the three lines. 2) I cannot seem to even compare the three lines to a static, self-generated, triangle in the world space (though I could compare that triangle to a static self-generated line, which worked just fine....). I am quite confused, and if someone has any input on this, please let me know. I am sure most of you have gotten collision detection to work somehow, and these tutorials I am speaking of should be no new news I guess :)
Advertisement
I'm not quite sure I understand what you're asking... So could you try to explain a little more thorough?

Why can't you store vertex data as a vector? Why can't it be compared to the lines? How are you storing your vertex data?

I find it hard to visualize, or understand the problem you're having. Could you try and explain it again, but more thorough? To be honest, you do seem confused, and your confusing me as well. :)
Nothing to do with OpenGL. Moved.

____________________________________________________________www.elf-stone.com | Automated GL Extension Loading: GLee 5.00 for Win32 and Linux

Wait now... nothing to do with OpenGL? Oookey.. I guess OpenGL does not really mean OpenGL then. Where was it moved??

Anyways, here is what my code looks like now. Have managed to rewrite it enough to actually get collision to work, but the problem now is that it only checks for collision for the first face/polygon in the scene, and skips the rest, which is pretty strange. I might be missing something vital here.

void CollisionDetection(){	bCollFB = bCollLR = bCollAB = false;	// Calculate collision vectors.	vCollFB[0].x = g_fCharMoveX - 20.0f;	vCollFB[1].x = vCollFB[0].x + 40.0f;	vCollFB[0].y = 0.0f;//g_fCameraY;	vCollFB[1].y = vCollFB[0].y;	vCollFB[0].z = g_fCharMoveZ;	vCollFB[1].z = vCollFB[0].z;	vCollLR[0].x = g_fCharMoveX;	vCollLR[1].x = vCollLR[0].x;	vCollLR[0].y = 0.0f;	vCollLR[1].y = vCollLR[0].y;	vCollLR[0].z = g_fCharMoveZ - 20.0f;	vCollLR[1].z = vCollLR[0].z + 40.0f;	vCollAB[0].x = g_fCharMoveX;	vCollAB[1].x = vCollAB[0].x;	vCollAB[0].y = -20.0f;	vCollAB[1].y = vCollAB[0].y + 40.0f;	vCollAB[0].z = g_fCharMoveZ;	vCollAB[1].z = vCollAB[0].z;	// Make the graphical vector representations.	CVector3 vLine[6];	vLine[0].x = vCollFB[0].x;	vLine[0].y = vCollFB[0].y;	vLine[0].z = vCollFB[0].z;	vLine[1].x = vCollFB[1].x;	vLine[1].y = vCollFB[1].y;	vLine[1].z = vCollFB[1].z;	vLine[2].x = vCollLR[0].x;	vLine[2].y = vCollLR[0].y;	vLine[2].z = vCollLR[0].z;	vLine[3].x = vCollLR[1].x;	vLine[3].y = vCollLR[1].y;	vLine[3].z = vCollLR[1].z;	vLine[4].x = vCollAB[0].x;	vLine[4].y = vCollAB[0].y;	vLine[4].z = vCollAB[0].z;	vLine[5].x = vCollAB[1].x;	vLine[5].y = vCollAB[1].y;	vLine[5].z = vCollAB[1].z;	// Go through each object in the scene.	for(int i = 0; i < g_3DModel.numOfObjects; i++)	{		// Make sure we have valid objects just in case. (size() is in the vector class)		if(g_3DModel.pObject.size() <= 0) break;		// Get the current object that we are displaying		t3DObject *pObject = &g_3DModel.pObject;		// Go through each face and check for collision.		for (int j = 0; j < pObject->numOfFaces; j++)		{			// Get the face's vertices.			vTriangle[0] = pObject->pVerts[pObject->pFaces[j].vertIndex[0]];			vTriangle[1] = pObject->pVerts[pObject->pFaces[j].vertIndex[1]];			vTriangle[2] = pObject->pVerts[pObject->pFaces[j].vertIndex[2]];			// Render a blue triangle for representing the face collision area.			glBegin(GL_TRIANGLES);				glColor3ub(64, 64, 64);				glVertex3f(vTriangle[0].x, vTriangle[0].y, vTriangle[0].z);				glVertex3f(vTriangle[1].x, vTriangle[1].y, vTriangle[1].z);				glVertex3f(vTriangle[2].x, vTriangle[2].y, vTriangle[2].z);				glColor3ub(255, 255, 255);			glEnd();			// If we have not already collided, check for collision with current face.			if (!bCollLR)				bCollLR = IntersectedPolygon(vTriangle, vCollLR, 3);			if (!bCollFB)				bCollFB = IntersectedPolygon(vTriangle, vCollFB, 3);			if (!bCollAB)				bCollAB = IntersectedPolygon(vTriangle, vCollAB, 3);			// Render the collision vectors. Use different colors if collision is occuring.			glBegin(GL_LINES);				if (bCollFB)					glColor3ub(0, 255, 255);				else					glColor3ub(255, 0, 0);				glVertex3f(vLine[0].x, vLine[0].y, vLine[0].z);				glVertex3f(vLine[1].x, vLine[1].y, vLine[1].z);				if (bCollLR)					glColor3ub(255, 0, 255);				else					glColor3ub(0, 255, 0);				glVertex3f(vLine[2].x, vLine[2].y, vLine[2].z);				glVertex3f(vLine[3].x, vLine[3].y, vLine[3].z);				if (bCollAB)					glColor3ub(255, 255, 0);				else					glColor3ub(0, 0, 255);				glVertex3f(vLine[4].x, vLine[4].y, vLine[4].z);				glVertex3f(vLine[5].x, vLine[5].y, vLine[5].z);				glColor3ub(255, 255, 255);			glEnd();			// Reset the triangle vector array for the next face.			vTriangle[0].x = vTriangle[0].y = vTriangle[0].z = 0;			vTriangle[1].x = vTriangle[1].y = vTriangle[1].z = 0;			vTriangle[2].x = vTriangle[2].y = vTriangle[2].z = 0;		}	}}
Why dont u use sphere collision detection?
I am all new to this, don't know how to do that :)
Quote:Original post by azjerei
Wait now... nothing to do with OpenGL? Oookey.. I guess OpenGL does not really mean OpenGL then. Where was it moved??


The GL in OpenGL stands for graphics library. If it stood for collision detection library, it would be called OpenCDL...

____________________________________________________________www.elf-stone.com | Automated GL Extension Loading: GLee 5.00 for Win32 and Linux

Well, it IS for OpenGL, so I would classify it at that. Nevermind... I hope someone can help me out. I am quite stumped as to why it does not seem to go through each face in each object (only the very first face in the scene counts).
Solved it. Works like a charm.

This topic is closed to new replies.

Advertisement