当前位置:   article > 正文

Unity Shader总结(二)——矢量和矩阵_矢量与矩阵的联系

矢量与矩阵的联系

一、向量的点乘

在这里插入图片描述

用途

1.计算向量的投影
2.根据cos值来判断是否在视野范围内或者在物体的前后左右。

二、 向量的叉乘

在这里插入图片描述

用途

1.求出法向量
2.判断三角面片正反

三、矩阵

正交矩阵

矩阵中要注意的正交矩阵,一个正交矩阵的转置和它的逆矩阵相等,即:
在这里插入图片描述
逆矩阵求解计算量大,所以当它是正交矩阵时只要转置一下就是逆矩阵。
判断正交矩阵可以判断 M M T MM^{T} MMT是否是单位矩阵,最节省计算量的方法还是直接判断该矩阵是否是由标准正交基构成。例如:
在这里插入图片描述                                                  在这里插入图片描述
在Unity中矩阵相乘常规做法是把矢量放在矩阵右侧,即 A v = v A T Av=vA^{T} Av=vAT

仿射变换

首先梳理一下知识点
线性变换(3x3矩阵):缩放和旋转
仿射变换(齐次坐标空间,4x4矩阵):合并了线性变换和平移变换,3x3矩阵没有办法进行平移。

平移

对点平移(对矢量没有用,矢量没有位置的概念)
[ 1 0 0 t x 0 1 0 t y 0 0 1 t z 0 0 0 1 ]

[100tx010ty001tz0001]
100001000010txtytz1 [ x y z 1 ]
[xyz1]
xyz1

缩放

对点: [ k x 0 0 0 0 k y 0 0 0 0 k z 0 0 0 0 1 ]

[kx0000ky0000kz00001]
kx0000ky0000kz00001 [ x y z 1 ]
[xyz1]
xyz1

对矢量: [ k x 0 0 0 0 k y 0 0 0 0 k z 0 0 0 0 1 ]

[kx0000ky0000kz00001]
kx0000ky0000kz00001 [ x y z 0 ]
[xyz0]
xyz0

旋转

R x ( θ ) R_{x}(\theta ) Rx(θ)= [ 1 0 0 0 0 c o s ( θ ) − s i n ( θ ) 0 0 s i n ( θ ) c o s ( θ ) 0 0 0 0 1 ]

[10000cos(θ)sin(θ)00sin(θ)cos(θ)00001]
10000cos(θ)sin(θ)00sin(θ)cos(θ)00001

R y ( θ ) R_{y}(\theta ) Ry(θ)= [ c o s ( θ ) 0 s i n ( θ ) 0 0 1 0 0 − s i n ( θ ) 0 c o s ( θ ) 0 0 0 1 ]

[cos(θ)0sin(θ)00100sin(θ)0cos(θ)0001]
cos(θ)0sin(θ)00100sin(θ)0cos(θ)0001

R z ( θ ) R_{z}(\theta ) Rz(θ)= [ c o s ( θ ) − s i n ( θ ) 0 0 s i n ( θ ) c o s ( θ ) 0 0 0 0 1 0 0 0 0 1 ]

[cos(θ)sin(θ)00sin(θ)cos(θ)0000100001]
cos(θ)sin(θ)00sin(θ)cos(θ)0000100001

复合变换

复合变换顺序为缩放、旋转、平移,即:
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
记不住没有关系,就是transform组件从下往上看,打开unity看一眼就知道了。

其中旋转顺序为zxy,即:
M r o t a t e z M r o t a t e x M r o t a t e y M_{rotate_{z}}M_{rotate_{x}}M_{rotate_{y}} MrotatezMrotatexMrotatey

坐标空间变换

子空间到父空间(模型空间到世界空间)

假设父空间为P,子空间为C,则点A的变换:
A p = M c → p A c A_{p}=M_{c\rightarrow p}A_{c} Ap=McpAc
其中空间变换矩阵为:
M c → p = [ ∣ ∣ ∣ ∣ x c y c y c O c ∣ ∣ ∣ ∣ 0 0 0 1 ] M_{c\rightarrow p}=

[||||xcycycOc||||0001]
Mcp=xc0yc0yc0Oc1

其中, ( x c , y c , y c ) (x_{c}, y_{c} , y_{c}) (xc,yc,yc)为C的三个坐标轴在P下的表示,注意,不一定是单位矢量,因为可能存在缩放。 O c O_{c} Oc为C的原点在P下的表示。推导过程见《Unity Shader》入门精要page69~70。

由于矢量没有位置概念,平移坐标系原点对矢量没有影响,因此矢量的变换矩阵直接截取前三行前三列。

父空间到子空间

直接逆矩阵就可以求了

特殊情况

假如是一个正交矩阵,如: M p → c = [ ∣ ∣ ∣ x p y p y p ∣ ∣ ∣ ] = M c → p − 1 = M c → p T = [ − x c − − y c − − z c − ] M_{p\rightarrow c }=

[|||xpypyp|||]
=M_{c\rightarrow p}^{-1}=M_{c\rightarrow p}^{T}=
[xcyczc]
Mpc=xpypyp=Mcp1=McpT=xcyczc

那么,P的坐标轴在C中的表示就是矩阵的每一列;
           C的坐标轴在P中的表示就是矩阵的每一行;(注意,因为是正交矩阵,省略了归一化)

这个发现有什么用?打个比方,我们要从C变到P,本来应该求 x c , y c , z c x_{c},y_{c},z_{c} xc,yc,zc,然后按列排,但我们现在只知道 x p , y p , z p x_{p},y_{p},z_{p} xp,yp,zp,那么直接按行排就行了

四、总结

这两章是对顶点着色器需要准备的知识点做的一个总结,第三章会将顶点着色器是怎么将一个顶点从模型空间一步步转化到屏幕坐标上的。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/Gausst松鼠会/article/detail/100275
推荐阅读
相关标签
  

闽ICP备14008679号