3D几何学习


一、齐次坐标(Homogeneous Coordinates)

OpenGL在三维空间中进行变换的矩阵是一个4 x 4的矩阵,同理向量也是一个4维的向量,其中第四个维度的分量 (分量w) 被叫做齐次坐标。

1. 意义

①可以在透视空间中表示欧式空间上无穷远的点,例如平行线在透视空间中的无穷远处交于一点
在这里插入图片描述

②可以将3维空间上的平移、旋转、缩放都统一表示,从而一连串变换的结合可以用一连串的矩阵相乘表示

2. 定义

1.齐次坐标为0,表示为方向向量,不可位移,齐次坐标非0,则表示为一个点。
2.想要从齐次向量得到3D向量,我们可以把x、y和z坐标分别除以w坐标(通常不会注意这个问题,因为w分量通常是1.0)

3. 变换矩阵

1.位移矩阵
在这里插入图片描述
2.旋转矩阵在这里插入图片描述
3.缩放矩阵
在这里插入图片描述

二、欧拉角(Euler Angles)

以刚体为中心可以建立一个三维的坐标系,旋转前后始终变化不动的是参考系,是静止不动的,而坐标系则固定于刚体,随着刚体的旋转而旋转。如图一以下XYZ坐标轴是旋转的刚体坐标轴;而xyz坐标轴是静止不动的参考坐标轴。

对于在三维空间里的任何一种旋转,刚体的任何旋转都可以用三个欧拉角来表现。对于任何参考系,一个刚体的取向,是依照顺序从其参考系中做三个欧拉角的旋转而设定的。所以,刚体的取向可以用三个基本旋转矩阵来决定。

在这里插入图片描述
合法的欧拉角组中唯一的限制是,任何两个连续的旋转必须绕着不同的转动轴旋转。因此,一共有12种顺规,分别被划分为两类:

经典欧拉角:Z-X-Z, X-Y-X, Y-Z-Y, Z-Y-Z, X-Z-X, Y-X-Y

泰特-布莱恩角(Tait–Bryan angles):X-Y-Z, Y-Z-X, Z-X-Y, X-Z-Y, Z-Y-X, Y-X-Z

可以看出两者的区别是:经典欧拉角的第一个旋转角度和第三个旋转角度都是围绕同一个轴的(例如Z-X-Z,或者 Z-X’-Z’’),而Tait-Bryan角使用三个轴上的旋转角度去表示(例如X-Y-Z或者X-Y’-Z’’)。泰特-布莱恩角又常称为:yaw(偏航,绕Z旋转)-pitch(俯仰,绕Y’旋转)-roll(翻滚,绕X’'旋转)

1. 静态定义(外旋)

① 绕参考系三个轴 (xyz) 的旋转,由于物体旋转过程中坐标轴保持静止,所以称为静态。

② 此时各个变换顺序的旋转矩阵是左乘的

2. 动态定义(内旋)

① 绕物体坐标系三个轴 (XYZ) 的旋转,由于物体旋转过程中坐标轴随着物体做相同的转动,所以称为动态。

② 此时各个变换顺序的旋转矩阵是右乘的

例如规定了旋转顺序,先z,后y,最后x,则:

在这里插入图片描述

三、万向节死锁(Gimbal Lock)

1. 原因

万向节死锁出现在我们使用欧拉角的动态定义时,此时使用泰特-布莱恩角的定义,假设使用的旋转顺序为:

在这里插入图片描述

在大部分时候可以对三个不同的轴方向进行旋转,但是在一些特殊情况下,例如 pitch = 90°/ -90°时,𝑦 轴上的变换角会将 x 和 z 这两个旋转轴对齐,我们就没有任何办法对最初的 𝑧 轴进行旋转了,最终导致丧失了一个自由度。在公式上可以这样表示出来,如图,最后的旋转变为了 x 和 y 轴上的旋转。

在这里插入图片描述
在这里插入图片描述
问题的核心在于我们采用了固定的旋转顺序

2. 解决方法

我们可以尽量控制丢失的维度是我们不经常使用的维度,对应得可以从6个组合中选择合适的组合来满足大部分时候的情形,但解决万向锁最有效的方式是四元数。

四、四元数(quaternion)

1. 复数与旋转矩阵

如果有两个复数 𝑧1 = 𝑎 + 𝑏𝑖, 𝑧2 = 𝑐 + 𝑑𝑖,它们相乘的结果与一个矩阵和向量相乘的结果类似,因此可以把复数的相乘代表矩阵的变换:

在这里插入图片描述
与此同时,我们还可以把复数所代表的矩阵进行拆分,得到一个旋转矩阵和一个缩放矩阵:

在这里插入图片描述
其中缩放矩阵的倍数为复数的模长,而旋转矩阵则代表着逆时针旋转 θ 度,所以复数的相乘其实是旋转与缩放变换的复合

如果存在一个向量 v = [x , y]看做复数 v = x + yi,则可以构造一个复数 z = cos(θ) + i sin(θ),并将其与 v 相乘来进行旋转,旋转后的向量 v’ 可等价用复数的乘法表示:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

将缩放矩阵提出来为一个乘数因子,并利用欧拉公式,可以得到复数的极坐标形式,

在这里插入图片描述

那么,经过旋转 θ 度,缩放 𝑟 倍之后的向量 𝑣′ 就可以这样计算:

在这里插入图片描述
如果只需要旋转 θ 度,可令缩放因子 r = 1,则得到变换后的结果为:

在这里插入图片描述
如果将2个代表2D旋转的单位复数 𝑧1 = cos(θ) + 𝑖 sin(θ),𝑧2 = cos(𝜙) + 𝑖 sin(𝜙) 以及一个向量 𝑣 = 𝑥 + 𝑦𝑖,我们可以先对 𝑣 进行 𝑧1 的旋转,在此基础上再进行 𝑧2 的旋转,如果我们将这两次旋转所作出的等效变换称之为 𝑧net,由于复数的相乘遵守交换律,所以
在这里插入图片描述
进行推导可以得到旋转的复合式子:

在这里插入图片描述
所以当我们对两个 2D 旋转进行复合时,所得到的变换 𝑧net 仍是一个旋转,而且与施加的次序无关.这个等效变换的旋转角是 𝑧1 与 𝑧2 旋转角之和.

2. 罗德里格旋转公式(Rodrigues rotation formula)

由于欧拉角表示法不仅会导致 Gimbal Lock 而且依赖于三个坐标轴的选定,所以定义了轴角式旋转的表示法。在轴角的表示方法中,一个旋转的定义需要使用到四个变量:旋转轴 u 的 𝑥, 𝑦, 𝑧 坐标,以及一个旋转角 θ,也就是我们一共有四个自由度。

在三维空间中定义一个方向只需要用到两个量就可以了(与任意两个坐标轴之间的夹角),最简单的例子就是地球的经纬度,为了消除旋转轴 u 模长这个多余的自由度,我们可以规定旋转轴 ||u|| = 1,能为我们之后的推导带来很多的便利,这也是数学和物理中对方向定义的惯例。

假设我们有一个经过原点的(如果旋转轴不经过原点我们可以先将旋转轴平移到原点,进行旋转,再平移回原处)旋转轴 u = (𝑥, 𝑦, 𝑧),我们希望将一个向量 v,沿着这个旋转轴旋转 θ 度,变换到 v′:

在这里插入图片描述
我们可以将 v 分解为平行于旋转轴 u 以及正交(垂直)于 u 的两个分量,v∥ 和 v⊥,即

在这里插入图片描述
在这里插入图片描述
可以推得平行和垂直的分量:

在这里插入图片描述

在这里插入图片描述

旋转后 v∥ 其实没变,因此只需要着重关注 v⊥,需要构造一个同时正交于 u 和 v⊥ 的向量 w,这个可以通过叉乘来获得

在这里插入图片描述
由于我们使用的是右手坐标系统所以可以得到 w 的方向:

在这里插入图片描述
推理得到:

在这里插入图片描述
在这里插入图片描述
最后将正交与平行的公式带入,可以得到旋转公式:

在这里插入图片描述

3. 四元数

四元数的定义和复数非常类似,唯一的区别就是四元数一共有三个虚部,而复数只有一个。

在这里插入图片描述

将四元数的模长定义为:

在这里插入图片描述

四元数的乘法和复数的乘法不同,其不遵守交换律,即 𝑞1𝑞2 ≠ 𝑞2𝑞1,这也就有了左乘和右乘的区别

如果是 𝑞1𝑞2,那么我们就说「𝑞2 左乘以 𝑞1」,如果是 𝑞2𝑞1,那我们就说「𝑞2 右乘以 𝑞1」,除了交换律之外,我们经常使用的结合律和分配律在四元数内都是成立的。

将四元数3个虚部之间乘法得到的数做成一个表格,表格最左列中一个元素右乘以顶行中一个元素的结果就位于这两个元素行列的交叉处.比如说 𝑗𝑖 = −𝑘.用颜色标记的格子代表着乘法交换律不成立。

在这里插入图片描述

如果一个四元数能写成这样的形式,那我们则称 𝑣 为一个纯四元数 (Pure Quaternion),即仅有虚部的四元数
在这里插入图片描述
如果有两个纯四元数 𝑣 = [0, v], 𝑢 = [0, u],那么:
在这里插入图片描述
基于此,我们还可以写出任意两个四元数相乘的结果(Graßmann 积):

在这里插入图片描述

因为四元数是不遵守交换律的,所以将乘法的逆运算定义为 𝑝𝑞−1 或者 𝑞−1𝑝,注意它们的结果一般是不同的,我们可以使用四元数共轭的一些性质来获得 𝑞−1,在这里首先定义四元数的逆的定义,其中,𝑞−1 是 𝑞 的逆:

在这里插入图片描述

一个四元数 𝑞 = 𝑎 + 𝑏𝑖 + 𝑐𝑗 + 𝑑𝑘 的共轭为 𝑞∗ = 𝑎 − 𝑏𝑖 − 𝑐𝑗 − 𝑑𝑘,𝑞 = [𝑠, v] 的共轭为 𝑞∗ = [𝑠, −v].与共轭相乘得到的即为是四元数模长的平方。
在这里插入图片描述
使用模长来寻找一个四元数的逆会非常高效:
在这里插入图片描述

4. 3D旋转公式

延续之前所说的向量 v 沿着一个用单位向量所定义的旋转轴 u 旋转 θ 度得到 v’ ,对 v 及 v’ 进行分解,得到的分量使用纯四元数来定义,可以得到:
在这里插入图片描述
我们首先讨论正交于旋转轴的 𝑣⊥.我们之前推导过,如果一个向量 v⊥ 正交于旋转轴 u,那么:

在这里插入图片描述
所需要的四元数 𝑞 可以构造为如下:
在这里插入图片描述
就完成了对 𝑣⊥ 的旋转,我们可以得到下面这个定理:

在这里插入图片描述
由于此处的 q 的模长为1,所以,我们构造出来的这个 𝑞 其实是一个单位四元数,他所代表的变换并不会对原向量进行缩放,是一个纯旋转.

在这里插入图片描述
如果一个向量 v∥ 平行于u,那么旋转不会对它作出任何的变换:

在这里插入图片描述
接下来需要对

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值