【几何系列】四元数的基础

William Rowan Hamilton 在 1843 年发明了四元数(quaternions)。他努力推广四元数来描述三维空间,不过当时有很多数学家反对,认为四元数很邪恶。

不过在一个世纪之后,四元数在计算机工业界起死回生,包括计算机图形学、机器人等领域应用广泛。他描述三维旋转简洁、计算高效、也能避免数值误差。

除此之外,四元数在量子力学方面也有应用。

定义

四元数的定义和相关规则如下:

$$q=a+bi+cj+dk$$

其中 $a$、$b$、$c$、$d$ 是标量,而 $i$、$j$、$k$ 是虚数,并遵循以下规则:

$$i^2=-1,j^2=-1,k^2=-1,ijk=-1$$

$$ij=k,jk=i,ki=j$$

$$ji=-k,kj=-i,ik=-j$$

19 世纪末,Josiah Gibbs 提出 3 个虚数可以看做 3 维向量,避免包含那么多的虚数项。于是 $bi+cj+dk$ 变为 $q=a+b\vec{i}+c\vec{j}+d\vec{k}$ 的向量表示,其中 $\vec{i}$、$\vec{j}$、$\vec{k}$ 是单位笛卡尔向量

目前,在计算机图形学中,一般用两种方式表达四元数:

$$\vec{q}=s,\vec{v}$$

$$\vec{q}=s+\vec{v}$$

其中 $s$ 是标量,$\vec{v}$ 是 3D 向量。

这里我们把四元数表示为标量和向量的组合,于是:

$$\vec{q}=s+\vec{v}=s+x\vec{i}+y\vec{j}+z\vec{k}$$

其中 $s$、$x$、$y$、$z$ 为标量。

后面我们会知道 $\vec{v}$ 用于表示旋转轴,而 $s$ 表示旋转角度。

公理

复数是实数的二维延伸,而四元数是复数的四维延伸。除了乘法以外,四元数与复数有相同的公理。

加法

交换律:$q_1+q_2=q_2+q_1$

结合律:$(q_1+q_2)+q_3=q_1+(q_2+q_3)$

乘法

结合律:$(q_1q_2)q_3=q_1(q_2q_3)$

交换律(不满足):$q_1q_2\neq q_2q_1$

加减

对于两个四元数(为了方便,此后向量不再加箭头号):

$$q_1=s_1+x_1i+y_1j+z_1k$$

$$q_2=s_2+x_2i+y_2j+z_2k$$

其加减法为:

$$q_1\pm q_2=(s_1\pm s_2)+(x_1\pm x_2)i+(y_1\pm y_2)j+(z_1\pm z_2)k$$

四元数相乘

结合一下运算规则:

$$i^2=-1,j^2=-1,k^2=-1,ijk=-1$$

$$ij=k,jk=i,ki=j$$

$$ji=-k,kj=-i,ik=-j$$

对于两个四元数:

$$q_1=s_1+v_1=s_1+x_1i+y_1j+z_1k$$

$$q_2=s_2+v_2=s_2+x_2i+y_2j+z_2k$$

相乘之后:

\begin{align*}
q_1q_2 &= s_1s_2-(x_1x_2+y_1y_2+z_1z_2)+s_1(x_2i+y_2j+z_2k)+s_2(x_1i+y_1j+z_1k)+(y_1z_2-y_2z_1)i+(z_1x_2-z_2x_1)j+(x_1y_2-x_2y_1)k\\
&= s_1s_2-v_1\cdot v_2+s_1v_2+s_2v_1+v_1\times v_2
\end{align*}

其中 $s_1s_2-v_1\cdot v_2$ 是标量,$s_1v_2+s_2v_1+v_1\times v_2$ 是向量。

由于 $v_1\times v_2$ 的存在,可以证实四元数乘法不满足交换律。

纯四元数

标量项为 0 的四元数称为纯四元数(pure quaternion)

$$q=0+v$$

对于两个纯四元数 $q_1=0+v_1$ 和 $q_2=0+v_2$,其乘积为:

$$q_1q_2=-v_1\cdot v_2+v_1\times v_2$$

进而可以发现,两个纯四元数的平方为:

$$

\begin{align*}
qq &= -v\cdot v+v\times v\\
&= -v\cdot v\\
&= -\left | v \right |^2
\end{align*}

$$

在 Hamilton 的时代,尤其物理学家对于这个负数结果很难接受,因而拒绝使用四元数而接受 Gibbs 等人的向量分析。

四元数的模

四元数的模(modulus)范数(norm)写作 $\left | q \right |$ ,对于四元数 $q=s+xi+yj+zk$:

$$\left | q \right |=\sqrt{s^2+x^2+y^2+z^2}$$

四元数的模的几何意义是对空间的放缩系数

单位四元数

单位四元数(unit quaternion)是模为 1 的四元数:

$$\left | q \right |=\sqrt{s^2+x^2+y^2+z^2}=1$$

单位四元数尤为重要,如果把它看作是几何变换的话,由于模为 1,所以放缩系数为 1,于是单位四元数它相当于一个描述三维空间的纯旋转动作

任何四元数 $q$ 都可以规范为单位四元数 $\hat{q}$:

$$\hat{q}=$\frac{q}{\left | q \right |}$

共轭四元数

共轭四元数和共轭复数类似,对于某一四元数:

$$q=s+v=s+xi+yj+zk$$

其共轭四元数为:

$$q^*=s-v=s-xi-yj-zk$$

于是我们可以发现:

$$

\begin{align*}
qq^*&=(s+v)(s-v)\\
&=s^2+v\cdot v+sv-sv+v\times (-v) \\
&= s^2+x^2+y^2+z^2
\end{align*}

$$

其乘积是一个标量,进而可得:

$$qq^*=\left | q \right |^2\Leftrightarrow \left | q \right |=\sqrt{qq^*}$$

类似地,我们可以证明:$qq^*=q^*q$。

根据共轭四元数定义和乘法,我们还可以证得:$(q_1q_2)^*=q_2^*q_1^*$。

四元数的逆

$q^{-1}$ 是四元数 $q$ 的逆($q\neq 0$),满足:

$$qq^{-1}=q^{-1}q=1$$

根据定义,两边同乘 $q^*$,可得:

$$q^*qq^{-1}=q^*q^{-1}q=q^*$$

$$\Rightarrow q^*qq^{-1}=q^*$$

$$\Rightarrow \left | q \right |^2q^{-1}=q^*$$

$$\Rightarrow q^{-1}=\frac{q^*}{\left | q \right |^2} $$

显然,如果 $q$ 是单位四元数,即 $\left | q \right |=1$,那么:

$$q^{-1}=q^*$$

由于单位四元数可以表示旋转作用,那么单位四元数的逆就表示对这个旋转作用的抵消作用。关于四元数的更多几何意义推荐观看四元数的可视化

参考

原文地址:https://www.cnblogs.com/noluye/p/12391719.html

时间: 2024-11-14 12:39:26

【几何系列】四元数的基础的相关文章

SQL Server 2008空间数据应用系列四:基础空间对象与函数应用

原文:SQL Server 2008空间数据应用系列四:基础空间对象与函数应用 友情提示,您阅读本篇博文的先决条件如下: 1.本文示例基于Microsoft SQL Server 2008 R2调测. 2.具备 Transact-SQL 编程经验和使用 SQL Server Management Studio 的经验. 3.熟悉或了解Microsoft SQL Server 2008中的空间数据类型. 4.具备相应(比如OGC)的GIS专业理论知识. 5.其他相关知识. SQL Server 2

GL_GL系列 - 总账系统基础(概念)

1. 分类账 分类账是公司财务记录的核心,任何事物处理都必须经过这个环节 主要分类账: 按4C定义的用于保存记录的主要分类账 科目表 日历 币种 子分类续航会计方法 辅助分类续航: 用于辅助目的, 跨国公司可借助其遵守多种法律要求 可不主要分类账不同: 科目表 日历 币种 会计方法 分类续航处理选项 分类账的基本要素 帐套 会计科目结构 - 会计期间 - 本为币币种 - 定义子分类账会计方法 总账中可与分类账共享的元素 账户结构 值集 段值 安全性规则 交叉验证规则 会计日历 期间 期间类型 币

IOS开发系列—Objective-C之基础概览

概览 前面我们已经用了几章内容进行C语言介绍,当然要通过几篇文章完整的介绍C语言的知识是不太现实的,例如C语言的文件操作.内存申请等我们都没有重点介绍,当然核心知识点基本都已经提到了,后面有时间我们会继续扩充.今天我们正式开始学习Objective-C,以后简称"ObjC",ObjC是在C语言的基础上加上了一层面向对象的特性,它完全兼容C语言,甚至可以混写C++.它是Mac OS X和IOS的主要开发语言,从IOS发布之后可以说ObjC的地位呈直线上升趋势,当前ObjC已经是仅次于C语

LNMP系列网站零基础开发记录(三)

[目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 web 页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配置 ... 三.web页面开发 好吧,本来想单独写一章bootstrap的,但是前端确实没什么好写的,这里我们直接结合实际直接开搞吧.做WEB我习惯先把想要的页面模板做完,然后再根据razar或者这里要用到的django template修改.美工确实不太好,P得一手烂图,所以一般都用现成的开源框架,这里我

多线程系列(1)多线程基础和Thread

因为现项目中有用到多线程和并发的知识,所以打算近期补习一下多线程相关的内容.第一篇文章从最基础的开始,就是如何开启一个线程,如何启动线程和阻塞线程等,这篇文章分以下几点进行总结. 多线程初印象 多线程的使用场景 线程的启动,挂起和终止 一个简单的多线程实例 多线程初印象 首先通过一张图来了解一下进程Process,应用程序域AppDomain和线程Thread之间的关系. 从图中可以总结出以下几点: 一个进程Process可能包含多个应用程序域,也包含多个线程,线程也可以穿梭于多个应用程序域当中

【小白的java成长系列】——Java基础知识

今天来说说java的基础知识,个人感觉都不知道要说啥的,还是为后面的内容做一些铺垫吧~ 今天主要说的都是java面向对象之前的基础知识,比如数据类型呀,表达式运算符呀~等等一系列的知识,下节来说说面向对象.今天这节我就不用程序来说明,直接用文字说明.因为个人感觉真木有啥好说的,这些程序后续都会说到的,比较简单,写写就会了的..好吧~开始了... 1. Java数据类型划分: 基本数据类型:都是一个个具体的值 数值型:表示具体的数字,所有的整数默认情况下都是int,所有的小数都是double型的

1Python全栈之路系列之面向基础

Python全栈之路系列之面向对象基础 面向对象基本介绍 Python编程方式: 面向过程编程 面向函数编程 面向对象编程 名称定义: 如果函数没有在类中称之为函数 如果函数在类中称之为方法 创建类 # 创建一个类,类名是Class_basis class Class_basis:     # 在类里面创建了一个方法ret,类里面的方法必须加一个self关键字     def ret(self):         # 当调用方法的时候输出ret         print("ret")

LNMP系列网站零基础开发记录(二)

[目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 Bootstrap 前端页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配置 ...  二.Django 开发环境搭建及配置  1. 开发环境 开发环境依然是Windows,可以开发的django的IDE较多,我只使用过以下几种 Eclipse  免费IDE,需要下载pydev插件,代码提示功能不错 Visual Studio 需要下载PTVS,结合了VS强大的编

LNMP系列网站零基础开发记录

[目录] 扯淡吹逼之开发前奏 Django 开发环境搭建及配置 Bootstrap 前端页面开发 Django app开发 Django 站点管理 Python 简易爬虫开发 Nginx&uWSGI 服务器配置 ... 一.扯淡吹逼之开发前奏 终于答辩完了,实在没什么事,作为一个死宅到底的码农,只有呆在宿舍写程序玩. 以前项目都是基于Windows平台开发的,主要是.NET和C++,一直想学一学python,可是没有项目驱动实在是没动力,看了文档不动手过几天就忘了,好吧,我们干脆就开发一个开发的