赞
踩
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
]
对点:
[
k
x
0
0
0
0
k
y
0
0
0
0
k
z
0
0
0
0
1
]
对矢量:
[
k
x
0
0
0
0
k
y
0
0
0
0
k
z
0
0
0
0
1
]
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
]
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
]
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
]
复合变换顺序为缩放、旋转、平移,即:
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=Mc→pAc
其中空间变换矩阵为:
M
c
→
p
=
[
∣
∣
∣
∣
x
c
y
c
y
c
O
c
∣
∣
∣
∣
0
0
0
1
]
M_{c\rightarrow p}=
其中, ( 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 }=
那么,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,那么直接按行排就行了
这两章是对顶点着色器需要准备的知识点做的一个总结,第三章会将顶点着色器是怎么将一个顶点从模型空间一步步转化到屏幕坐标上的。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。