对四元数的理解

前言

虽然说四元数这个概念确实很抽象,但是在将其应用在旋转任务的这个层面上,我们只需要记住以下几个关键的式子,即可全面理解四元数表示旋转的概念。

参考书籍/灵感来源:

Ganovelli, F., Corsini, M., Pattanaik, S., & Benendetto, D. M. (2014). Introduction to computer graphics: Figures slideds: A practical learning approach. Chapman & Hall/CRC.

(具体单元:4.5 Rotations in Three Dimensions)

参考视频:

【1】https://www.bilibili.com/video/BV1mu41167je

【2】https://www.bilibili.com/video/BV1kY4119716

问题定义

我们采用书籍中的定义,将 p \mathbf{p} p(粗而不斜)定义为三维空间内的一个,再将 r \boldsymbol{r} r定义为三维空间内的一条向量,且其准确定义为:
r = o + t d , t ∈ ( − ∞ , ∞ ) \boldsymbol{r}=\mathbf{o}+t\boldsymbol{d},t\in(-\infin,\infin) r=o+td,t(,)
题外话:(这个定义其实在很多模型,比如NeRF中射线的定义,都被applied了,当然细节会有些不同,不过也很常用了)

而我们的问题很简单:将点 p \mathbf{p} p r \boldsymbol{r} r按右手螺旋定则(拇指朝向 r \boldsymbol{r} r,剩余四指包住 r \boldsymbol{r} r,即为旋转方向)旋转相应的角度 α \alpha α,求得旋转后 p ′ \mathbf{p^{\prime}} p的位置。

四元数解法

为了不使问题复杂化,我们直接先说四元数解法,之后再讲一般解法。有人会讲什么,四元数的定义是一个实部,三个虚部什么的,从这些最初始的定义听起,听着都头大。

此处,我们给出唯一认准的,已被证明的,可以用来表示旋转那个四元数,就——是——它——
q = ( cos ⁡ α 2 , sin ⁡ α 2 r ) ∈ R 4 , ∣ ∣ r ∣ ∣ = 1 q=(\cos{\frac{\alpha}{2}},\sin{\frac{\alpha}{2}}\boldsymbol{r})\in\mathbb {R}^{4},||\boldsymbol{r}||=1 q=(cos2α,sin2αr)R4∣∣r∣∣=1
这个 q q q就是一个可以直接将点 p \mathbf{p} p转过去的四元数。甭管为什么,证明过程很复杂,几乎都是爆算,但是数学先驱们已经证明了它的准确性。而想要求得旋转后的点 p ′ \mathbf{p^{\prime}} p的坐标,只需采用
p ′ = q p q − 1 \mathbf{p^{\prime}}=q\mathbf{p}q^{-1} p=qpq1
这个式子最终可以被精确概括为Unity引擎里的一句常用命令

public void RotateAround(Vector3 point, Vector3 axis, float angle);

(我忘了这个命令是不是deprecated了,懒得去查了

细节一点

在刚给出的上式 p ′ = q p q − 1 \mathbf{p^{\prime}}=q\mathbf{p}q^{-1} p=qpq1中,须注意:

  1. 这里的 q q q是四维向量,而这里的 p \mathbf{p} p p ′ \mathbf{p^{\prime}} p也做了特殊处理,如 p = ( 0 , p x , p y , p z ) \mathbf{p}=(0,p_{x},p_{y},p_{z}) p=(0,px,py,pz) p ′ \mathbf{p^{\prime}} p同;

  2. 这里的乘法是四元数定义的乘法,即:
    p q = ( p w q w − p ⋅ q , p w q + q w p + p × q ) , p = ( p x , p y , p z ) pq=(p_{w}q_{w}-\boldsymbol{p\cdot q},p_{w}\boldsymbol{q}+q_{w}\boldsymbol{p}+\boldsymbol{p}\times\boldsymbol{q}),\boldsymbol{p}=(p_{x},p_{y},p_{z}) pq=(pwqwpq,pwq+qwp+p×q),p=(px,py,pz)
    看,很复杂吧,所以才不要在前面细讲,会晕死。至于其定义的推导过程,请看参考视频【1】

一般解法

其实就是暴力建立坐标系然后去算,在【1】里也讲了。以及欧拉角表示的万向锁问题,其实就是一个欧拉对(三维向量嘛)不能唯一确定一个旋转,所以不是一个严谨的旋转表示方法。

延伸

【2】中有提到旋转矩阵与四元数旋转的结合,挖坑,之后看看(不一定写博客)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值