【问题标题】:C++ opengl get new vertex position after glTranslatefC ++ opengl在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 将其移回。

标签: c++ opengl matrix vector translation


【解决方案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】:

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

    【讨论】:

      猜你喜欢
      • 2021-12-17
      • 1970-01-01
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-13
      • 1970-01-01
      相关资源
      最近更新 更多