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

Opengl transform relative body coordinates to world coordinates

本文关键字:转换 世界坐标 坐标 相对 Opengl      更新时间:2023-10-16

我有一个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不是一个数学库,你需要自己实现矩阵数学,或者使用一些第三方线性数学库。

由于注释而编辑:

将速度和加速度转换为球的局部坐标系。速度和重力都只是"定向"向量,所以转换与球在世界中的位置无关(重力可能会改变,但这不是问题)。所以你需要从世界到球空间的逆变换,它与位置无关。这是非常相同的问题,就像变换法线(只是反过来)=>所以你需要取倒置矩阵的转置逆(在这里详细解释http://www.lighthouse3d.com/tutorials/glsl-tutorial/the-normal-matrix/)。但是你已经有了这个逆的逆;这是球->世界矩阵本身。所以你只需要转置模型视图矩阵,将速度和重力向量与之相乘,并将它们应用于球的局部空间。