Jump to content

  • Log In with Google      Sign In   
  • Create Account

FREE SOFTWARE GIVEAWAY

We have 4 x Pro Licences (valued at $59 each) for 2d modular animation software Spriter to give away in this Thursday's GDNet Direct email newsletter.


Read more in this forum topic or make sure you're signed up (from the right-hand sidebar on the homepage) and read Thursday's newsletter to get in the running!


Collision Detection


Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.

  • You cannot reply to this topic
5 replies to this topic

#1 HellsMan   Members   -  Reputation: 104

Like
0Likes
Like

Posted 09 June 2013 - 02:38 PM

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.

Attached Thumbnails

  • imagem.JPG

Edited by HellsMan, 09 June 2013 - 02:39 PM.


Sponsor:

#2 Alejandro   Members   -  Reputation: 142

Like
0Likes
Like

Posted 09 June 2013 - 03:10 PM

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 :)



#3 HellsMan   Members   -  Reputation: 104

Like
0Likes
Like

Posted 09 June 2013 - 03:58 PM

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.



#4 Zaucy   Members   -  Reputation: 263

Like
0Likes
Like

Posted 11 June 2013 - 11:30 PM

@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, 29 October 2014 - 06:39 PM.


#5 shocobenn   Members   -  Reputation: 273

Like
0Likes
Like

Posted 12 June 2013 - 08:15 AM

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 
}


#6 MindOfCorruption97   Members   -  Reputation: 140

Like
1Likes
Like

Posted 12 June 2013 - 11:16 AM

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






Old topic!
Guest, the last post of this topic is over 60 days old and at this point you may not reply in this topic. If you wish to continue this conversation start a new topic.



PARTNERS