Opengl将相对身体坐标转换为世界坐标

时间:2011-05-01 08:33:07

标签: c++ opengl

我正在制作一个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}。

1 个答案:

答案 0 :(得分:2)

你需要转换回玩家的手位置;颠倒从手到世界的转变。由于OpenGL不是数学库,您需要自己使用某些第三方线性数学库来实现矩阵数学。

由于评论而编辑:

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