# Collision Detection in OpenGL

• 08-05-2003
Krak
Collision Detection in OpenGL
1.) How is it done?
2.) Is it hard to learn how to do?
3.) Could you link me to some good tutorials on it?
• 08-05-2003
confuted
1.)
2.) fairly
3.) did you search Google? edit: or NeHe?
• 08-05-2003
RoD
have u followed the links in the links thread at the top of this forum?
• 08-05-2003
Krak
Quote:

Originally posted by RoD
have u followed the links in the links thread at the top of this forum?
Most of 'em, yes.

I'm actually afraid to read NeHe's tut on Collision Detection...it might just blow my fragile mind. :-\
• 08-05-2003
MrWizard
When you say something like, "how is collision detection done in OpenGL" that's pretty vague. CD in OpenGL is the same as it would be in D3D except for the function calls. Do you mean 3D collisions? Because you can make 2D games in OpenGL and the collision detection is way different then in a 3D game. So, what kind of game are you wondering about?
• 08-05-2003
Nor
here are 2 easy ways.

draw a box around every object.
if any of the boxes overlap then you have a collision.

draw a circule around every object.

d = distance between 2 objects.
a = radis of the circule on the first object.
b = radis of the circule on the second object.

if ( a + b >= d ) colission
else no colission

forgive the spelling.
• 08-06-2003
Krak
Quote:

Originally posted by Nor
Things
Would there be any particular functions you'd use?

Quote:

Originally posted by MrWizard
So, what kind of game are you wondering about?
I want to learn how to detect collisions between two simple 2D rectangles. If I were going to start making a game, it'd be 2D.
• 08-06-2003
confuted
>>Would there be any particular functions you'd use?

Of course! One you wrote, which does exactly what Nor just said. There isn't a function that you can just use to make every part of a game. You have to actually program things. Look at what Nor said. You can't get much more specific than that without writing the code.
Quote:

draw a circule around every object.

d = distance between 2 objects.
a = radis of the circule on the first object.
b = radis of the circule on the second object.

if ( a + b >= d ) colission
else no colission
• 08-06-2003
funkydude9
You want to click me...you can't wait to click me...oh yes, you can feel it now...yes...yes....

If your just talking about basic bounding box collision detection, then this or this may help you. Those are Allegro specific, I know, but you'll get the idea...
• 08-06-2003
Nor
Code:

```take your pick. //#define twod_collision 0 /* or */ //#define threed_collision 0 bool detectcollision(int x1, int y1, int z1,int radis1, int x2, int y2, int z2, int radis2) {     int xd, yd, zd, Distance;         //2d     #ifdef twod_collision             xd = x2-x1;             yd = y2-y1;                        Distance = SquareRoot(xd*xd + yd*yd)     #endif         //3d     #ifdef threed_collision             xd = x2-x1;             yd = y2-y1;             zd = z2-z1;             Distance = SquareRoot(xd*xd + yd*yd + zd*zd);     #endif                 if( radis1 + radis2 >= Distance)             return true; //collision         return false;    //no collision    }```
• 03-01-2009
bOMI
You can do it better with this libary i think:

http://www.cs.unc.edu/~geom/collide/index.shtml

with this you can detect all collisions and more.
Ist free and open. But not quite simple.

Do it! Have much fun with it :)
• 03-02-2009
MK27
Quote:

Originally Posted by Krak
I want to learn how to detect collisions between two simple 2D rectangles. If I were going to start making a game, it'd be 2D.

Have you gotten a 2D rectangle to move in a straight line yet? The first collision you probably want to detect is the edge of the window...after that you will find it Pretty Damn Easy. Look:
Code:

```#include <GL/gl.h> #include <GL/glu.h> #include <GL/glut.h> #include <GL/glext.h> #include <stdlib.h> /* bouncing-blocks.c */ #define VOL 150 #define NP 7 struct square {         int x;  // x position         int y;  // y position         int w;  // size         int v;  // vertical velocity         int vd; // vertical direction (1 or -1)         int h;  // horizontal velocity         int hd; // horizontal direction (1 or -1) } *piec; void scene() {         glClear(GL_COLOR_BUFFER_BIT);         glColor3f(0.0f, 1.0f, 0.0f);         glRecti(piec[0].x,piec[0].y,piec[0].x+piec[0].w,piec[0].y-piec[0].w);         glColor3f(0.0f, 0.5f, 0.0f);         glRecti(piec[1].x,piec[1].y,piec[1].x+piec[1].w,piec[1].y-piec[1].w);         glColor3f(0.0f, 0.0f, 0.5f);         glRecti(piec[2].x,piec[2].y,piec[2].x+piec[2].w,piec[2].y-piec[2].w);         glColor3f(1.0f, 1.0f, 0.0f);         glRecti(piec[3].x,piec[3].y,piec[3].x+piec[3].w,piec[3].y-piec[3].w);         glColor3f(0.5f, 0.0f, 0.0f);         glRecti(piec[4].x,piec[4].y,piec[4].x+piec[4].w,piec[4].y-piec[4].w);         glColor3f(0.0f, 0.0f, 0.0f);         glRecti(piec[5].x,piec[5].y,piec[5].x+piec[5].w,piec[5].y-piec[5].w);         glColor3f(1.0f, 1.0f, 1.0f);         glRecti(piec[6].x,piec[6].y,piec[6].x+piec[6].w,piec[6].y-piec[6].w);         glutSwapBuffers(); } void setup(float R, float G, float B, GLdouble P) {         GLdouble N=0-P;         glClearColor(R,G,B,1.0f);         glMatrixMode(GL_PROJECTION);         glLoadIdentity();         glOrtho(N,P,N,P,N,P);         glMatrixMode(GL_MODELVIEW);         glLoadIdentity(); } void Vcollision (int P) {         int i;         for (i=0;i<NP;i++) {                 if (i==P) continue;                 if ((piec[P].y==piec[i].y-piec[i].w) && (piec[P].x<=piec[i].x+piec[i].w) &&                         (piec[P].x+piec[P].w>=piec[i].x)) {piec[P].vd=-1;                         piec[P].y-=1;                         if (piec[i].vd==-1) piec[i].vd=1;                         if (piec[P].v>=piec[i].v) piec[i].v--;                         else {piec[P].v++;piec[i].v++;}}                 else if ((piec[P].y-piec[P].w==piec[i].y) && (piec[P].x<=piec[i].x+piec[i].w) &&                         (piec[P].x+piec[P].w>=piec[i].x)) {piec[P].vd=1;                         piec[P].y+=1;                         if (piec[i].vd==1) piec[i].vd=-1;                         if (piec[P].v>=piec[i].v) piec[i].v--;                         else {piec[P].v++;piec[i].v++;}}         } } void Hcollision (int P) {         int i;         for (i=0;i<NP;i++) {                 if (i==P) continue;                 if ((piec[P].x==piec[i].x+piec[i].w) && (piec[P].y>=piec[i].y-piec[i].w) &&                         (piec[P].y-piec[P].w<=piec[i].y)) {piec[P].hd=1;                         piec[P].x+=1;                         if (piec[i].hd==1) piec[i].hd=-1;                         if (piec[P].h>=piec[i].h) piec[i].h--;                         else {piec[P].h++;piec[i].h++;}}                 else if ((piec[P].x+piec[P].w==piec[i].x) && (piec[P].y>=piec[i].y-piec[i].w) &&                         (piec[P].y-piec[P].w<=piec[i].y)) {piec[P].hd=-1;                         piec[P].x-=1;                         if (piec[i].hd==-1) piec[i].hd=1;                         if (piec[P].h>=piec[i].h) piec[i].h--;                         else {piec[P].h++;piec[i].h++;}}         } } void move(int T) {         int rendintrv, i;         for (rendintrv=0; rendintrv<15; rendintrv++) {                 if (T==1000001) T=1;                 for (i=0; i<NP; i++) {                         if ((piec[i].v>0) && (T%piec[i].v==0)) {piec[i].y+=piec[i].vd;                                 if (piec[i].y-piec[i].w<=-VOL) {piec[i].vd=1;                                         piec[i].y=-VOL+piec[i].w+1; piec[i].v--;}                                 else if (piec[i].y>=VOL) {piec[i].vd=-1;                                         piec[i].y=VOL-1; piec[i].v--;}                                 else Vcollision(i);                         }                         if ((piec[i].h>0) && (T%piec[i].h==0)) {piec[i].x+=piec[i].hd;                                 if (piec[i].x+piec[i].w>=VOL) {piec[i].hd=-1;                                         piec[i].x=VOL-piec[i].w-1; piec[i].h--;}                                 else if (piec[i].x<=-VOL) {piec[i].hd=1;                                         piec[i].x=-VOL+1; piec[i].h--;}                                 else Hcollision(i);                         }                         if (piec[i].v<=1) piec[i].v=2;                // min-max speeds                         else if (piec[i].v>30) piec[i].v=50;                         if (piec[i].h<=1) piec[i].h=2;                         else if (piec[i].h>30) piec[i].h=50;                 }                 T++;         }         scene();         glutTimerFunc(1,move,T); }                int main(int argc, char *argv[]) {         glutInit(&argc,argv);         glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB);         glutInitWindowSize(900,900);         glutCreateWindow("openGL test");         glutDisplayFunc(scene);         glutTimerFunc(1500,move,1);                 piec=malloc(NP*sizeof(*piec));         piec[0].x=-100;piec[0].y=0; piec[0].w=30; piec[0].v=8;piec[0].vd=1; piec[0].h=4;piec[0].hd=1;         piec[1].x=10;piec[1].y=50; piec[1].w=18; piec[1].v=4;piec[1].vd=-1; piec[1].h=8;piec[1].hd=-1;         piec[2].x=50;piec[2].y=0; piec[2].w=14; piec[2].v=8;piec[2].vd=-1; piec[2].h=8;piec[2].hd=1;         piec[3].x=75;piec[3].y=90; piec[3].w=22; piec[3].v=6;piec[3].vd=1; piec[3].h=6;piec[3].hd=-1;         piec[4].x=-50;piec[4].y=0; piec[4].w=60; piec[4].v=5;piec[4].vd=-1; piec[4].h=5;piec[4].hd=1;         piec[5].x=100;piec[5].y=-60; piec[5].w=45; piec[5].v=3;piec[5].vd=-1; piec[5].h=6;piec[5].hd=1;         piec[6].x=-120;piec[6].y=-100; piec[6].w=27; piec[6].v=7;piec[6].vd=-1; piec[6].h=4;piec[6].hd=1;         setup(1.0,0.0,1.0,VOL);         glutMainLoop();         return 0; }```
This was my first openGL program (for real) and I think I am managing things slightly differently now in 3D, but it works and it's all about collision and acceleration/deceleration. Seven brightly colored but differently sized squares bounce around and off walls perpetually, causing each other to reverse direction and speed up or slow down as circumstances dictate. Rated: G Running Time: infinite
• 03-02-2009
matsp
Waking old thread time?

--
Mats
• 03-02-2009
MK27
Quote:

Originally Posted by matsp
Waking old thread time?

--
Mats

Oh I just noticed that! Silly bOMI and me -- at least I didn't write that for the thread. I must have watched bouncing blocks for like, hours.

But there's no point in waiting for Krack to come back, I guess.