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?
Printable View
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?
1.)
2.) fairly
3.) did you search Google? edit: or NeHe?
have u followed the links in the links thread at the top of this forum?
Most of 'em, yes.Quote:
Originally posted by RoD
have u followed the links in the links thread at the top of this forum?
I'm actually afraid to read NeHe's tut on Collision Detection...it might just blow my fragile mind. :-\
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?
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.
Would there be any particular functions you'd use?Quote:
Originally posted by Nor
Things
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.Quote:
Originally posted by MrWizard
So, what kind of game are you wondering about?
>>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
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...
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
}
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 :)
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:
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: infiniteCode:#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;
}
Waking old thread time?
--
Mats