我可以使用四元数来控制直升机吗?


9

我正在尝试在3D模式下进行简化的直升机(目前是立方体)仿真,并且在旋转方面遇到一些问题。直升机可以沿三个轴旋转:

  • 使用后螺旋桨自行旋转:y轴旋转
  • 左右倾斜以向左或向右移动:z轴旋转
  • 上下倾斜以向后或向前:x轴旋转

我需要能够分别控制每个轴。到目前为止,我已经尝试过使用欧拉角,但是无论使用哪种旋转顺序,我都会碰到万向节锁或某些轴“切换位置”。

我似乎需要使用四元数,但是我不知道如何控制每个单独的轴,因为四元数使用方向和角度。我应该创建三个四元数并将它们相乘吗?我会不会遇到同样的问题?

奇怪的是,如果我用手指来代表直升机的三个轴(竖起= y,索引= z,中间= x),我似乎没有遇到这些问题。为什么?


如果可以访问场景图,则可行的替代方法是为每个轴嵌套一个容器,然后分别旋转它们。
bummzack 2011年

@bummzack,是的,我已经考虑过了。但是,这与以特定顺序连接三个旋转矩阵不一样吗?
2011年

您是正确的@Subb,请不要将每个轴的旋转分别存储,无论使用什么方法,它都会遇到与Euler Angles相同的问题,矩阵和四元数也会受到Gimbal Lock的影响。
Maik Semder 2011年

@Maik Semder,那么我该如何控制直升机的俯仰/偏航/侧倾?
2011年

@Subb @ Flip's和我的回答基本上告诉了你如何去做。
Maik Semder 2011年

Answers:


4

您应该能够使用矩阵或四元数来存储直升机的当前方向。您遇到的问题是如何对直升机应用俯仰/偏航/侧倾变化。

我认为您想在每帧本地空间中对直升机应用俯仰/偏航/侧倾。您可以通过获取该帧的俯仰/偏航/横滚变化并构建旋转矩阵来实现此目的(可以使用欧拉角实现)。然后,通过此矩阵旋转直升机的先前方向(先前方向可以表示为矩阵或四元数)。它将为您提供新框架的方向。

将直升机的方向表示为四元数具有以下优势:四元数之间的插值比矩阵之间的插值容易得多。因此,如果将来您具有当前方向,并且希望弄清楚每帧旋转将在所需的时间将您带到新的方向,则四元数表示可能对您更友好。


我就是这样做的,将增量更新应用于代表本地->世界转换的矩阵。请记住要对矩阵进行归一化,如果不进行几百帧,它将显示舍入伪像。
Patrick Hughes

另外,要回答最后一个问题,即为什么用您的手来表示x / y / z轴时看不到万向节锁定问题,这是因为您可能会将pitch,yaw和roll值应用于手的局部坐标系参考。要构造一个具有欧拉角的旋转矩阵,首先要绕着世界的x旋转,然后是结果y,然后是结果z(x / y / z的实际顺序可能有所不同)。尝试以这种方式应用旋转,您可能会开始看到万向节锁的外观。
翻转

3

基本上,您可以使用旋转的所有其他表示形式,但可以使用欧拉角。矩阵,四元数甚至轴角都可以满足您的要求。

Should I create three quaternions and multiply them together? Wouldn't I end up with the same problems?

没错,最终会遇到同样的问题。关键是存储对象的当前方向(矩阵,四元数),并在更改方向时仅应用增量

当您想围绕y旋转10度时,只需为其创建一个增量矩阵/四元数,然后将其与当前方向相乘即可(如果您对矩阵使用后乘)。如果以相反的方式将其相乘,它将使系统绕着世界的y轴而不是围绕对象的y轴旋转。

我发现资源非常有用,它还附带了源代码,并且很好地解释了该理论。


-1

我认为您可能会遇到的麻烦是轴旋转和速度矢量不同(而且还缺少方向)。当直升飞机向前倾斜以向前移动时,直升飞机叶片的推动力将空气以与标记为X轴垂直的角度向下和向后推动。

您已经错过了第四个自由度:叶片的速度控制着被推动的空气量,这也控制着直升机产生的升力。

但是即使这样,您的“左右倾斜”和“上下倾斜”通常也可以控制给定飞机上的直升机。也就是说,直升飞机向后,向后或向侧面倾斜时,直升机不应向下飞行-但升程量可能必须改变,并且速度将由​​直角三角形形成的直角三角形的“相反”一侧控制用直线向下(重力)和斜边(升力)将直升机连接到地面。那应该给你的速度矢量使用。

您应该能够使用四元数来执行此操作,但不要将四元数值基于直升机本身的倾斜度-而是尝试使用直升机产生的运动力。


但是,这并不能真正回答问题。只是增加更多的思考。
bummzack 2011年

目前,我正在使用直升机的旋转来变换升力矢量,该升力矢量在直升机空间中指向上方。您是说我应该做相反的事情,即直接修改向量,然后旋转直升机吗?
2011年

我认为您应该同时执行这两项操作,然后再执行当前操作,然后根据叶片的法线对直升机的旋转结果进行任何更改。即您有2个旋转;一个应用于叶片,第二个表示直升机的实际旋转。显然所有存储在四元数中。
deceleratedcaviar
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.