Unity的数学基础
一、Unity使用的坐标系
- 对于模型空间和世界空间,Unity使用的是左手坐标系
- 对于观察空间,Unity使用的是右手坐标系
二、矩阵的变换类型
1、线性变换:满足以下条件的函数
- f(x)+f(y) = f(x+y)
- kf(x) = f(kx)
2、平移变换:满足标量乘法,但不满足矢量加法
3、仿射变换:合并线性变换和平移变换的变换类型。
- 仿射变换使用一个4*4的矩阵表示。
- 把矢量扩展到四维空间下,同时这也称之为齐次坐标空间。
4、常见的变换种类和他们的特性(N表示不满足,Y表示满足)
变换名称 | 线性变换 | 仿射变换 | 可逆矩阵 | 正交矩阵 |
---|---|---|---|---|
平移矩阵 | N | Y | Y | N |
绕坐标轴旋转的旋转矩阵 | Y | Y | Y | Y |
绕任意轴旋转的旋转矩阵 | Y | Y | Y | Y |
按坐标轴缩放的缩放矩阵 | Y | Y | Y | N |
错切矩阵 | Y | Y | Y | N |
镜像矩阵 | Y | Y | N | N |
正交投影矩阵 | Y | Y | N | N |
透视投影矩阵 | N | N | N | N |
5、旋转矩阵的顺序
当直接给出(x,y,z),这样的旋转角度时,在Unity中,旋转顺序是zxy。
6、矩阵变换顺序
先缩放、再旋转,最后平移
三、顶点的空间变换过程
1、顺序
模型空间 --(模型变换)–> 世界空间 --(观察变换)–> 观察空间 --(投影变换)–> 裁剪空间 --(屏幕映射)–> 屏幕空间
2、模型空间
又称对象空间、局部空间,满足左手坐标系,模型空间的原点和坐标轴由美术人员在建模软件中确定好。
导入Unity后,可以在顶点着色器中访问到模型的顶点信息。
3、世界空间
Unity中的世界坐标。
绝对坐标
4、观察空间
又称摄像机空间,符合右手坐标系,以摄像机为原点,+x轴指向右方,+y轴指向上方,+z轴指向摄像机后方。
5、裁剪空间
又称齐次裁剪空间,符合左手坐标系。裁剪空间由视锥体决定,该视锥体指的就是在unity中摄像机照射的空间。
有两种类型:
- 正交投影:完全保留物体的距离和角度
- 透视投影:模拟人眼看世界的方式
6、屏幕空间
经过这一步变换后,得到真正的像素位置。
过程步骤:
- 齐次除法,也被称为透视除法。即用齐次坐标系的w分量去除以x、y、z分量
- 通过缩放,映射到屏幕空间
四、法线变换
1、在游戏中,模型的一个顶点往往会携带额外的信息,例如法线、切线等。
2、法线:normal,切线:tangent
五、UnityShader的内置变量
变量名 | 描述 |
---|---|
UNITY_MATRIX_MVP | 当前的模型·观察·投影矩阵,用于将顶点/方向矢量从模型空间变换到裁剪空间 |
UNITY_MATRIX_MV | 当前的模型·观察矩阵,用于将顶点/方向矢量从模型空间变换到观察空间 |
UNITY_MATRIX_V | 当前的观察矩阵,用于将顶点/方向矢量从世界空间变换到观察空间 |
UNITY_MATRIX_P | 当前的投影矩阵,用于将顶点/方向矢量从观察空间变换到裁剪空间 |
UNITY_MATRIX_VP | 当前的观察·投影矩阵,用于将顶点/方向矢量从世界空间变换到裁剪空间 |
UNITY_MATRIX_T_MV | UNITY_MATRIX_MV的转置矩阵 |
UNITY_MATRIX_IT_MV | UNITY_MATRIX_MV的逆转置矩阵,用于将法线从模型空间变换到观察空间,也可用于得到UNITY_MATRIX_MV的逆矩阵 |
_Object2World | 当前的模型矩阵,用于将顶点/方向矢量从模型空间变换到世界空间 |
_World2Object | _Object2World的逆矩阵,用于将顶点/方向矢量从世界空间变换到模型空间 |
六、Unity内置的摄像机和屏幕参数
变量名 | 类型 | 描述 |
---|---|---|
_WorldSpaceCameraPos | float3 | 该摄像机在世界空间中的位置 |
_ProjectionParams | float4 | x=1.0(或-1.0,如果正在使用一个翻转的投影矩阵进行渲染),y=Near,z=Far,w=1.0+1.0/Far,其中Near和Far分别是近裁剪平面和远裁剪平面和摄像机的距离 |
_ScreenParams | float4 | x=width,y=height,z=1.0+1.0/width,其中width和height分别是该摄像机的渲染目标(render target)的像素宽度和高度 |
_ZBufferParams | float4 | x=1-Far/Near,y=Far/Near,z=x/Far,w=y/Far,该变量用于线性Z缓存中的深度值 |
unity_OrthoParams | float4 | x=width,y=height,z没有定义,w=1.0(该摄像机是正交摄像机)或w=0.0(该摄像机是透视摄像机),其中width和height是正交投影摄像机的宽度和高度 |
unity_CameraProjection | float4*4 | 该摄像机的投影矩阵 |
unity_CameraInvProjection | float4*4 | 该摄像机的投影矩阵的逆矩阵 |
unity_CameraWorldClipPlanes[6] | float4 | 该摄像机的6个裁剪平面在世界空间下的等式,按如下顺序:左、右、下、上、近、远裁剪平面 |
七、注意事项
- CG使用的是行优先的方法