【学习笔记】计算机图形学的几何数学基础知识
3D坐标系
左手系和右手系
点
x,y,z与w(齐次坐标)
矩阵
- 第一个下标表示行号,第二个下标表示列号。
- 矩阵乘法不满足交换律
- 矩阵乘法=矩阵合并
- 一个矩阵乘以它的逆矩阵=单位矩阵
变化矩阵
平移矩阵
缩放矩阵
除了可以缩放,
还可以利用缩放,在给定右手系的情况确定左手系,相互转换
旋转矩阵
3D空间中旋转物体,需要指定旋转轴和旋转角
向量
向量的加减法
归一化
点积的应用
- 求两个向量的夹角 (单位向量点积)
- 是否正交
- 是否同向
- 是否平行相反
- 是否在夹角范围内
- 向量大小
- 点到平面的距离
叉积的应用
生成一个正交于两个向量的向量
遵循右手定则
局部空间与世界空间
局部空间 local space:物体的坐标系,又名模型空间 model space 物体空间 object space
在世界空间中为对象定位及定向的矩阵称为模型矩阵,通常记为 M
视觉空间和合成相机
已知OpenGl相机的位置永远是原点,相机的方向永远是z轴负方向,相机的上方永远是y轴正方向。
那么想要将物体放到相机前方,需要将物体的坐标系转换到相机坐标系即可。
我们根据虚拟/期望的相机位置/欧拉角,来计算视图变换矩阵,将物体从世界坐标转换到相机坐标系。
将平移和旋转矩阵(相机从原点移动到期望位置)合并得到的矩阵称为视图变换矩阵(viewing transform),记作 V。
视图变换矩阵
模型-视图(Model-View,MV)矩阵:模型空间直接转换至相机空间(把M模型矩阵和V视图变换矩阵合并了)
投影矩阵
透视投影矩阵
参数:纵横比、视场、近剪裁平面(也称投影平面)、远剪裁平面
视场 Field Of View, FOV:是可视空间的纵向角度
横纵比 aspect ratio:远近剪裁平面的宽度与高度之比
正交投影矩阵
参数:
(a)从相机到投影平面的距离 znear;
(b)从相机到远剪裁平面的距离 zfar;
(c)L、R、T 和 B 的值,其中 L 和 R 分别是投影平面左、右边界的 x 坐标,T 和 B 分别是投影、平面上、下边界的 y 坐标。
LookAt矩阵
当你想要把相机放在某处并看向一个特定的位置时,就需要用到它。
参数
- 叉积计算
- fwd相机正面
- side相机侧面
- up相机上面
- 相机位置
- 目标位置
构建矩阵变换的GLSL函数
GLSL 中用于初始化 mat4 矩阵的语法以列为单位读入值。
//矩阵实现
问题与思考
矩阵对点和对向量的变换有什么区别?为什么说对向量使用与点相同的变换需要使用变换矩阵的逆转置矩阵?但某些情况下又不用?
总结
- 点:直接使用变换矩阵。
- 普通向量:直接使用变换矩阵。
- 法向量:通常使用逆转置矩阵,除非变换矩阵是正交矩阵。
为什么
1. 为什么说使用逆转置矩阵可以确保向量在变换后仍垂直于表面。为什么没逆转置之前不行?
- 缩放变换:
- 如果表面在某个方向上缩放,法向量需要在相反的方向上缩放以保持垂直。
- 逆转置矩阵会自动调整法向量的方向,使其与变换后的表面垂直。
- 错切变换:
- 错切会使表面倾斜,法向量需要相应调整以保持垂直。
- 逆转置矩阵能够正确调整法向量的方向。
2. 如何将一个矩阵逆转置?这个矩阵经历了什么变换?
3. 正交矩阵的逆装置矩阵=原矩阵吗?
是的,因为正交矩阵的性质
正交矩阵性质
正交矩阵具有以下重要性质:
-
列向量和行向量的正交性:
-
正交矩阵的列向量是两两正交的单位向量。
-
正交矩阵的行向量也是两两正交的单位向量。
-
-
行列式的值:
- 正交矩阵的行列式的值为 ±1±1,即 det(Q)=±1det(Q)=±1。
-
逆矩阵:
- 正交矩阵的逆矩阵等于其转置矩阵,即 Q−1=QTQ−1=QT。
-
保持内积和长度:
-
正交矩阵保持向量的内积和长度不变。对于任意向量 xx 和 yy,有:
(Qx)⋅(Qy)=x⋅y(Qx)⋅(Qy)=x⋅y∥Qx∥=∥x∥∥Qx∥=∥x∥
-
-
保持角度:
- 正交矩阵保持向量之间的夹角不变。
4. 正交矩阵的定义是什么?
正交矩阵与它的转置相乘=单位矩阵,
5. 矩阵的转置操作和逆矩阵是怎么定义的?
转置:把行列互换
逆矩阵:AB=BA=E(单位矩阵)
习题
3.1 旋转 顶点着色器
void buildRotateZ(float angle)
{
float radian = radians(angle);
float s = sin(radian);
float c = cos(radian);
mat4 rotate = mat4(c, -s, 0.0, 0.0,
s, c, 0.0, 0.0,
0.0, 0.0, 1.0, 0.0,
0.0, 0.0, 0.0, 1.0);
gl_Position = rotate * gl_Position;
}
3.2 研究万向节死锁
欧拉角的一种现象
当两个旋转轴对齐时,系统失去一个自由度,导致无法表示某些旋转。
为什么
(假设旋转顺序为XYZ)
- 不同的欧拉角旋转顺序会导致不同的结果
- 顺序在前的轴旋转会带动顺序在后的旋转
- 顺序在后的不会带动顺序在前的
变换而非运动
欧拉角的变换是固定顺序的xyz的旋转,仅有一次变化的变换,而非不断变换的旋转运动。
是给定参数下的,相对于初始状态的变换。
导致的问题
插值动画的插值问题
解决方法
使用矩阵旋转(难以插值)或者四元数
3.3 研究学习四元数
基本概念
四元数是一种扩展了复数的数学结构,由一个实部和三个虚部组成,通常表示为:
q
=
w
+
x
i
+
y
j
+
z
k
q = w + xi + yj + zk
q=w+xi+yj+zk
其中:
- ww 是实部。
- x,y,zx,y,z 是虚部。
- i,j,ki,j,k 是虚数单位,满足以下规则:
四元数也可以写成向量形式:
q = [ w , v ] q = [w, \mathbf{v}] q=[w,v]
四元数与3D旋转
四元数可以表示3D空间中的旋转,具体方法如下:
(1)旋转表示
- 给定一个旋转轴 u=(ux,uy,uz)u=(ux,uy,uz)(单位向量)和旋转角度 θθ,对应的单位四元数为:
q = [ cos ( θ 2 ) , sin ( θ 2 ) u ] q = \left[ \cos\left(\frac{\theta}{2}\right), \sin\left(\frac{\theta}{2}\right) \mathbf{u} \right] q=[cos(2θ),sin(2θ)u]
(2)旋转向量
-
给定一个向量 v=(vx,vy,vz)v=(vx,vy,vz),用四元数 qq 旋转该向量的公式为:
$$
\mathbf{v}’ = q \mathbf{v} q^{-1}
$$其中,vv 被表示为纯四元数 [0,v]。
四元数的优势
-
避免万向节死锁:
- 四元数通过一个统一的数学结构表示旋转,不依赖于旋转顺序,因此不会出现万向节死锁问题。
-
插值平滑:
- 四元数支持高效的插值方法(如球面线性插值,Slerp),可以在两个旋转之间实现平滑过渡。
-
计算高效:
- 四元数的旋转计算比旋转矩阵更高效,尤其是在需要频繁旋转的场景中(如动画、游戏)。
-
紧凑表示:
- 四元数只需要4个浮点数(相比旋转矩阵的9个),存储和传输更高效。