Math 理解角速度及其应用

Math 理解角速度及其应用,math,3d,rotation,quaternions,euler-angles,Math,3d,Rotation,Quaternions,Euler Angles,我最近不得不把欧拉旋转速率转换成矢量角速度。 据我所知,在局部参考中,我们可以通过以下方式表示矢量角速度: R = [rollRate, pitchRate, yawRate] (which is the correct order relative to the referential I want to use). 我还知道,我们可以通过以下方式将给定时间步长的角速度转换为旋转(四元数): alpha = |R| * ts nR = R / |R| * sin(alpha) <--

我最近不得不把欧拉旋转速率转换成矢量角速度。 据我所知,在局部参考中,我们可以通过以下方式表示矢量角速度:

R = [rollRate, pitchRate, yawRate] (which is the correct order relative to the referential I want to use).
我还知道,我们可以通过以下方式将给定时间步长的角速度转换为旋转(四元数):

alpha = |R| * ts
nR = R / |R| * sin(alpha) <-- normalize and multiply each element by sin(alpha)
Q = [nRx i, nRy j, nRz k, cos(alpha)]
我知道“平滑”连续旋转可能会在中途改变滚动组件

然而,我不明白的是,在90°/时间单位俯仰率与90°/时间单位yawRate相结合的完整时间单位之后,我最终得到了这些俯仰角和偏航角,以及为什么我仍然有横摇(我本以为它们最终会达到[0°、90°、90°)

我对我的轴+角度到四元数和四元数到欧拉公式都很有信心,因为我已经对这些公式进行了广泛的测试(通过单元测试和现场测试),但是我不确定欧拉旋转速率到角速度的“转换”


我的第一个赌注是我不理解euler旋转速率轴如何相互作用,第二个赌注是这种“转换”欧拉旋转速率和角速度矢量之间的关系是不正确的。

欧拉角不是表示任意角运动的好方法。它只是用于图形、游戏和机器人技术的简化。它们有一些非常严格的限制,比如你的旋转只由
N
垂直轴组成
ND
spa这并不是旋转在现实世界中的工作原理。在这个球面表示的复端点上,它创造了许多奇点(你们知道当你们穿过极点时…)

旋转运动类似于平移:

position       speed                    acceleration
pos = Integral(vel) = Integral(Integral(acc))
ang = Integral(omg) = Integral(Integral(eps))
在某些更新中,计时器可以重写为:

vel+=acc*dt; pos+=vel*dt;
omg+=eps*dt; ang+=omg*dt;
其中,
dt
是经过的时间(计时器间隔)

旋转的问题在于不能像平移一样叠加它。因为每个旋转都有自己的轴(不需要轴对齐,也不需要居中)每一次旋转也会影响其他所有旋转的轴方向,因此它们的顺序非常重要。除此之外,还有陀螺力矩,这两个不平行的轴会产生第三次旋转。把所有这些放在一起,你会突然发现欧拉角与旋转的真实几何/物理不匹配。它们可以描述定向和假旋转达到一定程度,但一旦用于物理模拟,就不会有真正的意义

真正的模拟需要轴(不仅是方向,还有原点)、角速度(及其变化)所描述的旋转列表,并且在每个模拟步骤中,轴将发生变化时重新计算(除非只有一个旋转存在)

这可以通过使用累积旋转和增量旋转来实现

不幸的是,大多数程序员喜欢欧拉角和四元数,只是因为他们不知道有更好更简单的选择,一旦他们这样做了,他们仍然坚持欧拉角,因为矩阵数学对他们来说似乎更复杂……这就是为什么现在大多数游戏都有万向锁、主要旋转错误和小故障、不现实的物理现象


不要误会,它们仍然有它们的用途(例如liek限制相机的自由外观等…但它们误用了它们最糟糕的用途。

我在模拟中使用了四元数(据我所知,四元数不受万向节锁的影响),我只使用欧拉角进行人机交互(根据我的经验,人脑不喜欢四元数)。当我必须投影一个(或多个)时,我也会使用变换矩阵变换/旋转空间中的点。但我的问题不是点如何通过变换空间投影,而是空间如何变换。如果我理解正确,我的问题来自于我试图描述的旋转不是围绕单个轴,对吗?我也理解你喜欢4*4矩阵而不是四元数。欧拉角,我可以理解,但它们比四元数有什么优势?除了旋转原点(只要你不打算通过它投射点/形状,这没有什么特别的意义)?@AxelPaccalin 4x4矩阵按照顺序对变换进行累积。四元数不需要,因为它们只是旋转。是的,它们可以累积方向,但任何平移都必须在其他位置定义,一旦完成,就不能再叠加变换。相反,你需要从每帧的某个起点旋转,勾选,做任何事情反复变换…在4x4矩阵中,您可以直接访问和使用所表示的坐标系属性,因为您有其3个基向量和位置。这对于局部坐标系变换和移动来说非常方便。@AxelPaccalin还可以推导矩阵位置以获得速度、加速度。除此之外s线性代数适用于它们,因此你可以在任何坐标系之间进行简单的变换。还可以从输入和输出等推导变换。我不使用四元数,但我认为它们不能使用任何四元数…四元数在gfx中使用,因为四元数的速度更快。在很长一段时间内都不是这样o Bresenham…更简单的技术,在过去速度较慢的地方,由于CPU架构的变化,速度要快得多。我认为486是阈值,这就是我的想法(我不久前写了一个基本的游戏引擎,所以我对这些比较熟悉).然而,在这里,我只需要表示从质心开始的旋转,所以没有平移,没有缩放,没有剪切。对于我最初的问题,如果我没有得到我期望的输出,是因为我尝试期望的旋转不是围绕一个轴?还是因为每个轴上的累积旋转在其他?因为我看不出轴的顺序有什么问题,因为旋转向量是围绕sin的
vel+=acc*dt; pos+=vel*dt;
omg+=eps*dt; ang+=omg*dt;