参考书籍:UNITY SHADER入门精要
一、笛卡尔坐标系 Cartesian Coordinate System 1.1 二维笛卡尔坐标系一个二维笛卡尔坐标系包含两个部分信息:
- 一个特殊的位置——原点(整个坐标系的中心)
- 两条经过原点且互相垂直的矢量(x/y轴),也称为基矢量。
在三维笛卡尔坐标系中
- X轴、Y轴、Z轴为该坐标系的基矢量。
- 3个坐标轴之间互相垂直,且长度为1,即为标准正交基。
- 3个坐标轴之间互相垂直,但长度不为1,即为正交基。
正交:互相垂直 与二维笛卡尔坐标系相似,无固定方向的坐标轴。导致出现两种不同类型的坐标系。即左手坐标系和右手坐标系,如下图所示:
上图两种坐标系具有旋向性
1.3 Unity的坐标系提供了模型空间、世界空间共两种。对这两种空间,Unity选择使用的是左手坐标系。
对于观察空间(通过以摄像机为原点的坐标系观察),Unity选择是引用的是右手坐标系。
1.4 练习题- (1) 建模软件3D Max的默认坐标轴方向是:X轴正方向指向右方,Y轴正方向指向前方,Z轴正方向指向上方。那它是左手坐标系还是右手坐标系? 答:左手坐标系。
- (2) 有一点坐标(0, 0, 1),在左手坐标系中,将其绕Y轴正方向旋转+90°,旋转后坐标为什么?同理在右手坐标系中,将其绕Y轴正方向旋转+90°,旋转后的坐标是什么? 答:左手坐标系中(1, 0, 0) 右手坐标系(-1, 0, 0)
点:n维空间中的一个位置(主要出现于二维、三维场景)。 矢量:n维空间中包含了 模-magnitude、方向-direction的有向线段。
具体:
- 矢量的模 = 矢量的长度(非负数)
- 矢量的方向:描述该矢量在空间中的指向
注:矢量常被用于表示相对某个点的偏移。
2.1 区别矢量有两点组成。任何一个点可以表示成一个从原点出发的矢量。
其他:表示方向的矢量称为方向矢量。
2.2 矢量运算 2.2.1 矢量和标量的乘法、除法乘法:k v v v= (k v x v_{x} vx, k v y v_{y} vy, k v z v_{z} vz) 除法: 1 k \frac {1}{k} k1 v v v = ( 1 k v x \frac {1}{k}v_{x} k1vx, 1 k v y \frac {1}{k}v_{y} k1vy, 1 k v z \frac {1}{k}v_{z} k1vz)
2.2.2 矢量的加减法加法:a+b= ( a x + b x a_{x}+b_{x} ax+bx, a y + b y a_{y}+b_{y} ay+by, a z + b z a_{z}+b_{z} az+bz) 减法:a-b= ( a x − b x a_{x}-b_{x} ax−bx, a y − b y a_{y}-b_{y} ay−by, a z − b z a_{z}-b_{z} az−bz)
2.2.3 矢量的模∣ v ∣ = v x 2 + v y 2 + v z 2 |v|=\sqrt {v_{x}^2+v_{y}^2+v_{z}^2} ∣v∣=vx2+vy2+vz2
2.2.4 单位矢量解释:多数情况下,我们只关心矢量的方向而不是模。例如 计算光照模型,需要得到顶点的法线方向和光源方向。矢量的长度丝毫不需关心。故此类情况下,需要计算单位矢量。
单位矢量:模长为1的矢量(也称“归一化的矢量(normalized vector)”) 归一化:将任意非零矢量转换成单位矢量的过程。
零矢量:即(0,0,0,0) 不可被归一化。
2.2.5 矢量的点积矢量的乘法:分为点积和叉积(即对应内积、外积)
公式一:a ∗ * ∗ b= ( a x , a y , a z ) ∗ ( b x , b y , b z ) = a x b x + a y b y + a z b z (a_{x}, a_{y}, a_{z})*(b_{x}, b_{y}, b_{z}) =a_{x}b_{x}+ a_{y}b_{y}+ a_{z}b_{z} (ax,ay,az)∗(bx,by,bz)=axbx+ayby+azbz
注:矢量的点积满足交换律
点积的几何意义很重要,其几乎应用到图形学的各方面。最有意义的如投影。如下图所示:
点积具有以下性质:
- 点积可以几何标量乘法: ( k a ) ∗ b = a ∗ ( k b ) = k ( a ∗ b ) {(ka)*b=a*(kb)=k(a*b)} (ka)∗b=a∗(kb)=k(a∗b)
- 点积可以结合矢量加减法: a ∗ ( b + c ) = a ∗ b + a ∗ c {a*(b+c)=a*b+a*c} a∗(b+c)=a∗b+a∗c
- 一个矢量和本身进行点积的结果,是该矢量的模的平方: v ∗ v = v x ∗ v x + v y ∗ v y = ∣ v ∣ 2 {v*v=v_x*v_x+v_y*v_y=|v|^2} v∗v=vx∗vx+vy∗vy=∣v∣2
公式二:a ∗ * ∗ b=|a||b| cos θ {\cos θ} cosθ
记斜边b的模长为1,如图所示 :
- a ∗ * ∗ b = 直 角 边 斜 边 \frac{直角边}{斜边} 斜边直角边 = cos θ {\cos θ} cosθ
- θ = arcsin {θ = \arcsin} θ=arcsin(a ∗ * ∗ b)
【理解】矢量的叉积结果是一个矢量。
- 叉积的表示符号 “x”
公式: a x b = ( a x , a y , a z ) {(a_x, a_y, a_z)} (ax,ay,az) X ( b x , b y , b z ) = ( a y b z − a z b y , a z b x − a x b z , a x b y − a y b x ) (b_x,b_y,b_z)=(a_yb_z-a_zb_y,a_zb_x-a_xb_z,a_xb_y-a_yb_x) (bx,by,bz)=(aybz−azby,azbx−axbz,axby−aybx)
如下图所示为理解图: 更多注意:
- 叉积不满足交换律,即a x b ≠ b x a
- 叉积满足反交换律,即a x b ≠ –(b x a)
- 叉积不满足结合律,即(a x b)x c ≠ a x (b x c)
叉积的应用:判断三角面片的朝向或计算矢量。
三、矩阵特点:网格结构,具有行列之分。即行矩阵、列矩阵。
如下图所示: M = [ a 1 a 2 a 3 a 1 a 2 a 3 a 1 a 2 a 3 ] M=\begin{bmatrix} a_1&a_2&a_3&\\ a_1&a_2&a_3&\\a_1&a_2&a_3&\\ \end{bmatrix} M=⎣⎡a1a1a1a2a2a2a3a3a3⎦⎤
3.1 与矢量的关系答:矩阵由多个或至少一个矢量组成。
3.2 矩阵运算 3.2.1 矩阵与标量的乘法与矢量类似,矩阵与标量的乘积是一个相同维度的矩阵。
k M = M k = k [ a 1 a 2 a 3 a 1 a 2 a 3 a 1 a 2 a 3 ] = [ k a 1 k a 2 k a 3 k a 1 k a 2 k a 3 k a 1 k a 2 k a 3 ] {kM=Mk=k \begin{bmatrix} a_1&a_2&a_3&\\ a_1&a_2&a_3&\\ a_1&a_2&a_3&\\ \end{bmatrix}= \begin{bmatrix} ka_1&ka_2&ka_3&\\ ka_1&ka_2&ka_3&\\ ka_1&ka_2&ka_3&\\ \end{bmatrix}} kM=Mk=k⎣⎡a1a1a1a2a2a2a3a3a3⎦⎤=⎣⎡ka1ka1ka1ka2ka2ka2ka3ka3ka3⎦⎤
3.2.2 矩阵与矩阵的乘法已知A矩阵为 r x n 维,B矩阵为 n x c 维,则 A x B 矩阵为 r x c 维。
性质:
- 矩阵乘法不满足交换律:AB ≠ BA
- 矩阵乘法满足结合律:(AB)C = A(BC)
简称:方阵。指行、列数目相等的矩阵。三维渲染中常用3x3、4x4的方阵。
对角元素:行列号相等的元素(主斜对角元素)。 对角矩阵:除对角元素外的其他元素均为0的矩阵。
3.3.2 单位矩阵 identity matrix简称:特殊的对角矩阵。主对角元素均为1。 符号表示: I n {I_n} In (n指维数)
如下所示为一个3x3的单位矩阵: I 3 = [ 1 0 0 0 1 0 0 0 1 ] {I_3= \begin{bmatrix} 1&0&0&\\ 0&1&0&\\ 0&0&1&\\ \end{bmatrix} } I3=⎣⎡100010001⎦⎤ 注意:任何矩阵乘上单位矩阵的结果仍是其本身。
3.3.3 转置矩阵 transposed matrix理解:对原矩阵的行列互换位置。
将原矩阵的第m行第n列置换至第n行第m列下。如下图所示: [ 6 2 10 3 7 5 4 9 ] T = [ 6 7 2 5 10 4 3 9 ] { \begin{bmatrix} 6&2&10&3\\ 7&5&4&9\\ \end{bmatrix}^T= \begin{bmatrix} 6&7\\ 2&5\\ 10&4\\ 3&9\\ \end{bmatrix} } [672510439]T=⎣⎢⎢⎡621037549⎦⎥⎥⎤ 性质:
- 矩阵转置的转置等于原矩阵: ( M T ) T = M {(M^T)^T}=M (MT)T=M
- 矩阵串接的转置,等于反向串接各个矩阵的转置: ( A B ) T = B T A T {(AB)^T=B^TA^T } (AB)T=BTAT
前提:该矩阵必须是一个方阵。
性质:
- 单位矩阵的逆矩阵是单位矩阵: I − 1 = I {I^{-1}=I} I−1=I
- 矩阵乘上自身的逆矩阵等于单位矩阵。
- 所有元素均为0的矩阵没有逆矩阵。
- 逆矩阵的逆矩阵是原矩阵本身(前提可逆): ( M − 1 ) − 1 = M {(M^{-1})^{-1}=M} (M−1)−1=M
- 转置矩阵的逆矩阵是逆矩阵的转置: ( M T ) − 1 = ( M − 1 ) T {(M^{T})^{-1}=(M^{-1})^{T}} (MT)−1=(M−1)T
- 矩阵串接相乘后的逆矩阵等于反向串接各个矩阵的逆矩阵: ( A B ) − 1 = B − 1 A − 1 {(AB)^{-1}=B^{-1}A^{-1}} (AB)−1=B−1A−1
矩阵具有逆矩阵:可逆的/非奇异的 矩阵不具有逆矩阵:不可逆的/奇异的
3.3.5 正交矩阵 orthogonal matrix正交是矩阵的一种属性。
如果一个方阵M和它的转置矩阵的乘积是单位矩阵,则说这个方阵是正交。反之成立。 M M T = M T M = I { MM^T=M^TM=I } MMT=MTM=I 如果一个矩阵是正交的,则其转置矩阵和逆矩阵是一样的。 M T = M − 1 { M^T=M^{-1} } MT=M−1 判断是否正交矩阵: M M T = [ i 1 i 2 i 3 ] [ i 1 i 2 i 3 ] = [ i 1 i 1 i 1 i 2 i 1 i 3 i 2 i 1 i 2 i 2 i 2 i 3 i 3 i 1 i 3 i 2 i 3 i 3 ] = I = [ 1 0 0 0 1 0 0 0 1 ] {MM^T= \begin{bmatrix} i_{1}&i_{2}&i_{3}\\ \end{bmatrix} \begin{bmatrix} i_{1}\\ i_{2}\\ i_{3}\\ \end{bmatrix} =\begin{bmatrix} i_{1}i_{1}&i_{1}i_{2}&i_{1}i_{3}\\ i_{2}i_{1}&i_{2}i_{2}&i_{2}i_{3}\\ i_{3}i_{1}&i_{3}i_{2}&i_{3}i_{3}\\ \end{bmatrix} =I= \begin{bmatrix} 1&0&0&\\ 0&1&0&\\ 0&0&1&\\ \end{bmatrix}} MMT=[i1i2i3]⎣⎡i1i2i3⎦⎤=⎣⎡i1i1i2i1i3i1i1i2i2i2i3i2i1i3i2i3i3i3⎦⎤=I=⎣⎡100010001⎦⎤ 由上式可得: i 1 . i 1 = 1 , i 2 . i 2 = 0 , i 3 . i 3 = 0 {i_1.i_1=1,i_2.i_2=0 ,i_3.i_3=0} i1.i1=1,i2.i2=0,i3.i3=0
- 矩阵的每一行,即 i 1 、 i 2 、 i 3 {i_{1}、i_{2}、i_{3}} i1、i2、i3都是单位矢量
- 矩阵的每一行,即 i 1 、 i 2 、 i 3 {i_{1}、i_{2}、i_{3}} i1、i2、i3之间互相垂直
- 如果 M {M} M是正交矩阵,同理 M T {M^T} MT也是正交矩阵
正交基:基矢量之间互相垂直 标准正交基:基矢量均为1的正交基
3.4 行矩阵与列矩阵在Unity中,常规做法是将矢量放在矩阵的右侧。即把矢量转换成列矩阵进行运算。例如: C B A v = ( C ( B ( A v ) ) ) {CBAv=(C(B(Av)))} CBAv=(C(B(Av)))。 使用列向量的结果是,阅读顺序从右至左。
四、矩阵的几何意义:变换 4.1 什么是变换?答:把一些数据(如点、方向矢量设置颜色等)通过某种方式进行转换的过程。
常见变换类型:
4.2 线性变换 linear transform描述:可以保留 矢量加 和 标量乘 的变换。
条件一: f ( x ) + f ( y ) = f ( x + y ) {f(x)+f(y)=f(x+y)} f(x)+f(y)=f(x+y) 条件二: k f ( x ) = f ( k x ) {kf(x)=f(kx)} kf(x)=f(kx)
- 缩放 scale 条件: f ( x ) = 2 x {f(x)=2x} f(x)=2x
- 旋转 rotation
- 错切 shear
- 镜像 mirroring/reflection
- 正交投影 orthographic projection
f ( x ) = x + ( 1 , 2 , 3 ) {f(x)=x+(1,2,3)} f(x)=x+(1,2,3) 满足标量乘法,但不满足矢量加法。令 x = ( 1 , 1 , 1 ) {x=(1,1,1)} x=(1,1,1),则结果 f ( x + x ) = ( 3 , 4 , 5 ) f ( x ) + f ( x ) = ( 4 , 6 , 8 ) {f(x+x)=(3,4,5)}\\{f(x)+f(x)=(4,6,8)} f(x+x)=(3,4,5)f(x)+f(x)=(4,6,8) 由于两个运算的结果不一样,使得我们不能用一个3x3矩阵来表示一个平移变换。就出现了仿射矩阵。
仿射矩阵:合并线性变换和平移变换的变换类型。使用4x4矩阵表示。
4.4 齐次坐标空间四维空间,即为齐次坐标空间。
4.4.1 齐次坐标是一个四维矢量。例如 (x,y,z,w)
- 从三维转为四维只需设置w=1
- 四维坐标对一个点进行变化,如旋转、缩放、平移。只需设置w=0。
基础变换矩阵:纯平移,纯旋转,纯缩放的变换矩阵。 [ M 3 ∗ 3 t 3 ∗ 1 0 1 ∗ 3 1 w ] { \begin{bmatrix} M_{3*3}&t_{3*1}\\ 0_{1*3}&1w \end{bmatrix} } [M3∗301∗3t3∗11w]
- M 3 ∗ 3 {M_{3*3}} M3∗3:用于表示 旋转 和 缩放
- t 3 ∗ 1 {t_{3*1}} t3∗1:用于表示 平移
- 0 1 ∗ 3 {0_{1*3}} 01∗3:零矩阵,即表示 [0 0 0]
- 1:标量1
使用矩阵乘法表示对一个点的平移变换 [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] [ x y z 1 ] = [ x + t x y + t y z + t z 1 ] { \begin{bmatrix} 1&0&0&t_x\\ 0&1&0&t_y\\ 0&0&1&t_z\\ 0&0&0&1\\ \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 1\\ \end{bmatrix}= \begin{bmatrix} x+t_x\\ y+t_y\\ z+t_z\\ 1\\ \end{bmatrix} } ⎣⎢⎢⎡100001000010txtytz1⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤=⎣⎢⎢⎡x+txy+tyz+tz1⎦⎥⎥⎤ 使用矩阵乘法表示对一个方向矢量的平移变换 [ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ] [ x y z 0 ] = [ x y z 0 ] { \begin{bmatrix} 1&0&0&t_x\\ 0&1&0&t_y\\ 0&0&1&t_z\\ 0&0&0&1\\ \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 0\\ \end{bmatrix}= \begin{bmatrix} x\\ y\\ z\\ 0\\ \end{bmatrix} } ⎣⎢⎢⎡100001000010txtytz1⎦⎥⎥⎤⎣⎢⎢⎡xyz0⎦⎥⎥⎤=⎣⎢⎢⎡xyz0⎦⎥⎥⎤ 注:平移矩阵并不是一个正交矩阵。
4.4.4 缩放矩阵[ k x 0 0 0 0 k y 0 0 0 0 k z 0 0 0 0 1 ] [ x y z 0 ] = [ k x x k y y k z z 0 ] { \begin{bmatrix} k_x&0&0&0\\ 0&k_y&0&0\\ 0&0&k_z&0\\ 0&0&0&1\\ \end{bmatrix} \begin{bmatrix} x\\ y\\ z\\ 0\\ \end{bmatrix}= \begin{bmatrix} k_xx\\ k_yy\\ k_zz\\ 0\\ \end{bmatrix} } ⎣⎢⎢⎡kx0000ky0000kz00001⎦⎥⎥⎤⎣⎢⎢⎡xyz0⎦⎥⎥⎤=⎣⎢⎢⎡kxxkyykzz0⎦⎥⎥⎤
- 统一缩放(uniform scale):缩放系数 k 1 = k 2 = k 3 {k_1=k_2=k_3} k1=k2=k3
- 非统一缩放(nonuniform scale): k 1 , k 2 , k 3 {k_1,k_2,k_3} k1,k2,k3至少存在一对互不相等
注:缩放矩阵一般不是正交矩阵。
4.4.5 旋转矩阵把点绕着x轴旋转θ度: R x ( θ ) = [ 1 0 0 0 0 c o s θ − s i n θ 0 0 s i n θ c o s θ 0 0 0 0 1 ] { R_x(θ)= \begin{bmatrix} 1&0&0&0\\ 0&cosθ&-sinθ&0\\ 0&sinθ&cosθ&0\\ 0&0&0&1\\ \end{bmatrix} } Rx(θ)=⎣⎢⎢⎡10000cosθsinθ00−sinθcosθ00001⎦⎥⎥⎤ 把点绕着y轴旋转θ度: R y ( θ ) = [ c o s θ 0 s i n θ 0 0 1 0 0 − s i n θ 0 c o s θ 0 0 0 0 1 ] { R_y(θ)= \begin{bmatrix} cosθ&0&sinθ&0\\ 0&1&0&0\\ -sinθ&0&cosθ&0\\ 0&0&0&1\\ \end{bmatrix} } Ry(θ)=⎣⎢⎢⎡cosθ0−sinθ00100sinθ0cosθ00001⎦⎥⎥⎤ 把点绕着z轴旋转θ度: R z ( θ ) = [ c o s θ − s i n θ 0 0 s i n θ c o s θ 0 0 0 0 1 0 0 0 0 1 ] { R_z(θ)= \begin{bmatrix} cosθ&-sinθ&0&0\\ sinθ&cosθ&0&0\\ 0&0&1&0\\ 0&0&0&1\\ \end{bmatrix} } Rz(θ)=⎣⎢⎢⎡cosθsinθ00−sinθcosθ0000100001⎦⎥⎥⎤ 辅助理解:绕X轴旋转则X轴数值不变化【cosθ=1】,YZ数值变化。
旋转矩阵的逆矩阵是旋转相反角度得到的矩阵变化。即旋转矩阵是正交矩阵。且多个旋转矩阵之间的串联同样是正交的。
4.4.6 复合变换解释:将平移、旋转、缩放组合起来形成复杂变化的过程。
1.复合变换计算公式P n e w = M t r a n s l a t i o n M r o t a t i o n M s c a l e P o l d {P_{new}=M_{translation}M_{rotation}M_{scale}P_{old}} Pnew=MtranslationMrotationMscalePold
注意:阅读顺序从右至左。即先进行缩放变换,在进行旋转变换,最后进行平移变换。须注意的是,变换的结果以来于变换顺序。由于矩阵不满足交换律,结果将不一样。
例如:
- 情景1:人前进一步然后左转,记录当前位置。
- 情景2:人左转后再前进一步,记录当前位置。
经比较两种情景的位置是不一样的。
绝大多数情况下,约定变换顺序为 先缩放、再旋转、最后平移
2.旋转变换矩阵公式M r o t a t e Z M r o t a t e X M r o t a t e Y = [ c o s θ − s i n θ 0 0 s i n θ c o s θ 0 0 0 0 1 0 0 0 0 1 ] [ 1 0 0 0 0 c o s θ − s i n θ 0 0 s i n θ c o s θ 0 0 0 0 1 ] [ c o s θ 0 s i n θ 0 0 1 0 0 − s i n θ 0 c o s θ 0 0 0 0 1 ] { M_{rotateZ}M_{rotateX}M_{rotateY}= \begin{bmatrix} cosθ&-sinθ&0&0\\ sinθ&cosθ&0&0\\ 0&0&1&0\\ 0&0&0&1\\ \end{bmatrix} \begin{bmatrix} 1&0&0&0\\ 0&cosθ&-sinθ&0\\ 0&sinθ&cosθ&0\\ 0&0&0&1\\ \end{bmatrix} \begin{bmatrix} cosθ&0&sinθ&0\\ 0&1&0&0\\ -sinθ&0&cosθ&0\\ 0&0&0&1\\ \end{bmatrix} } MrotateZMrotateXMrotateY=⎣⎢⎢⎡cosθsinθ00−sinθcosθ0000100001⎦⎥⎥⎤⎣⎢⎢⎡10000cosθsinθ00−sinθcosθ00001⎦⎥⎥⎤⎣⎢⎢⎡cosθ0−sinθ00100sinθ0cosθ00001⎦⎥⎥⎤ 旋转的变换顺序:zxy
旋转使用的是坐标系,给定一个旋转顺序(如zxy),以及对应的旋转角度 ( θ x , θ y , θ z ) {(θ_x,θ_y,θ_z)} (θx,θy,θz),有两种坐标系选择:
- 纵坐标系E下的z轴旋转 θ z θ_z θz,纵坐标系E下的y轴旋转 θ y θ_y θy,纵坐标系E下的x轴旋转 θ x θ_x θx,即进行一次旋转时不一起旋转当前坐标系。
- 纵坐标系E下的z轴旋转 θ z θ_z θz,在坐标系E下再绕Z轴旋转 θ z θ_z θz后的新坐标系 E ‘ E^{`} E‘下的y轴旋转 θ y θ_y θy,在坐标系 E ‘ ‘ E^{``} E‘‘下再绕y轴旋转 θ y θ_y θy后的新坐标系 E ‘ ‘ E^{``} E‘‘下 的x轴旋转 θ x θ_x θx,即在旋转时,把坐标系一起转动。
实质:父空间与子空间之间对点和矢量的变换。
例如:现有父坐标空间P与子坐标空间C。已知父坐标空间中子坐标空间的原点位置与3个单位坐标轴。需求如下:
-
子坐标空间下的点或矢量 A c h i l d r e n A_{children} Achildren转换到父坐标空间下表示 A p a r e n t A_{parent} Aparent A p a r e n t = M c h i l d r e n − > p a r e n t A c h i l d r e n {A_{parent}=M_{{children->parent}} A_{children}} Aparent=Mchildren−>parentAchildren 其中, M c h i l d r e n − > p a r e n t M_{{children->parent}} Mchildren−>parent表示从子坐标空间到父坐标空间的变换矩阵。
-
父坐标空间下的点或矢量 B p a r e n t B_{parent} Bparent转换到子坐标空间下表示 B c h i l d r e n B_{children} Bchildren B c h i l d r e n = M p a r e n t − > c h i l d r e n B p a r e n t {B_{children}=M_{{parent->children}} B_{parent}} Bchildren=Mparent−>childrenBparent 其中, M p a r e n t − > c h i l d r e n M_{{parent->children}} Mparent−>children表示从父坐标空间到子坐标空间的变换矩阵。
原点和坐标轴:由美术人员通过建模软件确定。通常位于模型的中心。
例如,某模型在游戏场景的坐标为(2,3,2)。扩展至齐次坐标系下为(2,3,2,1)。
2.世界空间 world space- 最大的空间坐标系(特殊),可以无限大。
- 可被用于描述绝对位置-世界坐标系中的位置。
- xyz轴固定
顶点变换的第一步:将顶点坐标从模型空间变换到世界空间中。(模型变换)
4.5.3 观察空间 view space- 又称"摄像机空间"(camera space),决定着我们渲染游戏所使用的的视角。
- 位于观察空间中的坐标原点
注意:
- 调用
Camera.cameraToWorldMatrix
、Camera.worldToCameraMatrix
等接口自行计算某模型在观察空间中的位置,需注意左右手坐标系间的差异。 - 观察空间(三维)与 屏幕空间(二维)是不同的,需投影转换。
顶点变换的第二步:将顶点坐标从世界空间变换到观察空间中。(观察变化)
4.5.4 裁剪空间 clip space又称"齐次裁剪空间"。用于变换的矩阵叫做裁剪矩阵(clip matrix),也叫投影矩阵(projection matrix)。
目标:由视椎体决定,便利化对渲染图源进行裁剪。
续文:【Shader笔记】 Shader数学基础(二)