2011-05-01 258 views
1

我有一个我正在研究的opengl C++项目,我在右手画一个球员和一个球。首先,我想通过设置球位置使球跟随球员的手运动。一段时间后,我需要使用运动学方程来进行球运动。我得到使用播放器右手变换矩阵(我这个做我画球员的那一刻):Opengl将相对身体坐标转换为世界坐标

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,这样我就可以在球离开球员之后把球翻译过来?

编辑:

我已经成功地收到该球坐标通过与向量乘以球 - > transformMatrix {0,0,0,1}的结果存储在世界矢量,即呼叫后(那一刻我画球):

glGetFloatv(GL_MODELVIEW_MATRIX, currentTransformMatrix); 

然后反演currentTransformMatrix并与世界矢量乘以逆。结果是球适当的坐标{x,y,z}。

+1

请不要滥用OpenGL作为矩阵数学库。这是尴尬和低效率。更好地使用真正的矩阵数学库,并使用glLoadMatrix和glMultMatrix将矩阵应用于OpenGL。顺便说一句:OpenGL-3.1完全删除了所有的矩阵功能! – datenwolf 2011-05-01 10:33:58

回答

2

您需要转换回玩家的手牌位置;颠倒了从手到世界的转变。由于OpenGL不是数学库,您需要自己使用一些第三方线性数学库来实现矩阵运算。

由于编辑评论:

你改变什么是速度和加速度进了球的局部坐标系。速度和重力都只是“指示性”向量,所以变换是独立于球在世界上的位置(以及引力可能会改变,但这不是问题)。所以你需要从世界到球空间的逆向变换,这与位置无关。这就像转换法线(反过来一样)=>这样的问题,所以你需要把倒置矩阵的转置逆(这里详细解释http://www.lighthouse3d.com/tutorials/glsl-tutorial/the-normal-matrix/)。然而你已经有了这个逆的倒数;这是球 - >世界矩阵本身。所以你只需要转置模型视图矩阵,将速度和重力矢量与它们相乘,并将它们应用在球的局部空间中。

+0

我已经设法反转ball-> transformMatrix,但接下来呢?我应该将逆与向量{0,0,0,1}相乘,并将结果{x,y,z}分配给球? – skalber 2011-05-01 10:57:43

+0

原则上是。但看到我的编辑细节。 – datenwolf 2011-05-01 11:19:20

+0

谢谢,你给了我正确的方向来解决问题。 – skalber 2011-05-01 12:30:58

相关问题