我需要使用 C++/OpenGL 在两个对象之间执行静态碰撞检测。我已经编写了碰撞检测的代码,但是这段代码使用了两个模型的顶点,它们在 .obj 文件中给出,而不是它们当前位置的坐标(这是我想要的)。
我已经对两个模型执行了平移和缩放转换,我现在需要知道这些坐标是什么。我想这与变换矩阵等有关,但它如何与初始坐标相结合?
谁能帮我?
OpenGL 不知道模型或场景是什么,它只是将点、线和三角形绘制到像素帧缓冲区。
是时候放弃部分或全部固定功能管道了。您不应再使用 glRotate、glTranslate 和 glScale 构建模型视图矩阵。相反,您应该自己维护矩阵,使用 GLM 或 Eigen 等数学库。这为您提供了模型转换矩阵的单个实例,您可以将其应用于原始模型坐标以进行碰撞测试,但也可以使用 glLoadMatrix(如果您还应用了视图转换)或 glMultMatrix 将其加载到模型视图矩阵中 GL_MODELVIEW矩阵模式。或者你选择着色器并使用制服。
如果您只有平移 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
我建议您首先绘制您的对象,使其质心位于原点 (0, 0, 0)
所以当你调用函数时
GL浮点矩阵MV[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];
您实际上需要对坐标执行相同的转换。
glGetFloatv(GL_MODELVIEW_MATRIX, m)
如果您使用的是固定功能管道,您可能会在开始将一个对象绘制到一些对象之前获取当前的模型视图矩阵,GLfloat m[16]
并存储矩阵以便稍后将它们应用于您的对象。
为了使乘法正确,这是矩阵元素从左侧相乘时的排序方式。
| 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]