2010-08-03 175 views
0

我是一个真正的noob谁刚开始学习3D编程,我很难学习3D空间旋转。我的问题是,我似乎无法弄清楚如何使用它的本地坐标旋转对象。OpenGL-OpenTK旋转问题

我有3D对象基本类,首先,我要实现,这将在一定轴与X度旋转对象的功能。到目前为止,我有以下内容:

public void RollDeg(float angle) 
    { 
     this.rotation = Matrix4.Mult(rotation, 
      Matrix4.CreateRotationX(MyMath.Conversions.DegToRad(angle))); 
    } 

    public void PitchDeg(float angle) 
    { 
     this.rotation = Matrix4.Mult(rotation, 
      Matrix4.CreateRotationY(MyMath.Conversions.DegToRad(angle))); 
    } 

    public void YawDeg(float angle) 
    { 
     this.rotation = Matrix4.Mult(rotation, 
      Matrix4.CreateRotationZ(MyMath.Conversions.DegToRad(angle))); 
    } 

'rotation'是一个4x4矩阵,它以单位矩阵开始。每次我想要滚动/俯仰/偏航物体时,我都会调用上述函数之一。

用于绘图,我使用的是推动一个矩阵到模型视图堆,与所述对象的平移,旋转和缩放的矩阵相乘(以该顺序),并开始绘制顶点另一功能。最后,我将矩阵从堆栈中弹出。

问题在于上面的函数在GLOBAL轴上旋转对象,而不是在LOCAL上,即使从我的理解中,每次旋转对象时,本地系统都会更改它的轴,然后当新的旋转被应用在其他的顶部,局部轴被用于新的旋转。

我读了关于它背后的数学和如何旋转对象的不同教程,但我找不到可以帮助我的东西。

如果任何人有时间,我会很感激,如果他能帮助我了解如何围绕本地轴旋转和,也许更重要的是,我做错了什么在我目前的执行。

+0

它只是[Gimbal锁](http://en.wikipedia.org/wiki/Gimbal_lock)? [Quaternions](http://en.wikipedia.org/wiki/Quaternion)更有趣:) – sje397 2010-08-03 09:55:55

+0

@ sje377:不,不是Gimbal。每一次旋转都是在全局完成的,这就是问题所在,我不是在谈论重叠的轴。 @ Calvin1602:我知道,那是最让我烦恼的事情:我无法弄清楚我失踪的事情。没有使用调试器。 也许我应该张贴/附上整个班级?这个问题可以隐藏在别的地方吗? – cantrem 2010-08-03 10:12:55

+0

对不起,错误的评论,请参阅答案。但是关于调试器的话仍然坚持:用它 – Calvin1602 2010-08-03 10:16:15

回答

1

如果你想在这个顺序执行的转换:转换 - >旋转 - >规模(这使得完美的意义上说,它就是我们通常所需要的),你必须乘以你的矩阵以相反的顺序。

在右手坐标系(即openGL使用的一个坐标系)中,矩阵乘法必须从右到左执行。这就是为什么:

ModelViewTransform =变换*查看*型号// < - 您可以通过模型开始,对不对?所以它是这样的

请注意,在directX中,它们使用左手坐标系。它有他的缺点,但它更直观。

+0

oook,所以:有平均,有愚蠢的,有非常愚蠢的,有mindblowing愚蠢的,再有就是我: 我不得不看的右手坐标系第一千次(感谢卡尔文)考虑颠倒旋转矩阵乘法的顺序。问题是我乘以“旧*新”而不是“新*旧”。我有RTS转换这个讨厌的问题,并解决它,即使与x/y/z顺序,并解决它。我无法停下来惊叹自己:| 再次感谢! – cantrem 2010-08-03 10:46:36