欢迎光临ELBE网站!
您的位置: ELBE > 行业资讯 > 四元数应用——转矩阵、Slerp插值与万向节
网站头像

文章分类

Article classification
联系我们

ELBE

电话:021-58780503 微信:18017854633 邮箱:sales_fullyear@126.com 地址:上海市浦东新区城南路168弄3号峰汇商务广场B座911室
四元数应用——转矩阵、Slerp插值与万向节
时间:2022-12-16 查看:33 作者:小叶

四元数系列:

四元数-基本概念

四元数-旋转

四元数应用-转矩阵Slerp插值与万向节

四元数应用-旋转混合顺序无关

—————————————————————————————————————————

今天,我们来谈谈一些关于四元数的例子。与前两篇文章相比,它们可能有点分散,这是对前两章的补充说明。具体来说,我们将讨论三个问题。第一个是四元数和矩阵的转换,第二个是四元数的插入值。最后,我们来谈谈万向节锁的问题。话不多说,开始谈话。

1.四元数矩阵形式

目前,大多数底层的图形API,空间坐标的转换仍然基于矩阵。因此,当我们使用四元数来操作旋转时,最终传输给顶点着色器的数据应以矩阵的形式进行。然而,从应用层的角度来看,我们可以通过满足以下公式来实现转换。

我相信大多数人对背诵公式并不满意。推导公式的主要方法有两种。其中一个是从代数的角度解决问题。直率地说,这是一个硬算。我们在四元数和旋转(2)中提到了一个公式:

我们可以找到三个矩阵,然后添加上述转换公式。这里没有推导,感兴趣的人可以自己计算。以下是一种更灵性的证明方法。当给出以下两个四元数时:

如下图所示:

可以说,两个四元数相乘转换为矩阵L右乘四元数q。发散思维,把这种行为写成矩阵R左乘四元数q,具体形式如下图所示:

最体看L和R括号中的四元下标非常重要,因为四元不符合交换规律,括号中的下标实际上是不同的我们必须注意这个地方。基础知识完成后,直接应用于下面。根据旋转公式和上述定义,我们很容易得到以下公式:

然后将L和R在上述矩阵中,我们可以得到:

证毕!

2.四元数的Slerp插值

事实上,插值问题一直是图形学中的一个经典问题。一般来说,线性插值可以满足大多数情况,但对于旋转,线性插值肯定不好。让我们下图:

很明显,左图(线插)比右图(球插)差。从动画的角度来看,为了保证每帧的旋转均匀变化,线性插值得到的旋转结果必须不均匀,主要考虑旋转角度。然后我们从代数的角度来思考。如果两个单位的四元数之间的插值,如左图的线性插值,则得到的四元数不得为单位的四元数。我们希望旋转插值不会改变长度,因此显然右图的球面(Slerp)插值更合理。

四元数球面插值证明很多,Wiki上面有非常详细的证据和实现Code。事实上,主要思想是施密特正交。首先,根据 和 解算两个正 交四元,然后通过加权计算最终 。下图可以很好地解释这件事。

下面主要讨论的是这个问题。上图给出了一种球面插值公式,暂时称为加法形式。由于四元旋转是相乘的,我们的上述公式也可以写成:

鉴于刨根问底的精神,先说四元数的差异。(Difference),这更容易理解,类似于矩阵,A与B的差异可以理解为先旋转A,然后旋转B,得到A和B两者之间的差值,表示为 。然后,如果我们去t倍差或直接说差乘以t因子,我们将引用四元数和旋转(1)中提到的四元数指数形式。对于 ,我们来看看 和 具体情况如下:

最后我们令 以及 ,根据以下公式重新审视球面插值:

可见,两种表现形式可以相互转化。

三、万向节死锁

事实上,这个问题不能算作四元的应用。在万向节锁的早期阶段,它被用来处理旋转过程中机械臂缺乏自由度的问题。由于当时机械臂的关节是单自由的,在模拟人体的一些球形关节(自由度为3的关节)时,将使用三组正交机械关节进行模拟。

如图所示,当关节2旋转90时,机械关节1-3共同模拟手腕活动°之后关节1和关节3会重叠,所以旋转关节1和旋转关节3只会沿着 旋转轴,这就是万向节锁。值得一提的是,当你旋转关节1、关节2和关节3时,当你旋转关节3时,无论如何旋转都不会影响关节2和关节1,所以只有关节2旋转90°万向节锁会产生。

当早期的计算机动画移动机器人时,最简单的方法是直接模拟欧拉角的旋转。这导致了通用锁。那么如何理解计算机动画中的这个问题呢?毕竟,动画中没有机械关节。

假设三个欧拉角的旋转顺序如下

当 的时候, 和 它将重叠,如右图,从而产生万向节锁。

因此,为了避免这个问题,图形旋转开始使用轴角,因为轴角可以说三个欧拉角等同于绕特定轴旋转的角度。OpenGL有个函数glRotate实现函数的方法是使用轴角。当然,并不是说轴角没有万向锁。当三个正交轴角按一定顺序旋转时,仍然会产生万向锁,但这种情况很难发生。

所以轴角解决了这个问题,为什么要用四元数?

4.总结四元数

最后点一个问题,呼应前面的文章,具体说说四元数的好处:

解决万向节锁(Gimbal Lock)问题。(不要用四元数模拟欧拉角!)只需存储4个浮点,比矩阵轻。例如,矩阵至少需要9个float表示旋转信息,即使加上旋转缩放,也会比矩阵少存2-6个float,对于在PC游戏的开发可能并不明显,毕竟,现在内存很大,但在家用机器(尤其是上一代)中,内存相对较紧是相当有利的。无论是求逆、串联等操作,四元数都比矩阵更高效。例如,逆转相当于逆转。即使是正交矩阵,转移的操作成本也远高于逆转。此外,在大多数情况下,由于缩放,逆转操作将更加复杂。然而,使用四元数需要考虑转换四元数和矩阵的成本,但综合考虑,四元数的运行成本相对较低。

基本上四元数在我这里就结束了,以后会有人请人 @Obsver Anonym 请期待更新一篇具体应用的文章!

继续阅读与本文标签相同的文章
cache
Processed in 0.008184 Second.