C ++ opengl在glTranslatef之后获得新的顶点位置

时间:2014-10-13 09:14:55

标签: c++ opengl matrix vector translation

我的3D空间中有一架飞机,我想将它移动到其他地方,所以我使用glTranslate这样做。

平面顶点数据是:(0,0,0),(1,0,0),(1,1,0)和(0,1,0)。 我通过使用glTranslatef(2.0,0.0,0.0)将对象转换为(2,0,0)的位置。

翻译后,点数据不变,所以如果我想要与我的飞机发生碰撞,那么视觉位置就不是它的实际位置。

有没有办法从MODELVIEW_MATRIX获取点数据,或者至少可以找到glTranslate之后的新值?

不要仅仅添加2.0来实际值来移动它,因为如果我想使用glRotate等我还想要点位置。

2 个答案:

答案 0 :(得分:0)

您可以从平移和旋转创建矩阵,以便可以使用矩阵转换坐标。 有许多库可以帮助您创建这样的矩阵和变换坐标。

答案 1 :(得分:0)

如果您真的不想维护自己的转换矩阵,可以使用以下命令获取当前的模型视图矩阵:

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

然后,您可以使用标准矩阵乘法将此矩阵应用于顶点。请记住,矩阵按列主顺序排列。使用输入向量xIn,转换后的向量xOut为:

xOut[0] = mat[0] * xIn[0] + mat[4] * xIn[1] + mat[8] * xIn[2] + mat[12];
xOut[1] = mat[1] * xIn[0] + mat[5] * xIn[1] + mat[9] * xIn[2] + mat[13];
xOut[2] = mat[2] * xIn[0] + mat[6] * xIn[1] + mat[10] * xIn[2] + mat[14];

在自己的代码中跟踪当前的转换矩阵确实是一种更好的方法,恕我直言。除了消除可能对性能有害的glGet()次调用之外,它还会让您走上使用现代OpenGL(核心配置文件)的道路,其中矩阵堆栈和所有相关调用不再存在。