仅为个人学习网易的3d数学基础笔记。
前言:
为什么需要向量的变换?比如模型的顶点坐标,通常是保存在模型的坐标空间,当渲染该模型到屏幕上时,需要将其坐标转换到摄像机空间。
1 线性变换
1.1 坐标变换
设在一个3D坐标定义一个坐标系 C ,点P 为 <x,y,z>。再定义另一个坐标系 C’ ,点P’ 为 <x’,y’,z’> 。点P’ 可以通过 C 中 P 的坐标线性变换得到 。
矩阵形式:
T 表示 C 的原点到 C’的原点的平移量
U,V,W 为列向量的矩阵表示将C的坐标轴变换到C’的坐标轴朝向的变换量。
1.2 缩放
1.2.1 等比缩放
一个系数 a 对向量 P 进行缩放变化 C’ = aP 。矩阵形式:
1.2.2 非等比缩放
对角线系数不一定相等。矩阵以及逆矩阵表示
1.3 旋转
如图,将向量P绕轴A旋转 θ 度,A的模长为1!!! 。可以将P分解为平行垂直A轴的两个分量如图标注。
平行A轴的分量是怎么来的?注意这个 A 的模长。首先 A · P = |A||P|cosθ = |P| cosθ。得到P在A轴上投影的长度,再乘一个A,得到方向。
平行A轴分量不受旋转影响,所以问题简化为垂直分量绕A轴旋转并加上不变的平行分量。
为了方便分析,把该垂直分量旋转的平面建立一个二维坐标系,其中垂直分量为一个基向量,另一个基向量是同时垂直于轴A和垂直分量。如图
这条向量可以通过A X P 得到,对于垂直分量旋转 θ 变换后的表示如下图
怎么来的呢?如下分析
A X P 垂直的面包含了垂直分量这个向量,所以他们相互垂直,画出辅助线,两者投影分量相加就是结果。
将旋转分量加入到平行分量,最终公式如下:
将叉乘点积换成公式:
合并,c = cos角度,s = sin角度
2 齐次坐标系统
将点P从一个坐标系变换到另一个坐标系,同时考虑缩放旋转平移。最终公式如下:
M 是一个 3 * 3 矩阵,表示旋转缩放,T是一个三位平移向量。
但是变换多次,多次将P‘ 带入 P ,式子十分冗长,因此需要齐次坐标,并使用一个 4 * 4 矩阵进行变换。
齐次坐标就是将点P扩展成四维向量<x,y,z,w> w = 1(w = 1 表示坐标点 ,0 表示向量)变换矩阵M 和 平移向量 T 合成如下:
要将齐次坐标转换为原3D坐标系中:
w 不能为 0 ,对于坐标点,平移旋转缩放等线性变换 w = 1不变。但是投影变换会改变 w 的值。
3 组合变换
如果将一个立方体,先缩放,再旋转,再平移。变换矩阵分别为 S R T。那么立方体八个顶点变换可以写作:
矩阵结合律:
这样,我们定一个矩阵C = SRT,封装为一个矩阵组合变换。这样计算效率更高,从三次矩阵向量乘法变为一次。
4 欧拉角
矩阵旋转变换不能实现插值且空间大,因此有了欧拉角
4.1 定义
是一种形式来表达旋转变换。简单说,就是模型绕坐标系三个坐标轴的旋转角度。
坐标系可以是世界坐标系或者物体坐标系。欧拉角不一定唯一,且模型任意旋转都可以分解为欧拉角形式。下图pitch- yaw - roll欧拉角系统,对应颜色的轴对不同颜色对旋转角度。
但是,欧拉角有个最大的bug就是万向锁。因此3D引擎大量使用四元数。
5 四元数
相较于旋转矩阵优点:插值均匀,空间小等等
5.1 定义
四元数是简单的超复数。类似于复数,但是有三个虚部单位<i ,j ,k>。
一个四元数q表示如下:
更简单的写法:
q = s + v.
其中,s是标量部分,也就是w,v是向量部分<x,y,z>。
5.2 四元数使用
如果给定单位旋转轴<x,y,z>和一个角度θ。对应四元数如下:
5.3 四元数性质
四元数中,虚部满足一下性质:
四元数不满足交换量律所以要注意乘法顺序,四元数乘法如下:就是一个个乘
以简单版的标量向量形式:
四元数也具有共轭四元数。
长度(也就是模长):
5.4 四元数插值运算
四元数插值运算是很大的优势。
给定四元数 q1,q2,q1是结果,其中 t = [0 , 1] ,插值过程如图:
从图中可以看出,线性插值结果为虚线部分,当t改变,qt沿着弦变换,导致t以恒定速度但是角度并非以恒定速度变换。所以需要使用球面线性插值:
θ 就是两个四元数的夹角。球面插值保证的t改变角度恒定变化。