关于c ++:Opengl将相对身体坐标转换为世界坐标

Opengl transform relative body coordinates to world coordinates

我有一个OpenGL C++项目,我在那里画一个球员和一个球在他的右手。首先,我想通过设置球的位置使球跟随球员的手的移动。一段时间后,我需要利用运动学方程使球运动。我得到玩家的右手变换矩阵,使用(我在绘制玩家时这样做):

1
glGetFloatv(GL_MODELVIEW_MATRIX, ball->transformMatrix);

然后,当我把球抽出来的时候,我试着去做:

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

这是完美的工作和球在适当的地方。

问题是当我需要移动球的时候

1
2
3
4
5
x += velocityX*dt;
y += velocityY*dt + gravity*dt*dt;
z += velocityZ*dt;

velocityY += gravity*dt;

运动不是相对于玩家的转换,而是相对于全局的。我试过很多方法来解决这个问题,但都不管用。

那么,我怎样才能正确地计算出球的x,y,z,这样我就可以在球离开球员的手后进行平移呢?

编辑:

我设法通过将ball->transformMatrix与向量0、0、0、1相乘得到球坐标,调用后(我画球的那一刻)结果存储在世界向量中:

1
glGetFloatv(GL_MODELVIEW_MATRIX, currentTransformMatrix);

然后将电流变换矩阵求逆,再与世界矢量相乘。结果是球的正确坐标x,y,z。


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

由于注释而编辑:

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