四元数

news/2024/10/3 2:26:56

四元数

定义

【四元数的可视化】 https://www.bilibili.com/video/BV1SW411y7W1/?share_source=copy_web&vd_source=ac806c24de13bf5f509bf105a8578e24

\[0.00 + 8.46i + 2.64j + 3.38k\\ \]

最左侧实数称为标量部分,右侧\(ijk\)虚部称为向量vector

\[i^2+j^2+k^2=1\\ ij=-ji=k\\ ki=-ik=j\\ jk=-kj=i \]

\[(w_1 + x_1i + y_1j + z_1k)(w_2 + x_2i + y_2j + z_2k)\\ =(w_1w_2 - x_1x_2 - y_1y_2 - z_1z_2)\\ +(w_1x_2 + x_1w_2 + y_1z_2 - z_1y_2)i\\ +(w_1y_2 + y_1w_2 + z_1x_2 - x_1z_2)j\\ +(w_1z_2 + z_1w_2 + x_1y_2 - y_1x_2)k \]

用四元数来描述矩阵相乘

\[\vec v_1=\begin{bmatrix}x_1\\y_1\\z_1\end{bmatrix} =(w_1 + x_1i + y_1j + z_1k)\\ q_1=(w_1,\ \vec v_1) \\ \vec v_2=\begin{bmatrix}x_x\\y_x\\z_x\end{bmatrix} =(w_2 + x_2i + y_2j + z_2k)\\ q_2=(w_2,\ \vec v_2) \\ q_1\cdot q_2=(w_1w_2 - \vec v_1\cdot \vec v_2,\ w_1\vec v_2 + w_2\vec v_1 + \vec v_1 \times \vec v_2) \]

\(q_1\cdot q_2 = (\frac{q_1}{\lVert q_1\rVert})\lVert q_1 \rVert\cdot q_2\)

\(q_1\cdot q_2\)会将\(q_2\)的大小拉伸到\(q_1\)的大小(上市括号外的内容),然后施加一个特殊的四维旋转(上式括号内的内容)

四维超球投影到三维空间,在单位球内的是\([-1,1]^4\),超出\([-1,1]^4\)的点投影到了单位球外,延申至无穷远

投影过程可参考二维到一维、三维到二维的球极投影

四元数在三维点上的应用

【四元数和三维转动,可互动的探索式视频(请看链接)】 https://www.bilibili.com/video/BV1Lt411U7og/?share_source=copy_web&vd_source=ac806c24de13bf5f509bf105a8578e24

当想绕某个轴旋转某个角度时,首先用一个单位向量(\(ijk\)经过归一化,三者平方和为\(1\))定义这个轴,对于三维向量,其实部为\(0\)\(xyz\)作为\(ijk\)的系数

之后,若想旋转的角度是\(\theta\),则使用半角\(\theta/2\)的余弦值作为实部,正弦值乘以四元数向量

如:\(q=(\cos(40^{\circ}/2)+\sin(40^{\circ}/2)(0.67i-0.67j-0.33k))\)

如果想对一点\(p\)应用这个旋转,只需\(p'=q\cdot p\cdot q^{-1}\)即可,就能得到旋转后的坐标\(p'\)\(p'\)是一个四元数,其实部为0,\(ijk\)向量系数即为旋转后的三维坐标

为什么是\(q\cdotp\cdot q^{-1}而不是q\cdot p\)

\(q\)的本质是一个空间变换,旋转变换是其中一环,旋转*缩放=空间变换

四元数有一个性质是可逆的

那么(旋转*缩放)p / 缩放 = 旋转*p?

然而这样做是不行的,因为空间变换\(q\)必定包含旋转和缩放

于是可以用到左右手螺旋定则

\(q\)左乘\(p\)或右乘\(p\),只会影响旋转的方向,不会影响缩放的方向

\(q\cdot p\)\(q^{-1}\cdot p\)的异同在于二者旋转一样缩放相反

于是可以通过\(q\cdot p\cdot q^{-1}\),左乘\(q\)和右乘\(q^{-1}\)分别完成半个\(\theta\)角度的旋转,而\(q\)\(q^{-1}\)又刚好抵消掉了缩放

四元数插值

要在两个四元数之间进行球面线性插值(Spherical Linear Interpolation), Slerp()。球面线性插值可在球面表面大圆的弧线上做匀速率运动,因此对于旋转插值有两个期望的性质

  • 旋转插值路径使得扭矩最小化:两个旋转之间的路径是旋转空间中所能得到的最短路径
  • 插值有很顶角速度:动画参数\(t\)的变化量和所得旋转的变换了的关系在插值过程中是恒定的,换句话说,在插值范围内,插值速度是恒定的

\[slerp(q_1, q_2. t)=\frac{q_1\sin((1-t)\theta)+q_2\sin(t\theta)}{\sin\theta}\\ t\in[0,1] \]

Shoemake(1985)提出的公式

\[q_\bot=q_2-(q_1\cdot q_2)q_1 \\ q'=q_1\cos(\theta t)+\hat q_\bot\sin(\theta t) \]

PBRT中的公式

以一种更直观的方式理解

考虑在2D平面下的两个单位圆上的向量\(v_0\)\(v_1\),二者夹角为\(\theta\),想要计算二者之间角度为\(\theta'\)的插值向量,可以寻找正交于\(v_0\)的向量\(v_\bot\),再应用三角恒等式\(v'=v_0\cos\theta'+v_\bot\sin\theta'\)

那么要计算\(q'\),首先要在四元数空间种计算一个正交坐标系,一个轴为\(q_1\),另一个是于\(q_1\)正交的四元数\(q_\bot\),这样两轴就构成张开\(q_1\)\(q_2\)的基

可以通过将\(q_2\)投影到\(q_1\),再由\(q_2\)减去这一部分得到\(q_\bot\)

\(q_\bot=q_2-(q_1\cdot q_2)q_1\)

那么插值四元数为\(q'=q_1\cos(\theta t)+\hat q_\bot\sin(\theta t)\)

要注意的点

在插值时应检查两个四元数是否几乎平行

  • 二者几乎平行,则按顺序对四元数分量用普通的线性插值以避免数值不稳定

  • 否则,按\(q_\bot=q_2-(q_1\cdot q_2)q_1\)

    \(q'=q_1\cos(\theta t)+\hat q_\bot\sin(\theta t)\)

    插值计算四元数

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.ryyt.cn/news/55348.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

GAMES102 Lecture 01

Lecture 01图像是离散的像素图形是具有数学意义的点、线、面,是连续的,有数学表达的渲染是在解积分方程仿真是在解偏微分方程函数拟合 线性空间元素之间有运算:加法、数乘 线性结构:对加分和数乘封闭加法交换律、结合了、数乘分配律基/维数:\(L=span\{V_1,V_2,...,V_N\} =…

乡味

今天又吃到了小时候的五仁月饼,香得很。前天是外公的忌日,老妈回去看他们的时候从小镇给我买的。 小时候,我家房后就是一家食品加工厂,做蛋糕做月饼。印象中每年中秋那一段时间,我家那一片儿总是弥漫着甜丝丝的味道。那会儿我总是盼着,盼望着中秋啥时候来啊,外婆啥时候来…

scroll相关

本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/p/18391275

nodejs起一个http2

静态页面 其实就是复制官网的代码 其中证书 是我自己申请的可以用证书 dingshaohua.comimport fs from "fs"; import http2 from "node:http2";const server = http2.createSecureServer({key: fs.readFileSync("/etc/letsencrypt/live/dingshaohua.c…

Tmux使用介绍

Tmux使用介绍 Tmux是一个终端复用器(terminal multiplexer)。如果您有使用screen的经历的话,您可以理解为Tmux是screen的不同实现软件。本教程将讲解Tmux的基础用法。 会话与进程 命令行的典型用法是打开终端(terminal)后,在里面输入指令。用户的这种与计算机交互的手段,…

Lecture 04 Rendering on Game Engine

Lecture 04 Rendering on Game Engine Challenges on Game Rendering成千上万不同类型的物体 在现代计算机上跑(CPU、GPU的复杂结合) 稳定帧率帧率 分辨率限制CPU带宽和内存渲染只占20%左右,剩下留给Game logic、网络、动画、物理和AI系统等等Outline of RenderingBasics of…

样式及结构复用

本文来自博客园,作者:jialiangzai,转载请注明原文链接:https://www.cnblogs.com/zsnhweb/p/18391257

Lecture 02 Layered Architecture of Game Engine

Lecture 02 Layered Architecture of Game Engine 渲染只是游戏引擎中不大的一部分Tool Layer 工具层 这部分不是实时的,所有可以允许多种实现方法(C++/C#开发等等)DCC Digital Content Creation 将不同文件导入成AssetsFunction Layer 功能层每个tick依次做完所有内容 多线…