Jump to content
  • Advertisement
Sign in to follow this  
Arthur Adorno

OpenGL Collision Detection

This topic is 2167 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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.
Edited by HellsMan

Share this post


Link to post
Share on other sites
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 :)

Share this post


Link to post
Share on other sites

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.

Share this post


Link to post
Share on other sites

@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++.

Edited by Zaucy

Share this post


Link to post
Share on other sites

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 
}

Share this post


Link to post
Share on other sites
Sign in to follow this  

  • Advertisement
×

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

GameDev.net is your game development community. Create an account for your GameDev Portfolio and participate in the largest developer community in the games industry.

Sign me up!