Opengl将相对身体坐标转换为世界坐标 我有一个OpenGL C++项目,我在他右边画了一个球员和一个球。首先,我想通过设置球的位置使球跟随球员的手的移动。一段时间后,我需要使用运动学方程使球移动。我使用以下方法获得玩家右手变换矩阵(我在绘制玩家时这样做):

Opengl将相对身体坐标转换为世界坐标 我有一个OpenGL C++项目,我在他右边画了一个球员和一个球。首先,我想通过设置球的位置使球跟随球员的手的移动。一段时间后,我需要使用运动学方程使球移动。我使用以下方法获得玩家右手变换矩阵(我在绘制玩家时这样做):,c++,opengl,C++,Opengl,然后,当我抽到球的时候,我试着做: 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; 这一运动与球员的变换无关,而

然后,当我抽到球的时候,我试着做:

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}相乘来接收球坐标,在调用之后(我绘制球的那一刻),结果存储在世界向量中:


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

您需要转换回球员的手部位置;颠倒从手到世界的转变。由于OpenGL不是一个数学库,您需要自己实现矩阵数学或使用一些第三方线性数学库

因评论而编辑:


将速度和加速度转换为球的局部坐标系。速度和重力都是“定向”向量,因此变换与球在世界上的位置无关(重力可能会改变,但这不是问题)。所以你需要从世界到球空间的逆变换,这与位置无关。这与变换法线(jsut相反)=>是一个非常相同的问题,因此需要对反转矩阵进行转置求逆(此处详细解释)。然而,你已经有了这个倒数的倒数;这是球->世界矩阵本身。因此,您只需转置modelview矩阵,将速度和重力向量与之相乘,然后将它们应用于球的局部空间。

请不要滥用OpenGL作为矩阵数学库。这既尴尬又低效。最好使用实矩阵数学库,并使用glLoadMatrix和glMultMatrix将矩阵应用于OpenGL。顺便说一句:OpenGL-3.1完全删除了所有矩阵函数!我已经把球倒过来了,但是下一步怎么办?我应该用向量{0,0,0,1}乘以逆,然后把结果{x,y,z}赋给ball吗?谢谢,你给了我解决问题的正确方向。
x += velocityX*dt;
y += velocityY*dt + gravity*dt*dt;
z += velocityZ*dt;

velocityY += gravity*dt;
glGetFloatv(GL_MODELVIEW_MATRIX, currentTransformMatrix);