第四章介绍了诸多学习UnityShader需要的数学知识,这里总结一些个人认为比较重要的知识点,以便分享和后续查阅。
主要是回顾一下矩阵和然后记录坐标系转换方面的。
目录
为什要从观察空间(以相机为原点的空间)转换(投影)到裁剪空间?
左手坐标系,右手坐标系,左手法则右手法则?
直接看图更清晰直观。
左手坐标系
右手坐标系
左右手法则分别对应,左手坐标系和右手坐标系中的旋转正方向。
矩阵基础概念
矩阵与矩阵的乘法
书上概念:
演示计算步骤:
常见特殊矩阵概念
- 矩阵的基础性质:
- 矩阵乘法不满足交换律
- 矩阵乘法满足结合律
- 方块矩阵:行和列数量一样的就是方块矩阵,比如3*3,4*4的矩阵
- 单位矩阵:一个任何矩阵和他相乘都是原来矩阵的矩阵。
- 转置矩阵:将原有的行换为列,将原有的列换为行,即为转置矩阵,表示为
。图为示例。
转置矩阵的性质一:转置矩阵的转置等于原矩阵
转置矩阵的性质二:矩阵串接的转置,等于反向串接各个矩阵的转置。
- 逆矩阵:
逆矩阵的性质一:逆矩阵的逆矩阵是原矩阵的本身
逆矩阵的性质二:单位矩阵的逆矩阵是它本身
逆矩阵的性质三:转置矩阵的逆矩阵是逆矩阵的转置
逆矩阵的性质四:矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵。
- 正交矩阵:如果一个方阵M和他的转置矩阵的乘积是单位矩阵的话,我们就说这个矩阵是正交的
。反过来说也是成立的。另外如果一个矩阵是正交的,那么他的转置矩阵和逆矩阵是相等的
如何快速判断矩阵是正交的。
选择行矩阵还是列矩阵?
如无特殊情况,Unity中使用列矩阵,和右乘。
矩阵的几何性质
常见几何矩阵一览表
平移矩阵: | 平移坐标点 | ![]() |
平移方向向量 | ![]() | |
缩放矩阵: | 一般缩放 | ![]() |
方向向量的缩放 | ![]() | |
旋转矩阵: | 绕X轴旋转θ的矩阵 | ![]() |
绕Y轴旋转θ的矩阵 | ![]() | |
绕X轴旋转θ的矩阵 | ![]() |
复合变换矩阵
绝大多多数情况下我们约定的顺序就是先缩放,再旋转,最后平移。(如果顺序不一致,得到变换矩阵将会不一样,但是书上没有给出明确的关系)。下图是只考虑Y轴旋转的复合变换的例子。
给定一个复合旋转如何使用矩阵?
假设绕X轴,Y轴,Z轴分别旋转θ角度。要注意这个矩阵,对应的是每单次旋转后都更新旋转轴的情况,即下图。
使用矩阵完成坐标空间(系)的变换
假设我们要将坐标空间C转换到坐标空间P中,首先我们要知道坐标空间C在坐标空间P中的原点和坐标轴的矢量表示。然后把三个坐标轴依次放入矩阵的前三列。把原点放到最后一列。再用0和1填充最后一行即可。
如果我们只是变换方向矢量,可以只用一个3*3的矩阵,也就是前面的矩阵剔除掉平移的部分。
一个从模型到屏幕的完整标变换过程
首先是流程一览图。
整个变换过程包含了比较多的的公式运算,这里节选比较重要的点做整理,(PS:主要整理透视投影)。
-
为什要从观察空间(以相机为原点的空间)转换(投影)到裁剪空间?
- 主要是常规的数学方法中,使用相机视锥体的6个面裁剪可视物体,比较麻烦,投影后可以使齐次坐标的w分量“有意义”,即,可以使用投影后生成齐次坐标的w分量,便捷的判断物体是否在视锥体范围内。更重要的是有了这个w分量,为了后续裁剪空间到屏幕空间的变换可以通过一个简单的“齐次除法”来完成。
-
观察空间到裁剪空间做了什么?
首先是观察空间到裁剪空间的变换矩阵,该矩阵的推到过程可以看书上的流程,主要是使用相机的FOV和近裁剪面,远裁剪面进行一系列计算得出。
该矩阵表明了,整个投影过程实际上是对x,y,z分别作了不同程度的缩放,缩放的目的是为了方便裁剪。更重要的是,变换后的w分量,不再是1,而是原先z分量的取反结果。有了这个w分量后,我们可以通过如下不等式来判断,顶点是否在视锥体内。
以下是裁剪过程示意图。另外要注意的是,裁剪矩阵会改变空间的旋向性,也就是空间从右手坐标系变换到了左手坐标系,这意味着离相机越远,z值越大。
-
屏幕空间的变换是怎样的?什么是齐次除法?
齐次除法,简单来说就是使用坐标的xyz分量分别除以w分量,以得到一个在(0,1)范围内的归一化设备坐标(NDC)。 -
从NDC在映射到真正的屏幕坐标。
- 在Unity中,屏幕空间左下角的像素坐标是(0,0),右上角是(pixelWith,pixelHeight),而我们前面得到的NDC坐标x,y都是在[0,1]的范围内,所以要缩放到[0,pixelWith],和[0,pixelHeight]范围,公式为
另外,z轴坐标会直接除以w分量,
然后把该值放到深度缓冲中去。
- 在Unity中,屏幕空间左下角的像素坐标是(0,0),右上角是(pixelWith,pixelHeight),而我们前面得到的NDC坐标x,y都是在[0,1]的范围内,所以要缩放到[0,pixelWith],和[0,pixelHeight]范围,公式为
法线变换
法线变换的目标是,变换后仍然是跟切线垂直的一个方向向量。经过一堆推导得知,法线变换矩阵是原顶点变换矩阵的逆转置矩阵。
但是一般情况下,求解逆转置矩阵中的逆矩阵比较耗费运算量。我们可以通过两个特殊情况,避免解逆矩阵,获得法线变换矩阵。
- 如果原变换矩阵只包含旋转,那么可以直接用原变换矩阵作为法线的变换矩阵。(PS:什么情况下只包含旋转呢)
- 如果原变换矩阵只包含旋转和统一缩放,那么可以使用同一缩放系数来获得法线的变换矩阵,即