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

Posted

技术标签:

【中文标题】C ++ opengl在glTranslatef之后获得新的顶点位置【英文标题】:C++ opengl get new vertex position after glTranslatef 【发布时间】:2014-12-07 19:29:03 【问题描述】:

我的 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 添加到实际值。要旋转对象,请使用glTranslate 将原点移至对象,然后再次使用glTranslate 将其移回。 【参考方案1】:

如果你真的不想维护自己的转换矩阵,你可以通过以下方式获取当前的模型视图矩阵:

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(核心配置文件)的道路,其中矩阵堆栈和所有相关调用不再存在。

【讨论】:

【参考方案2】:

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

【讨论】:

以上是关于C ++ opengl在glTranslatef之后获得新的顶点位置的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL/GLUT:glTranslatef 和 glRotatef 在绘制立方体之前还是之后?

OpenGL 转换

C++/OpenGL - 旋转一个矩形

opengl 绘制和移动原始形状

为啥使用 glTranslatef?为啥不直接更改渲染坐标?

无法在openGL中围绕它的中心旋转我的图像