Thread: Simple collision detection

  1. #1
    Registered User
    Join Date
    Jul 2009
    Posts
    18

    Simple collision detection

    I’m trying to have a cube, only moving in 2 dimensions for now, to be able to detect a collision with another cube and respond by baking off a step.
    I’ve managed to do this with my manual controls but now I want to have the cubes move by themselves by controlling the translation variable at each update.

    My problem is that the function I’ve set up to detect collisions dose’nt seem to be affecting my translation variable , in this case t1ym, from my output I can see that there equal and should be responding to my if condition but its not.

    Does anyone see the problem here ?

    Code:
    #include <windows.h>
    #include <iomanip>
    #include <vector>
    #include <iostream>
    #ifdef __APPLE__
    #include <GLUT/glut.h>
    #else
    #include <GL/glut.h>
    #endif
    
    #include <stdlib.h>
    
    
    using namespace std;
    
    static int slices = 16;
    static int stacks = 16;
    //used to build objects
    static double x1=-1.0,x2=1.0,x3=1.0,x4=-1.0;
    double y1=-2,y2=-2,y3=0,y4=0;
    
    //varible used to translate my objects
    static double t1ym=0; //y axis movement
    static double t2ym=0;
    static double t1xm=0; //x axis movement
    static double t2xm=0;
    
    
    /* GLUT callback Handlers */
    //update
    void update(int value)
    {
    
        double coldect(double t2xm, double t1xm, double t1ym, double t2ym);
        cout<<"t1ym t2ym t1xm t2zm \n";
        cout<<t1ym<<" "<<t2ym<<" "<<t1xm<<" "<<t2xm<<"\n";
    
        glutPostRedisplay();
    	glutTimerFunc(3000, update, 0);
    t1ym--;
            }
    //colision function
    static double coldect(double t2xm, double t1xm, double t1ym, double t2ym)
    {
        t1ym--;
        //top of red colides with other cube
            if(t1ym==t2ym-4&&t1xm==t2xm or t1ym==t2ym-4&&t1xm==t2xm+1 or t1ym==t2ym-4&&t1xm==t2xm-1)
                {
                   cout<<"ii";
                   t1ym--;
                   t1ym--;
                }
                //bottom of red colides with other cube
                 if(t1ym==t2ym&&t1xm==t2xm or t1ym==t2ym&&t1xm==t2xm+1 or t1ym==t2ym&&t1xm==t2xm-1)
                {
                    cout<<"hh"<<"\n"<<t1ym;
                    t1ym++;
                    t1ym++;
                }
                //right of red
                if(t1xm==t2xm-2&&t1ym==t2ym-2 or t1xm==t2xm-2&&t1ym==t2ym-3 or t1xm==t2xm-2&&t1ym==t2ym-1)
                {
                    cout<<"ii";
                    t1xm--;
                    t1xm--;
                }
                //left of red
               if(t1xm==t2xm+2&&t1ym==t2ym-2 or t1xm==t2xm+2&&t1ym==t2ym-3 or t1xm==t2xm+2&&t1ym==t2ym-1)
                {
                    t1xm++;
                    t1xm++;
                }
        }
    
    
    
    
    
    static void resize(int width, int height)
    {
        const float ar = (float) width / (float) height;
    
        glViewport(0, 0, width, height);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glFrustum(-ar, ar, -1.0, 1.0, 1.0, 100.0);
    
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity() ;
    }
    
    static void display(void)
    {
        const double t = glutGet(GLUT_ELAPSED_TIME) / 1000.0;
        const double a = t*90.0;
    
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glColor3d(1,0,0);
        glPushMatrix();
        glTranslated(t1xm,t1ym,0);
    
        //create cube 1 1
        glBegin(GL_QUADS);
        glVertex3d(x1,y1,-10);
        glVertex3d(x2,y2,-10);
        glVertex3d(x3,y3,-10);
        glVertex3d(x4,y4,-10);
    
        glEnd();
        glPopMatrix();
        glColor3d(0,1,0);
        glPushMatrix();
        glTranslated(t2xm,t2ym,0);
        //create cube 2 2
        glBegin(GL_QUADS);
        glVertex3d(x1,-4,-10);
        glVertex3d(x2,-4,-10);
        glVertex3d(x3,-2,-10);
        glVertex3d(x4,-2,-10);
    
    glEnd();
    glPopMatrix();
    
    
        glutSwapBuffers();
    }
    
    //create manual controls
    static void key(unsigned char key, int x, int y)
    {
        switch (key)
        {
            case 27 :
            case 'q':
                exit(0);
                break;
    
            case '+':
                slices++;
                stacks++;
                break;
    
            case '-':
                if (slices>3 && stacks>3)
                {
                    slices--;
                    stacks--;
                }
                break;
    
            case 's':
             if(t1ym==t2ym-4&&t1xm==t2xm or t1ym==t2ym-4&&t1xm==t2xm+1 or t1ym==t2ym-4&&t1xm==t2xm-1)
                {
    
                    t1ym--;
                    t1ym--;
                }
                t1ym++;
    
                break;
                case 'd':
                if(t1ym==t2ym&&t1xm==t2xm or t1ym==t2ym&&t1xm==t2xm+1 or t1ym==t2ym&&t1xm==t2xm-1)
                {
    
                    t1ym++;
                    t1ym++;
                }
    
    
                t1ym--;
                break;
    
    
            case 'w':
    
            if(t1xm==t2xm-2&&t1ym==t2ym-2 or t1xm==t2xm-2&&t1ym==t2ym-3 or t1xm==t2xm-2&&t1ym==t2ym-1)
                {
    
                    t1xm--;
                    t1xm--;
                }
                t1xm++;
    
                break;
                case 'e':
                if(t1xm==t2xm+2&&t1ym==t2ym-2 or t1xm==t2xm+2&&t1ym==t2ym-3 or t1xm==t2xm+2&&t1ym==t2ym-1)
                {
    
                    t1xm++;
                    t1xm++;
                }
                t1xm--;
                break;
    
        }
    
        glutPostRedisplay();
    }
    
    
    const GLfloat light_ambient[]  = { 0.0f, 0.0f, 0.0f, 1.0f };
    const GLfloat light_diffuse[]  = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat light_specular[] = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat light_position[] = { 2.0f, 5.0f, 5.0f, 0.0f };
    
    const GLfloat mat_ambient[]    = { 0.7f, 0.7f, 0.7f, 1.0f };
    const GLfloat mat_diffuse[]    = { 0.8f, 0.8f, 0.8f, 1.0f };
    const GLfloat mat_specular[]   = { 1.0f, 1.0f, 1.0f, 1.0f };
    const GLfloat high_shininess[] = { 100.0f };
    
    /* Program entry point */
    
    int main(int argc, char *argv[])
    {
        glutTimerFunc(1000,update,0);
        glutInit(&argc, argv);
        glutInitWindowSize(640,480);
        glutInitWindowPosition(10,10);
        glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH);
    
        glutCreateWindow("GLUT Shapes");
    
        glutReshapeFunc(resize);
        glutDisplayFunc(display);
        glutKeyboardFunc(key);
    //declare my colision detec function
        coldect(t1ym,t1xm,t2ym,t2xm);
        glClearColor(1,1,1,1);
        glEnable(GL_CULL_FACE);
        glCullFace(GL_BACK);
    
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);
    
        glEnable(GL_LIGHT0);
        glEnable(GL_NORMALIZE);
        glEnable(GL_COLOR_MATERIAL);
        glEnable(GL_LIGHTING);
    
        glLightfv(GL_LIGHT0, GL_AMBIENT,  light_ambient);
        glLightfv(GL_LIGHT0, GL_DIFFUSE,  light_diffuse);
        glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular);
        glLightfv(GL_LIGHT0, GL_POSITION, light_position);
    
        glMaterialfv(GL_FRONT, GL_AMBIENT,   mat_ambient);
        glMaterialfv(GL_FRONT, GL_DIFFUSE,   mat_diffuse);
        glMaterialfv(GL_FRONT, GL_SPECULAR,  mat_specular);
        glMaterialfv(GL_FRONT, GL_SHININESS, high_shininess);
    
        glutMainLoop();
    
        return EXIT_SUCCESS;
    }

  2. #2
    Registered User
    Join Date
    Aug 2003
    Posts
    1,218
    I see you test for alot of equalities in your function. You shouldnt do that, due to the inprecision that is coming with doubles and floats. Make the tests range-based...ie if double1 >= double2 and so on.

  3. #3
    Registered User
    Join Date
    May 2010
    Posts
    3
    Quote Originally Posted by Shakti View Post
    I see you test for alot of equalities in your function. You shouldnt do that, due to the inprecision that is coming with doubles and floats. Make the tests range-based...ie if double1 >= double2 and so on.
    ^ This, most likely.

    For an example of what you're trying to do, take a look at this link: Simple collision detection for games (Stefan Pettersson) an article on delphi3000.com ||

    Simple bounding box collisions are great to start off with; but, to be honest, you'll probably want to move onto something beefier pretty quickly. If you want the best (at least in my opinion) possible 2D collision detection, take a look at the Separating Axis Theorem. The great thing is that the basic principle is very easy to understand; it's simply the idea that if you can draw a line between two objects then they're obviously not colliding.

    For a really excellent tutorial on the Separating Axis Theorem, take a look at the following link:

    N Tutorial A - Collision Detection and Response

    They provide source code, as well...though I think it's a flash project.

  4. #4
    Registered User VirtualAce's Avatar
    Join Date
    Aug 2001
    Posts
    9,607
    I see you test for alot of equalities in your function. You shouldnt do that, due to the inprecision that is coming with doubles and floats. Make the tests range-based...ie if double1 >= double2 and so on.
    ...or you can write a function that compares two floats based on an epsilon. The actual imprecision epsilon is 2^-24 but in MSVC it is defined as FLT_EPSILON.

Popular pages Recent additions subscribe to a feed

Similar Threads

  1. Quad equation for collision detection?
    By joeprogrammer in forum Game Programming
    Replies: 1
    Last Post: 06-09-2006, 10:59 PM
  2. Collision Detection
    By Grantyt3 in forum C++ Programming
    Replies: 3
    Last Post: 09-30-2005, 03:21 PM
  3. simple collision detection question
    By godhand in forum Game Programming
    Replies: 2
    Last Post: 05-25-2004, 11:27 PM
  4. simple collision detection problems
    By Mr_Jack in forum Game Programming
    Replies: 0
    Last Post: 03-31-2004, 04:59 PM
  5. Pacman-style Maze Collision Detection
    By SMurf in forum Game Programming
    Replies: 4
    Last Post: 02-24-2004, 05:47 PM