OpenGL中对象的当前坐标

时间:2013-02-12 23:59:25

标签: c++ opengl collision

我需要使用C ++ / OpenGL在两个对象之间执行静态碰撞检测。我已经编写了碰撞检测的代码,但是这段代码使用了.obj文件中给出的两个模型的顶点而不是它们当前位置的坐标(这就是我想要的)。

我已经对两个模型执行了Translate和Scale转换,我现在需要知道这些坐标是什么。我想它与转换矩阵有关,但是它如何与初始坐标相结合?

任何人都可以帮助我吗?

4 个答案:

答案 0 :(得分:2)

OpenGL不知道模型或场景是什么,它只是将点,线和三角形绘制到像素帧缓冲区。

是时候放弃部分或全部固定功能管道了。您不应再使用glRotate,glTranslate和glScale构建模型视图矩阵。相反,你应该自己维护矩阵,使用像GLM或Eigen这样的数学库。这将为您提供模型转换矩阵的单个实例,您可以将其应用于原始模型坐标以进行碰撞测试,也可以使用glLoadMatrix(如果还应用了视图转换)或GL_MODELVIEW中的glMultMatrix将其加载到模型视图矩阵中矩阵模式。或者你去着色器并使用制服。

答案 1 :(得分:1)

如果你只有翻译t和缩放s,你只需用以下方法计算实际位置:

world_position = s * model_position + t

如果您将任意变换作为矩阵M给出,则使用以下公式计算位置:

world_position = M * model_position 
//where model_position should be a 4d vector with w-coordinate 1

答案 2 :(得分:1)

我建议你首先在原点(0,0,0)中绘制你的质心对象

所以当你打电话给那个功能

GLfloat matrixMV [16];

glGetFloatv(GL_MODELVIEW_MATRIX,matrixMV);

坐标x,y,z

将分别为matrixMV [12] matrixMV [13] matrixMV [14]

  glMatrixMode(GL_MODELVIEW);
  glLoadIdentity();
  glRotatef(-25.0, 0.0, 1.0, 0.0);
  glTranslatef(100.0, 50.0, 0.0);
  /*Draw a triangle with centroid in the orign*/
  glBegin(GL_POLYGON);

      glVertex2f(0.0 , 1.0  );
      glVertex2f(-1.0,-0.27 );
      glVertex2f(1.0 ,-0.27 );

  glEnd();

  GLfloat matrixMV[16];
  glGetFloatv(GL_MODELVIEW_MATRIX, matrixMV);


 double xCenterTriangle = matrixMV[12];
 double yCenterTriangle = matrixMV[13];
 double zCenterTriangle = matrixMV[14];

答案 3 :(得分:0)

您实际上需要对坐标执行相同的转换。

如果你使用的是固定函数pipline,你可能会在开始通过glGetFloatv(GL_MODELVIEW_MATRIX, m)将一个对象绘制到某个GLfloat m[16]之前获取当前的ModelView矩阵,然后存储矩阵以便稍后将它们应用到对象中。

为了使乘法正确,这是矩阵元素的排序方式,从左边乘以。

   | m[0] m[4]  m[8] m[12] |     v[0]
   | m[1] m[5]  m[9] m[13] | x   v[1]
   | m[2] m[6] m[10] m[14] |     v[2]
   | m[3] m[7] m[11] m[15] |     v[3]