Collision Detection

Started by
4 comments, last by MindOfCorruption97 10 years, 10 months ago

Hey guys,

I'm new here and programming in OpenGL as well.

I have this code:


#include <GL/glut.h>
#include <stdlib.h>
#include <math.h>


void display(void);
float CalcularX(float t);
float CalcularY(float t);
float RegraTres(float a);
void colisao(GLint x_ball_novo, GLint y_ball_novo);
void init(void);
void DrawBall(GLint x, GLint y);
void keyboard(unsigned char key, int x, int y);
float CalcularXteste(float t, float velocidadeInicial);
float dpsdoChoque(float x_ball, float t);


GLint width = 15;
GLint x_ball = 0, y_ball = 0;


GLint x_ball_novo = 0, y_ball_novo = 0;


int x_barra = 250, y_barra = 80, height = 50;


/*Mudar pra outros resultados*/
double anguloG = 45;
float velocidadeInicial = 2.0;


float tempo = 0;
const float pi = 3.1416;
const float g = 0.01;//9.8;//-1;
double angulo;






int main(int argc, char** argv){
    
  glutInit(&argc, argv);
  glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB);
  glutInitWindowSize (640, 480); 
  glutInitWindowPosition (100, 100); 
  glutCreateWindow ("Física - MU");
  angulo = RegraTres(anguloG);
  init();
  glutKeyboardFunc(keyboard);
  glutDisplayFunc(display);
  glutMainLoop();


  return 0;
}




void init(void){
  glClearColor(0.0, 0.0, 0.0, 0.0);
  glOrtho (0, 640, 0, 480, -1 ,1);


} 


void display(void){
  
  //Barras
  glBegin(GL_LINES);
  glVertex2i(x_barra,y_barra);  glVertex2i(x_barra, y_barra+height);
  glEnd();
  glutSwapBuffers();  
  
  glClear(GL_COLOR_BUFFER_BIT);
  
  
  
  glLineWidth(width);
  glBegin(GL_LINE_LOOP);
  glEnd();
  
  


  //DrawBall((int)CalcularX(tempo), (int)CalcularY(tempo));
  tempo += velocidadeInicial;
  
  glEnd();
  glFlush();
  glutPostRedisplay();
  
  colisao(x_ball_novo, y_ball_novo);
  dpsdoChoque(x_ball_novo, tempo);
  
}


void keyboard(unsigned char key, int x, int y){
  switch (key) {
  case 27:
exit(0);
break;


  case 'w':
    tempo=0;
    break;
            }
}


float CalcularX(float t){   
    return (velocidadeInicial * cos(angulo) * t);
}


float CalcularY(float t){ 
  return velocidadeInicial * sin(angulo) * t - ((g * t * t)/2) ;
}


float CalcularXteste(float t, float velocidadeInicial){   
    return (velocidadeInicial * cos(angulo) * t);
}


float dpsdoChoque(float x_ball_novo, float t){  
      return y_ball_novo + (-velocidadeInicial * sin(angulo+(pi/2)) * t - ((g * t * t)/2));
}


float RegraTres(float a){     
  return ((3.1416 * a)/180.0);
}


void colisao(GLint x_ball, GLint y_ball){
     
     glPointSize(width);
     glBegin(GL_POINTS);
     //glVertex2i(x_ball_novo,y_ball_novo);
     glEnd();


     GLfloat Bola_nova = x_ball + width;
     GLint Barra_nova = x_barra + width;
     
      
     if(Bola_nova >= Barra_nova){
          //DrawBall((int)CalcularXteste(tempo, -velocidadeInicial),(int)CalcularY(tempo));
          //DrawBall(135+(int)CalcularX(tempo), (int)CalcularY(tempo));
          //x_ball_novo = x_ball_novo + 2;
          exit(0);
          }
     else{
          DrawBall((int)CalcularX(tempo), (int)CalcularY(tempo)); 
          //x_ball_novo = x_ball_novo + 2;
          }
}




void DrawBall(GLint x_ball, GLint y_ball){
  //Bola
  glPointSize(width);
  glBegin(GL_POINTS);
  glVertex2i(x_ball,y_ball);
  glEnd();
  
  GLint Bola = x_ball + width;
  GLint Barra = x_barra + width;
  
     /*if (Bola >= Barra){


         DrawBall(135+(int)CalcularX(tempo), (int)CalcularY(tempo));
         
         else{
              }
       */  
    
         //velocidadeInicial*-1;
         //DrawBall(x_ball - 1, y_ball - 1);
         //angulo = RegraTres(anguloG - 5);
         //velocidadeInicial == velocidadeInicial - 5;


}
 

That does launch oblique with a square (called ball in the code) to a bar.
My problem is in how to detect the colision and after the collision is detected I want that the square goes in the opposite direction.
Since now, thanks for the help.
Advertisement

struct Rect
{
	float x, y;
	float w, h;

	// true means there's a collision
	bool checkCollision(Ball & ball)
	{
		return ball.x > x && ball.x < x + w &&  ball.y > y && ball < y + w
	}
};

struct Ball
{
	float x, y;
	float w, h;
	float dir_x, dir_y;
};

Rect paddle;
Ball ball;

void display(void)
{
	if(paddle.checkCollision(ball))
	{
		ball.dir_x *= -ball.dir_x;
	}
}

This may work :)

I tried putting that code in mine, but that error is appearing and I don't now why.

'struct Rect' has no member named 'checkCollision'

But checkCollision is obviously there.

@Alejandro you have error's in your code. Also, OP seems to be using C not C++ thus you cannot use a reference as an argument or have a member function for a C structure such as Rect.

Also, I wouldn't say that collision detection is relative to OpenGL. Maybe check out the For Beginners forum to get started!

Edit: Seems like OP is using C++.

You first have the collision (Our friend above gave it to you) and then the resolution.

For the resolution. if you want that the "ball bounce" you have to do first move the ball constantly with a speed


//overriding the example from above

void display(void)
{

       // classicaly in a game engine, you isolate this part in an "update" function
	if(paddle.checkCollision(ball))
	{
		ball.dir_x *= -ball.dir_x;
	}
       ball.x += ball.dir_x;
       ball.y += ball.dir_y;

      //draw your ball 
}

I made a bounding box class if you want.

Just create a bounding box for the ball and the paddle and just check if they collide.

Here are the files:

http://www.mediafire.com/download/9pguyvnjdcucwpg/tools.h

http://www.mediafire.com/download/0csbj0c6cbljyka/tools.cpp

This only fixes the collision problem(hopefully). The bouncing problem I don't know how to fix...

This topic is closed to new replies.

Advertisement