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/)。然而,你已经得到了这个逆矩阵的逆矩阵;它是球->世界矩阵本身。所以你只需要改变模型视图矩阵,乘以速度和重力向量,然后把它们应用到球的局部空间。