Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

第4章 学习Shader所需的数学基础-矩阵的几何意义

注意:图片的来源基本来自作者冯乐乐的GitHub,感谢作者分享

https://github.com/candycat1992/Unity_Shaders_Book

 

点和矢量可以在图像中画出来,矩阵变换(旋转、缩放和平移)也能够可视化

给定一个点或者矢量,给定一个变换(矩阵),就可以通过数学运算求得新的点和矢量

 

什么是变换:

把一些数据,如 点、方向矢量 甚至是 颜色等,通过某种方式进行转换的过程。

 

变换类型1:线性变换

保留 矢量加 和 标量乘 的变换

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

如:f(x)=2x 表示 经过变换后矢量 x的模将被放大两倍

 

如果要对一个三维矢量进行变换,那么使用 3×3 的矩阵,就可以表示所有的 线性变换

缩放、旋转、错切、镜像、正交投影 都是线性变换

 

变换类型2:平移变换

f(x) = x + ( 1, 2, 3)

如果 x = (1, 1, 1),那么:

f(x) + f(x) = ( 4, 6, 8)

f(x + x) = (3, 4, 5)

不满足标量乘法,也不满足矢量加法。(不属于线性变换,无法使用 3×3 矩阵表示一个平移变换)

 

变换类型3:仿射变换(线性变换 + 平移变换)

把矢量扩展到四维空间(4×4矩阵)下,即 齐次坐标系,然后可以使用 4×4矩阵表示这个变换

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

齐次坐标(四维齐次坐标 4×4矩阵):

齐次坐标的维度可以超过四维,齐次坐标是为了方便计算而使用的一种表示方式

为了能够让矩阵表示平移操作,将三维矢量转换为四维矢量,扩展到了 4×4矩阵,多一个维度可以实现对平移的表示

 

三维矢量转换成四维矢量(齐次坐标):

点:把 w 分量设置为 1

当用一个 4×4矩阵 对一个点进行变换时,平移、旋转、缩放,都会施加于这个点。

方向矢量:把 w 分量设置为 0

当用一个 4×4矩阵 对一个方向矢量进行变换时,平移的效果会被忽略

 

基础变换矩阵:纯平移、纯旋转、纯缩放 的变换矩阵

基础变换矩阵的分解(4个组成部分):

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

 

使用 4×4矩阵表示平移、旋转 和 缩放

1、平移矩阵:使用矩阵乘法表示。

平移矩阵不属于正交矩阵

 

平移矩阵:

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

反向平移矩阵:平移矩阵的逆矩阵

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

对一个点进行平移变换:

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

点的 x、y、z 分量分别增加了一个 位置偏移

 

在3D中可视化效果:点( x, y, z )平移了单位

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

 

对一个方向矢量进行平移变换:

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

平移变换不会对方向矢量产生任何影响。矢量没有位置属性,也就是说矢量可以位于空间中的任意一点,因此对位置的改变(即平移)不会对方向矢量产生影响。

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

 

2、缩放矩阵:使用矩阵乘法表示

缩放矩阵一般不是正交矩阵。

缩放矩阵:只适合用于沿坐标轴方向缩放。如果希望在任意方向上进行缩放,就需要使用一个 复合变换(先将缩放轴变换成标准坐标轴,然后进行沿坐标轴的缩放,再使用逆变换得到原来的缩放轴朝向)。

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

缩放矩阵的逆矩阵:原缩放系数的倒数,对点 或者 方向矢量 进行缩放。

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

对一个模型沿空间的 x轴、y轴 和 z轴 进行缩放:

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

对一个方向矢量使用同样的缩放矩阵进行缩放:

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

 

统一缩放:缩放系数都相等

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

从外观上看,同一缩放是扩大整个模型,非统一缩放会拉伸或者挤压模型。

统一缩放不会改变角度和比例关系,而非统一缩放会改变与模型相关的角度和比例。

例如在对法线进行变换时,如果存在非统一缩放,直接使用用于变换顶点的变换矩阵的话,就会得到错误的结果。

 

3、旋转矩阵:最复杂的变换矩阵

旋转操作需要指定一个旋转轴,这个旋转轴不一定是空间中的坐标轴。

点 绕 x 轴 旋转 θ 度:

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

点 绕 y 轴 旋转 θ 度:

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

点 绕 z 轴 旋转 θ 度:

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

 

旋转矩阵的逆矩阵:旋转相反角度得到

旋转矩阵是正交矩阵,而且多个旋转矩阵之间的串联同样是正交的

 

4、复合变换

平移、旋转 和 缩放 组合起来,形成一个复杂的变换过程。

复合变换可以通过矩阵的串联来实现。

 

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

 

注意:

1、Unity 使用的是 列矩阵,阅读顺序 从右到左,即 先进行缩放变换,再进行旋转变换,最后进行平移变换

2、矩阵乘法 不满足交换律,矩阵乘法顺序很重要,不同的变换顺序得到的结果可能是不一样的。复合变换的结果是依赖于变换顺序的。

3、绝大多数情况下,约定变换的顺序是 先缩放、再旋转、最后平移

4、如果分别绕x轴、y轴和z轴旋转的变换矩阵,要小心旋转的变换顺序。在Unity中,旋转顺序是 zxy

 

 

旋转顺序 zxy,意味着在给定的旋转角度:

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

得到的组合旋转变换矩阵是:

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

 

给定一个旋转顺序(例如这里的 zxy),以及它们对应的旋转角度

 

Unity Shader入门精要 第4章 矩阵的几何意义 读书笔记

这里有两种坐标系可以选择:

1、

绕坐标系E 下的 z轴旋转 θz

绕坐标系E 下的 y轴旋转 θy

绕坐标系E 下的 x轴旋转 θx

即进行一次旋转的时候,不会一起旋转当前的坐标系(Unity的旋转顺序)

2、

绕坐标系E 下的z轴旋转 θz

在坐标系E 下绕z轴旋转 θz后的 新坐标系E1 下的y轴旋转 θy

在坐标系E1 下绕y轴旋转 θy后的 新坐标系E2 下的x轴旋转 θx

即 在旋转的死后,坐标系一起转动

 

在第一种情况下,按照 zxy顺序旋转 和 在第二种情况下按照 yxz顺序 旋转是一样的。

不同的旋转顺序得到的结果也可能是不一样的。