我是一个真正的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上,即使从我的理解中,每次旋转对象时,本地系统都会更改它的轴,然后当新的旋转被应用在其他的顶部,局部轴被用于新的旋转。
我读了关于它背后的数学和如何旋转对象的不同教程,但我找不到可以帮助我的东西。
如果任何人有时间,我会很感激,如果他能帮助我了解如何围绕本地轴旋转和,也许更重要的是,我做错了什么在我目前的执行。
它只是[Gimbal锁](http://en.wikipedia.org/wiki/Gimbal_lock)? [Quaternions](http://en.wikipedia.org/wiki/Quaternion)更有趣:) – sje397 2010-08-03 09:55:55
@ sje377:不,不是Gimbal。每一次旋转都是在全局完成的,这就是问题所在,我不是在谈论重叠的轴。 @ Calvin1602:我知道,那是最让我烦恼的事情:我无法弄清楚我失踪的事情。没有使用调试器。 也许我应该张贴/附上整个班级?这个问题可以隐藏在别的地方吗? – cantrem 2010-08-03 10:12:55
对不起,错误的评论,请参阅答案。但是关于调试器的话仍然坚持:用它 – Calvin1602 2010-08-03 10:16:15