这一篇来补充一下第四章的内容,太基础的就不写了,有些不太清楚的概念整理一下。
第4章 学习Shader所需的数学基础
-
在Unity中,模型空间和世界空间使用的是左手坐标系,相机空间使用的是右手坐标系。
-
正交矩阵:MMT = MTM = I,即 MT = M-1。
正交矩阵的特点:每一行(列)都是单位矩阵,每一行(列)之间相互垂直。
把n阶正交矩阵的每一行(列)拿出来可以建立一个n维坐标系。 -
我们通常把坐标看成列向量,因此变换矩阵乘以坐标时,矩阵应该在左边,坐标向量在右边。例如,CBAv,执行的顺序为先进行A变换,再B变换,最后C变换(矩阵你满足乘法结合律)。
-
仿射变换:合并线性变换和平移变换。
平移变换不是线性变换,因此不能用3×3的矩阵表示。我们需要扩展到4维空间下,用4×4的矩阵表示仿射变换。 -
变换矩阵:对于平移和缩放来说,无论是在哪一个坐标轴上变换,都可以用一个矩阵表示;但是对于旋转来说,绕不同轴旋转有不同的旋转矩阵,如果绕两个轴都有旋转,则需要乘以两个旋转矩阵。
- 我们要想定义一个坐标空间,必须指明其原点位置和三个坐标轴的方向,而这些数值是相对于另外一个坐标空间而言的,因此就有了父坐标空间和子坐标空间的概念。
假设子坐标空间C的3个坐标轴在父坐标空间P下分别表示为xc、yc、zc,原点为Oc,则子坐标空间到父坐标空间的变换矩阵为:
-
模型空间:在建模时设定好的,与模型的位置、朝向等等无关,例如一个人无论面朝哪个方向他的左边永远是相对于他自身的左边;
世界空间:我们所关心的最大空间,确定了每一个模型的位置,Transform组件中的坐标就是模型在世界坐标中的位置或变换(有父节点的情况除外);
相机空间:以相机为原点建立的坐标,相机的正前方是z轴的负方向。
由模型空间变换到世界空间比较简单,直接乘以变换矩阵即可;由世界空间变换到坐标空间稍微复杂一点,首先我们知道相机在世界空间下的坐标(通过Transform组件),然后求得相机 -> 世界的变换矩阵,最后通过逆矩阵求得世界 -> 相机的变换矩阵,也可以通过反变换直接求得。 -
正交投影:没有透视效果,保留了物体原本的大小;
透视投影:有透视效果,近大远小。
- 透视投影矩阵:透视投影矩阵本身并不做投影,而是为了方便后面投影操作而做的坐标变换。相比于相机空间的坐标轴,变换后x、y轴方向不变,z轴变为原来的反方向,其本质上只是对坐标进行了缩放。透视投影矩阵和透视裁剪空间的示意图如下:
- 正交投影矩阵:和透视投影矩阵类似。正交投影矩阵和正交裁剪空间的示意图如下:
-
在上述两个裁剪空间中,若某一点在视椎体中,则变换后的坐标应该满足:-w≤x≤w,-w≤y≤w,-w≤z≤w。
-
屏幕空间:把视椎体内的物体投影到屏幕上,实现真正的投影,三维坐标变换为二维坐标。需要两个步骤:
(1) 齐次除法:从齐次裁剪空间转换到归一化设备坐标(NDC),OpenGL坐标范围是[-1, 1],DirectX坐标范围是[0, 1];
(2) 屏幕映射:映射到输出窗口的对应坐标。 -
坐标空间的总结:
感觉这章的内容好多啊……还有一点点法线变换的内容没有写,会在后面的文章中介绍一下。
图片来自 东隆咚
网友评论