我正在制作一个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}。
答案 0 :(得分:2)
你需要转换回玩家的手位置;颠倒从手到世界的转变。由于OpenGL不是数学库,您需要自己使用某些第三方线性数学库来实现矩阵数学。
由于评论而编辑:
你变换的是球的局部坐标系中的速度和加速度。速度和重力都只是“指令”向量,因此转换与球在世界上的位置无关(重力可能会发生变化,但这不是问题)。所以你需要从世界到球空间的逆变换,这与位置无关。这就像转换法线一样(jsut反过来)=>所以你需要采用倒置矩阵的转置逆(这里详细解释http://www.lighthouse3d.com/tutorials/glsl-tutorial/the-normal-matrix/)。但是你已经有了逆的反转;它是球 - >世界矩阵本身。所以你只需要转换模型视图矩阵,将速度和重力矢量与它相乘,然后将它们应用到球的局部空间中。