【问题标题】:Opengl transform relative body coordinates to world coordinatesOpengl将相对身体坐标转换为世界坐标
【发布时间】:2011-05-01 08:33:06
【问题描述】:

我正在处理一个 opengl c++ 项目,我在其中画了一个球员和一个球在他的右手。首先,我想通过设置球的位置让球跟随球员的手部运动。一段时间后,我需要使用运动学方程让球移动。我得到了玩家右手变换矩阵(我在绘制玩家的那一刻就这样做了):

glGetFloatv(GL_MODELVIEW_MATRIX, ball->transformMatrix);

然后在我画球的那一刻,我尝试去做:

glLoadMatrixf(ball->transformMatrix);
glTranslated(0, 0, 0);
glCallList(lists[BALL]);

这很完美,并且球在适当的位置绘制。

问题是当我需要移动球时

x += velocityX*dt;
y += velocityY*dt + gravity*dt*dt;
z += velocityZ*dt;

velocityY += gravity*dt;

移动与玩家变换无关,而是与全局相关。我尝试了很多方法来解决这个问题,但都没有奏效。

那么我如何正确计算球的 x、y、z,以便在球离开球员手后平移球?

编辑:

我已经设法通过将 ball->transformMatrix 与向量 {0, 0, 0, 1} 相乘来接收球坐标,结果存储在世界向量中,之后调用(我画球的那一刻):

glGetFloatv(GL_MODELVIEW_MATRIX, currentTransformMatrix);

然后反转 currentTransformMatrix 并将逆乘以世界向量。结果是球的正确坐标 {x, y, z}。

【问题讨论】:

  • 请不要滥用 OpenGL 作为矩阵数学库。这是尴尬和低效的。最好使用真正的矩阵数学库并使用 glLoadMatrix 和 glMultMatrix 将矩阵应用于 OpenGL。 BTW:OpenGL-3.1 完全移除了所有矩阵函数!

标签: c++ opengl


【解决方案1】:

你需要变回玩家手的位置;反转从手到世界的转变。由于 OpenGL 不是数学库,您需要自己实现矩阵数学或使用一些 3rd 方线性数学库。

因评论而编辑:

您转换的是速度和加速度到球的局部坐标系中。速度和重力都只是“方向性”矢量,因此变换与球在世界中的位置无关(重力可能会改变,但这不是问题)。所以你需要从世界到球空间的逆变换,这与位置无关。这与转换法线(反之亦然)=> 之类的问题非常相似,因此您需要采用倒置矩阵的转置逆矩阵(在此处详细解释 http://www.lighthouse3d.com/tutorials/glsl-tutorial/the-normal-matrix/ )。但是,您已经有了该逆的逆;它是球-> 世界矩阵本身。所以你只需要转置模型视图矩阵,乘以速度和重力向量,然后将它们应用到球的局部空间中。

【讨论】:

  • 我已经成功地反转了球->transformMatrix,但下一步是什么?我应该将逆向量与向量 {0, 0, 0, 1} 相乘并将结果 {x, y, z} 分配给球吗?
  • 谢谢,您给了我解决问题的正确方向。
猜你喜欢
  • 2012-01-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多