UnityShader入门精要学习笔记(二):数学知识

时间:2023-01-25 10:19:22

一. 笛卡尔坐标系

平时我们使用的是笛卡尔坐标系,记得高中时还学过极坐标系
左手坐标系:中指指向+Z,食指指向+Y,拇指指向+X(右方),旋转正方向为顺时针
右手坐标系:中指指向+Z,食指指向+Y,拇指指向+X(左方),旋转正方向为逆时针

UnityShader入门精要学习笔记(二):数学知识

UnityShader入门精要学习笔记(二):数学知识

在Unity中,除了观察空间(摄像机视野)使用的是右手坐标系以外,其它都是使用左手坐标系。

二.点和矢量(略)

三.矩阵

【矩阵乘法】

rXn的矩阵A和一个nXc的矩阵B,它们相乘会得到一个rXc的矩阵 C =AB

简单图示:

UnityShader入门精要学习笔记(二):数学知识

c23 = a21*b13 + a22*b23
同理:
c21 = a21*b11 + a22*b21

【特殊矩阵】

方阵:矩阵的行数和列数相同

单位矩阵:对线元素全为1,其余为0

转置矩阵:UnityShader入门精要学习笔记(二):数学知识
(特性 )
UnityShader入门精要学习笔记(二):数学知识

逆矩阵:并非全部矩阵都可逆,逆矩阵与原矩阵相乘(无论左右)得到单位矩阵

正交矩阵:前提为方阵,与自身的转置矩阵相乘(无论左右)得到单位矩阵
实际上,其转置矩阵与逆矩阵相等

【矩阵变换】

线性变换

            f(x) + f(y) = f(x+y)
kf(x) = f(kx)

仿射变换

合并线性变换和平移变换的变换类型。仿射变换可以使用一个4X4的矩阵来表示,为此我们需要把矢量扩展到四维空间下,这就是齐次坐标系。

            尝试使用线性变换进行平移操作
令f(x) = x + (1,2,3)
若x=1,那么:
f(x)+f(x) = (4,6,8)
f(2x) = f(x+x) = (3,4,5)
不满足最后一条
kf(x) = f(kx)
可见:我么无法使用单纯的线性变换来进行平移操作,于是就有了放射变换

平移与缩放
对于任意一点point = (x,y,z) —————> (x,y,z,1)
为了让其能够同时接受平移变换,所以将其转换到齐次坐标下,其w分量设为1,这样当用一个4X4的矩阵对一个点进行变换时,平移、旋转、缩放都会施加于该点
[平移]
UnityShader入门精要学习笔记(二):数学知识
[缩放]
UnityShader入门精要学习笔记(二):数学知识

对于任意一方向矢量Vector=(x,y,z)
由于单纯矢量只有长度与方向的概念,所以平移变换对于矢量来说没有实际意义。
即矢量被平移之后不会发生改变。
所以转换到齐次坐标系下,其w分量为0
[平移]
UnityShader入门精要学习笔记(二):数学知识
[缩放]
UnityShader入门精要学习笔记(二):数学知识

旋转

UnityShader入门精要学习笔记(二):数学知识

UnityShader入门精要学习笔记(二):数学知识

UnityShader入门精要学习笔记(二):数学知识

关于复合变换

优先进行缩放,然后进行旋转,最后进行平移

四.坐标空间

模型空间
通常以模型的中心为原点,采用左手坐标系
比如玩Maya时,按住D键不放调整模型的中心点
Unity中model.TransformPoint(v3)函数可以得到model的局部空间中的点v3在世界空间
中的表示

世界空间
就是的游戏场景中的小宇宙
Unity中model.InverseTransformPoint(v3)可以得到世界空间中的点v3在模型model的局部空间中的表示

观察空间
也就是摄像机空间,采用右手坐标系
Unity中可以调用Camera.cameraToWorldMatrix以及Camera.worldToCameraMatrix等接口自行计算某模型在观察空间中的位置
这里要注意一点:观察空间和屏幕空间是不同的!前者是三维空间,而后者是二维空间。观察空间到屏幕空间需要进行一个操作,那就是投影(Projection)。

剪裁空间

前面的观察空间是以摄像机为中心的,而剪裁空间则是摄像机的视锥体内部空间
将前者中的一点转换到剪裁空间中所用的变换矩阵叫做剪裁矩阵,也被熟悉的称为投影矩阵
视锥体又分透视投影和正交投影

屏幕空间

屏幕空间是一个二维空间,将剪裁空间中的顶点投影到屏幕空间,生成对应的2D坐标:
首先,进行标准齐次除法,也就是透视除法后,用齐次坐标系的w分量除以x、y、z分量

UnityShader入门精要学习笔记(二):数学知识

UnityShader入门精要学习笔记(二):数学知识

坐标空间以及变换的总结

UnityShader入门精要学习笔记(二):数学知识

五.法线变换

法线是经常需要我们特殊处理的一种方向矢量,比如次时代技术中的高光贴图(BumpMap),专门存储模型的表面法线信息。

切线由两点之间的差值得到,与法线垂直。
UnityShader入门精要学习笔记(二):数学知识

UnityShader入门精要学习笔记(二):数学知识

值得注意的是,如果变换矩阵是一个正交矩阵,那么其逆矩阵就等于自身的转置矩阵。

那么左乘这个变换矩阵的逆转置矩阵就等于它自身了。

另外补充一个特性,左乘一个矩阵的转置等于右乘该矩阵!

六.Unity Shader内置变量

【内置矩阵】

UnityShader入门精要学习笔记(二):数学知识

【摄像机与屏幕参数】

UnityShader入门精要学习笔记(二):数学知识
UnityShader入门精要学习笔记(二):数学知识

七.子空间坐标向父空间的转换

已知子坐标空间C的3个坐标轴在父坐标空间P下的表示为xc、yc、zc,以及其原点位置Oc
给定一个子坐标空间中的一点Ac = (a,b,c)将其转换到父坐标空间下Ap:

Mc->p 经推导表示为将xc、yc、zc、Oc按列排列组成齐次矩阵。
而对于矢量无需平移,只需要将xc、yc、zc按列排列组成矩阵。

八.法线变换推理补充

在三维空间中,一个平面的表述为:ax + by + cz + d = 0;
n = (a,b,c,d) p=(x,y,z,1) 则该平面在空间中的表示为:nTp = 0
其中n为该面的法向量

现在对p进行变换,p = Rp
对法向量的变换,n = Qn

假设表示方式从空间A变换到了空间B中

变换后,该面上的任何点应该仍满足 :
(n)Tp = 0

也就是

(Qn)T(Rp) = 0

nT(QTR)p = 0

因为前面有:nTp = 0

所以,当QTR = I时

nT(QTR)p = 0 成立

从而得到(R可逆的情况下)

Q = (R-1)T

九.View Space中摄像机前方的z为负值,故-z为正数

UnityShader入门精要学习笔记(二):数学知识