本文为我读《UnityShader入门精要》(冯乐乐著)的笔记
书中使用的unity版本是5.2.1
4.2.2正交基
三个坐标轴被称为该坐标的 基矢量
三轴之间相互垂直,且长度为1,可被成为 标准正交基。相互垂直但长度不为1被称为 正交基。
4.3.2矢量运算
标量与矢量乘除法:
【
v
表
示
一
个
矢
量
】
【
k
表
示
一
个
标
量
】
k
v
=
(
k
v
x
,
k
v
y
,
k
v
z
)
【 v 表示一个矢量】【 k 表示一个标量】kv = (kv_x,kv_y,kv_z)
【v表示一个矢量】【k表示一个标量】kv=(kvx,kvy,kvz)
矢量除以非零的标量,等于乘以这个标量的倒数
v
k
=
(
x
,
y
,
z
)
k
=
1
k
=
(
x
k
,
y
k
,
z
k
)
,
k
=
/
0
\cfrac{v}{k} = \cfrac{(x,y,z)}{k} = \cfrac{1}{k}=\left(\cfrac{x}{k},\cfrac{y}{k},\cfrac{z}{k}\right),k{=}\mathllap{/\,}0
kv=k(x,y,z)=k1=(kx,ky,kz),k=/0
标量与矢量加减法:
a ± b = ( a x ± b x , a y ± b y , a z ± b z ) a{\pm}b=(a_x{\pm}b_x,a_y{\pm}b_y,a_z{\pm}b_z) a±b=(ax±bx,ay±by,az±bz)
矢量的模:
∣ v ∣ = v x 2 , v y 2 , v z 2 |v| = \sqrt{\smash[b]{v_x^2,v_y^2,v_z^2}} ∣v∣=vx2,vy2,vz2
单位矢量:
即模为1的矢量,也被称为被归一化的矢量
对任何非零矢量,将其转化为单位矢量的过程被称为归一化
a
ˆ
=
v
∣
v
∣
,
v
是
非
零
矢
量
(
0
,
0
,
0
)
\text{\^{a}} = \cfrac{v}{|v|} ,v是非零矢量(0,0,0)
aˆ=∣v∣v,v是非零矢量(0,0,0)
矢量的点积:
先复习一下三角函数:
0 ∘ 0^\circ 0∘ | 1 5 ∘ 15^\circ 15∘ | 3 0 ∘ 30^\circ 30∘ | 4 5 ∘ 45^\circ 45∘ | 6 0 ∘ 60^\circ 60∘ | 9 0 ∘ 90^\circ 90∘ | 12 0 ∘ 120^\circ 120∘ | 13 5 ∘ 135^\circ 135∘ | 15 0 ∘ 150^\circ 150∘ | 18 0 ∘ 180^\circ 180∘ | 27 0 ∘ 270^\circ 270∘ | |
---|---|---|---|---|---|---|---|---|---|---|---|
弧度 | 0 0 0 | π 12 \cfrac{\pi}{12} 12π | π 6 \cfrac{\pi}{6} 6π | π 4 \cfrac{\pi}{4} 4π | π 3 \cfrac{\pi}{3} 3π | π 2 \cfrac{\pi}{2} 2π | 2 π 3 \cfrac{2\pi}{3} 32π | 3 π 4 \cfrac{3\pi}{4} 43π | 5 π 6 \cfrac{5\pi}{6} 65π | π {\pi} π | 3 π 2 \cfrac{3\pi}{2} 23π |
正 弦 ( 对 比 斜 ) sin α 正弦(对比斜)\sin\alpha 正弦(对比斜)sinα | 0 0 0 | 6 − 2 4 \cfrac{\sqrt{\smash[b]{6}}-\sqrt{\smash[b]{2}}} {4} 46−2 | 1 2 \cfrac{1}{2} 21 | 2 2 \cfrac{\sqrt{ \smash[b]{2}} } {2} 22 | 3 2 \cfrac{\sqrt{ \smash[b]{3}} } {2} 23 | 1 1 1 | 3 2 \cfrac{\sqrt{ \smash[b]{3}} } {2} 23 | 2 2 \cfrac{\sqrt{ \smash[b]{2}} } {2} 22 | 1 2 \cfrac{1}{2} 21 | 0 0 0 | − 1 -1 −1 |
余 弦 ( 邻 比 斜 ) cos α 余弦(邻比斜)\cos\alpha 余弦(邻比斜)cosα | 1 1 1 | 6 + 2 4 \cfrac{\sqrt{\smash[b]{6}}+\sqrt{\smash[b]{2}}} {4} 46+2 | 3 2 \cfrac{\sqrt{ \smash[b]{3}} } {2} 23 | 2 2 \cfrac{\sqrt{ \smash[b]{2}} } {2} 22 | 1 2 \cfrac{1}{2} 21 | 0 0 0 | − 1 2 -\cfrac{1}{2} −21 | − 2 2 -\cfrac{\sqrt{ \smash[b]{2}} } {2} −22 | − 3 2 -\cfrac{\sqrt{ \smash[b]{3}} } {2} −23 | − 1 -1 −1 | 0 0 0 |
正 切 ( 对 比 邻 ) tan α 正切(对比邻)\tan\alpha 正切(对比邻)tanα | 0 0 0 | 2 − 3 2-\sqrt{\smash[b]{3}} 2−3 | 3 3 \cfrac{\sqrt{ \smash[b]{3}} } {3} 33 | 1 1 1 | 3 \sqrt{ \smash[b]{3}} 3 | ∅ \varnothing ∅ | − 3 -\sqrt{ \smash[b]{3}} −3 | − 1 -1 −1 | − 3 3 -\cfrac{\sqrt{ \smash[b]{3}} } {3} −33 | 0 0 0 | ∅ \varnothing ∅ |
余 切 ( 邻 比 对 ) cot α 余切(邻比对)\cot\alpha 余切(邻比对)cotα | ∅ \varnothing ∅ | 2 + 3 2+\sqrt{\smash[b]{3}} 2+3 | 3 \sqrt{ \smash[b]{3}} 3 | 1 1 1 | 3 3 \cfrac{\sqrt{ \smash[b]{3}} } {3} 33 | 0 0 0 | − 3 3 -\cfrac{\sqrt{ \smash[b]{3}} } {3} −33 | − 1 -1 −1 | − 3 -\sqrt{ \smash[b]{3}} −3 | ∅ \varnothing ∅ | 0 0 0 |
点积的结果是一个标量,当两矢量夹角<90°时,点积结果为正;=90°时,结果为0;>90°是结果为负。
点积的几何意义就是投影(视频1:30处)
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{\cdot}b = (a_x,a_y,a_z){\cdot}(b_x,b_y,b_z)=a_xb_x+a_yb_y+a_zb_z
a⋅b=(ax,ay,az)⋅(bx,by,bz)=axbx+ayby+azbz
a
⋅
b
=
∣
a
∣
∣
b
∣
cos
θ
a{\cdot}b =|a||b|\cos\theta
a⋅b=∣a∣∣b∣cosθ
点
乘
满
足
交
换
律
:
a
⋅
b
=
b
⋅
a
点乘满足交换律:a{\cdot}b =b{\cdot}a
点乘满足交换律:a⋅b=b⋅a
其还存在以下性质:
(
k
a
)
⋅
b
=
a
⋅
(
k
b
)
=
k
(
a
⋅
b
)
(ka){\cdot}b = a{\cdot}(kb)=k(a{\cdot}b)
(ka)⋅b=a⋅(kb)=k(a⋅b)
a
⋅
(
b
±
c
)
=
a
⋅
b
±
a
⋅
c
a{\cdot}(b{\pm}c)=a{\cdot}b{\pm}a{\cdot}c
a⋅(b±c)=a⋅b±a⋅c
矢
量
与
自
己
的
点
积
=
该
矢
量
模
的
平
方
即
:
v
⋅
v
=
v
x
v
x
+
v
y
v
y
+
v
z
v
z
=
∣
v
∣
2
矢量与自己的点积=该矢量模的平方 即:v{\cdot}v = v_xv_x + v_yv_y+v_zv_z=|v|^2
矢量与自己的点积=该矢量模的平方即:v⋅v=vxvx+vyvy+vzvz=∣v∣2
矢量的差积:
叉积也成外积,矢量叉积的结果是一个矢量(5:30处),该矢量同时垂直于叉积的两个矢量,该矢量的模为两矢量构成的平行四边形的面积
a
×
b
=
(
a
x
,
a
y
,
a
z
)
×
(
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
)
a\times b = (a_x,a_y,a_z)\times(b_x,b_y,b_z) = (a_yb_z-a_zb_y,a_zb_x-a_xb_z,a_xb_y-a_yb_x)
a×b=(ax,ay,az)×(bx,by,bz)=(aybz−azby,azbx−axbz,axby−aybx)
∣
a
×
b
∣
=
∣
a
∣
∣
b
∣
sin
θ
|a\times b| = |a||b|\sin\theta
∣a×b∣=∣a∣∣b∣sinθ
叉 乘 满 足 反 交 换 律 , 不 满 足 交 换 律 : a × b = − ( b × a ) = / b × a 叉乘满足反交换律,不满足交换律:a\times b =-(b\times a) {=}\mathllap{/\,}b\times a 叉乘满足反交换律,不满足交换律:a×b=−(b×a)=/b×a
叉 乘 不 满 足 结 合 律 : ( a × b ) × c = / a × ( b × c ) 叉乘不满足结合律:(a\times b)\times c {=}\mathllap{/\,} a\times(b\times c) 叉乘不满足结合律:(a×b)×c=/a×(b×c)
4.4.3矩阵与矩阵运算
矢量可以视作:列矩阵(n行×1列的矩阵) 或 行矩阵(1行×n列的矩阵)
一
个
标
量
K
~
与
矩
阵
M
~
相
乘
:
K
M
=
M
K
=
K
[
m
11
m
21
m
31
m
12
m
22
m
32
m
13
m
23
m
33
]
=
[
k
m
11
k
m
21
k
m
31
k
m
12
k
m
22
k
m
32
k
m
13
k
m
23
k
m
33
]
一个\utilde{标量K}与\utilde{矩阵M}相乘:KM = MK =K \begin{bmatrix} m_{11} & m_{21} & m_{31}\\ m_{12} & m_{22} & m_{32}\\ m_{13} & m_{23} & m_{33} \end{bmatrix} =\begin{bmatrix} km_{11} & km_{21} & km_{31}\\ km_{12} & km_{22} & km_{32}\\ km_{13} & km_{23} & km_{33} \end{bmatrix}
一个
标量K与
矩阵M相乘:KM=MK=K⎣⎡m11m12m13m21m22m23m31m32m33⎦⎤=⎣⎡km11km12km13km21km22km23km31km32km33⎦⎤
矩阵与矩阵相乘:对应元素值如下所示:
例
如
:
c
11
=
a
11
b
11
+
a
21
b
12
例如:c_{11} = a_{11}b_{11}+a_{21}b_{12}
例如:c11=a11b11+a21b12
矩阵与矩阵相乘: | [ b 11 b 21 b 31 b 12 b 22 b 32 ] \begin{bmatrix} \colorbox{aqua} {$b_{11}$} & b_{21} & b_{31}\\ \colorbox{aqua} {$b_{12}$} & b_{22} & b_{32}\\ \end{bmatrix} [b11b12b21b22b31b32] |
---|---|
[ a 11 a 21 a 12 a 22 ] \begin{bmatrix} \colorbox{aqua} {$a_{11}$} & \colorbox{aqua} {$a_{21}$} \\ a_{12} & a_{22} \\ \end{bmatrix} [a11a12a21a22] | [ c 11 b 21 c 31 c 12 c 22 c 32 ] \begin{bmatrix} \colorbox{aqua} {$c_{11}$} & b_{21} & c_{31}\\ c_{12} & c_{22} & c_{32}\\ \end{bmatrix} [c11c12b21c22c31c32] |
性质:
不
满
足
交
换
律
:
A
B
=
/
B
A
不满足交换律:AB{=}\mathllap{/\,}BA
不满足交换律:AB=/BA
满
足
结
合
律
:
(
A
B
)
C
=
A
(
B
C
)
由
此
可
得
:
A
B
C
D
E
=
(
(
A
(
B
C
)
)
D
)
E
=
(
A
B
)
(
C
D
)
E
满足结合律:(AB)C = A(BC)由此可得:ABCDE=((A(BC))D)E=(AB)(CD)E
满足结合律:(AB)C=A(BC)由此可得:ABCDE=((A(BC))D)E=(AB)(CD)E
特殊矩阵:
1.方块矩阵(方阵)
行数与列数相等的矩阵,也就是1×1,2×2,3×3,…n×n的矩阵
对角矩阵: 除了对角元素的其他所有元素都为0的方块矩阵
例
如
:
=
[
n
0
0
0
0
m
0
0
0
0
x
0
0
0
0
y
]
例如: =\begin{bmatrix} n & 0 & 0 & 0\\ 0 & m & 0 & 0\\ 0 & 0 & x & 0\\ 0 & 0 & 0 & y \end{bmatrix}
例如:=⎣⎢⎢⎡n0000m0000x0000y⎦⎥⎥⎤
2.单位矩阵
单位矩阵是对角元素全为1的对角矩阵
例
如
:
本
书
中
单
位
矩
阵
写
为
:
I
=
[
1
0
0
0
1
0
0
0
1
]
例如:本书中单位矩阵写为:I =\begin{bmatrix} 1 & 0 & 0\\ 0 & 1 & 0\\ 0 & 0 & 1\\ \end{bmatrix}
例如:本书中单位矩阵写为:I=⎣⎡100010001⎦⎤
一
个
矩
阵
与
单
位
矩
阵
相
乘
等
于
原
矩
阵
:
I
M
=
M
I
=
M
一个矩阵与单位矩阵相乘等于原矩阵:IM=MI=M
一个矩阵与单位矩阵相乘等于原矩阵:IM=MI=M
3.转置矩阵
将
一
个
n
×
m
的
矩
阵
M
翻
转
为
m
×
n
的
矩
阵
M
T
,
得
到
的
矩
阵
就
是
原
矩
阵
的
转
置
矩
阵
将一个n×m的矩阵M翻转为m×n的矩阵M^T,得到的矩阵就是原矩阵的转置矩阵
将一个n×m的矩阵M翻转为m×n的矩阵MT,得到的矩阵就是原矩阵的转置矩阵
例
如
:
=
[
m
1
n
1
m
2
n
2
m
3
n
3
]
T
=
[
m
1
m
2
m
3
n
1
n
2
n
3
]
例如: =\begin{bmatrix} m1 & n1 \\ m2 & n2 \\ m3 & n3 \\ \end{bmatrix}^ T= \begin{bmatrix} m1 & m2 & m3\\ n1 & n2 & n3 \end{bmatrix}
例如:=⎣⎡m1m2m3n1n2n3⎦⎤T=[m1n1m2n2m3n3]
性质:
1.转置矩阵的转置 等于 原矩阵
(
M
T
)
T
=
M
(M^T)^T = M
(MT)T=M
2.矩阵相乘的转置等于各个矩阵的转置矩阵反向相乘
(
A
B
)
T
=
B
T
A
T
(AB)^T=B^T A^T
(AB)T=BTAT
4.逆矩阵
不是所有矩阵都有逆矩阵,但有逆矩阵的矩阵一定是一个方阵。一个矩阵有对应的逆矩阵则说他是可逆的或者说是非奇异的,反之则说是不可逆的,奇异的
逆矩阵的符号表示为:
M
的
逆
矩
阵
为
M
−
1
M的逆矩阵为M^{-1}
M的逆矩阵为M−1
一个矩阵与他的逆矩阵相乘结果为单位矩阵:
M
M
−
1
=
M
−
1
M
=
I
MM^{-1} = M^{-1}M = I
MM−1=M−1M=I
性质:
1.逆矩阵的逆矩阵是原矩阵本身
(
M
−
1
)
−
1
=
M
(M^{-1})^{-1} = M
(M−1)−1=M
2.单位矩阵的逆矩阵是它本身
I
−
1
=
I
I^{-1}=I
I−1=I
3.转置矩阵的逆矩阵是 原矩阵 的逆矩阵的转置
(
M
T
)
−
1
=
(
M
−
1
)
T
(M^T)^{-1}=(M^{-1})^T
(MT)−1=(M−1)T
4.逆矩阵相乘后的逆矩阵等于他们的逆矩阵反向相乘
(
A
B
)
−
1
=
B
−
1
A
−
1
(AB)^{-1} = B^{-1}A^{-1}
(AB)−1=B−1A−1
5.正交矩阵
如果一个方阵与它的转置矩阵的乘积是单位矩阵的话,我们就说这个矩阵是正交的
M
M
T
=
M
T
M
=
I
MM^T=M^TM=I
MMT=MTM=I
由此可得:如果一个矩阵是正交的,那么他的转置矩阵=逆矩阵
M
是
正
交
矩
阵
则
:
M
T
=
M
−
1
M是正交矩阵则:M^T=M^{-1}
M是正交矩阵则:MT=M−1
这个性质非常重要,三维变换会常用到逆矩阵来得到反向变换。但逆矩阵的求解计算量会比较大,如果他是一个正交矩阵矩阵则会好办许多。如何简单的判断一个矩阵是不是正交矩阵需要了解正交矩阵的几何意义(3:50处)。
结论:(将每行的三个元素看做一个矢量)三个矢量都是单位矢量,且三个矢量相互垂直(标准正正交基)。
4.4.5矢量变矩阵的用法
我们可以随意将一个矢量变为行矩阵或列矩阵,但当我们将其与另一个矩阵相乘时会有区别。在unity中常规做法是吧矢量放在矩阵右侧,将矢量变为列矩阵进行计算。
4.5.1变换
变换名称 | 线性变换 | 仿射变换 | 可逆矩阵 | 正交矩阵 |
---|---|---|---|---|
平移矩阵 | × | √ | √ | × |
绕坐标轴旋转的旋转矩阵 | √ | √ | √ | √ |
绕任意轴旋转的旋转矩阵 | √ | √ | √ | √ |
绕坐标轴旋转的缩放矩阵 | √ | √ | √ | × |
错切矩阵 | √ | √ | √ | × |
镜像矩阵 | √ | √ | √ | √ |
正交投影矩阵 | √ | √ | × | × |
透视投影矩阵 | × | × | × | × |
仿射变换合并线性变换和平移变换的变换类型。仿射变换可以用一个4×4的矩阵表示,为此,我们需要将矢量扩展为4维空间下,这就是齐次坐标空间。
4.5.2齐次坐标
齐次坐标是一个四维矢量(书中泛指四维齐次坐标)。一个三维坐标从三维坐标变为其次坐标:将其第四维w设为1。一个方向矢量,则将w设为0。
4.5.4平移矩阵
对一个点进行平移变换:将点(x,y,z)在空间中平移(tx,ty,tz)个单位
[
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⎦⎥⎥⎤
平移矩阵的逆矩阵:反向平移的矩阵
[
1
0
0
−
t
x
0
1
0
−
t
y
0
0
1
−
t
z
0
0
0
1
]
\begin{bmatrix} 1 & 0 & 0 & -t_x \\ 0 & 1 & 0 & -t_y \\ 0 & 0 & 1 & -t_z \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}
⎣⎢⎢⎡100001000010−tx−ty−tz1⎦⎥⎥⎤
4.5.5缩放矩阵
对
于
点
[
k
x
0
0
0
0
k
y
0
0
0
0
k
z
0
0
0
0
1
]
[
x
y
z
1
]
=
[
k
x
x
k
y
y
k
z
z
1
]
对于点 \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 \\ 1 \\ \end{bmatrix} = \begin{bmatrix} k_xx \\ k_yy \\ k_zz \\ 1 \\ \end{bmatrix}
对于点⎣⎢⎢⎡kx0000ky0000kz00001⎦⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤=⎣⎢⎢⎡kxxkyykzz1⎦⎥⎥⎤
对
于
向
量
[
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⎦⎥⎥⎤
如果kx=ky=kz则称为统一缩放,否则为非统一缩放。
缩放矩阵的逆矩阵是原来缩放系数的倒数进行缩放。
[
1
k
x
0
0
0
0
1
k
y
0
0
0
0
1
k
z
0
0
0
0
1
]
\begin{bmatrix} \cfrac{1}{k_x} & 0 & 0 & 0 \\ 0 & \cfrac{1}{k_y} & 0 & 0 \\ 0 & 0 & \cfrac{1}{k_z} & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}
⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡kx10000ky10000kz100001⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
4.5.6旋转矩阵
绕x轴旋转:
R
x
(
θ
)
=
[
1
0
0
0
0
cos
θ
−
sin
θ
0
0
sin
θ
cos
θ
0
0
0
0
1
]
R_x(\theta)= \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta & 0 \\ 0 & \sin\theta & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}
Rx(θ)=⎣⎢⎢⎡10000cosθsinθ00−sinθcosθ00001⎦⎥⎥⎤
绕y轴旋转:
R
y
(
θ
)
=
[
cos
θ
0
sin
θ
0
0
1
0
0
−
sin
θ
0
cos
θ
0
0
0
0
1
]
R_y(\theta)= \begin{bmatrix} \cos\theta & 0 & \sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -\sin\theta & 0 & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}
Ry(θ)=⎣⎢⎢⎡cosθ0−sinθ00100sinθ0cosθ00001⎦⎥⎥⎤
绕z轴旋转:
R
z
(
θ
)
=
[
cos
θ
−
sin
θ
0
0
sin
θ
cos
θ
0
0
0
0
1
0
0
0
0
1
]
R_z(\theta)= \begin{bmatrix} \cos\theta & -\sin\theta & 0 & 0 \\ \sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}
Rz(θ)=⎣⎢⎢⎡cosθsinθ00−sinθcosθ0000100001⎦⎥⎥⎤
4.5.7复合变换
绝大多数情况下,我们约定变换顺序是先缩放,再旋转,最后平移
v
n
e
w
=
M
平
移
M
旋
转
M
缩
放
v
o
l
d
v_{new} = M_{平移}M_{旋转}M_{缩放}v_{old}
vnew=M平移M旋转M缩放vold
关于旋转顺序:unity中旋转顺序是zxy,即:先绕z轴旋转,再绕x轴旋转,最后绕y轴旋转
M
r
o
t
a
t
Z
M
r
o
t
a
t
X
M
r
o
t
a
t
Y
=
[
cos
θ
−
sin
θ
0
0
sin
θ
cos
θ
0
0
0
0
1
0
0
0
0
1
]
[
1
0
0
0
0
cos
θ
−
sin
θ
0
0
sin
θ
cos
θ
0
0
0
0
1
]
[
cos
θ
0
sin
θ
0
0
1
0
0
−
sin
θ
0
cos
θ
0
0
0
0
1
]
M_{rotat Z}M_{rotat X}M_{rotat Y}=\begin{bmatrix} \cos\theta & -\sin\theta & 0 & 0 \\ \sin\theta & \cos\theta & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & \cos\theta & -\sin\theta & 0 \\ 0 & \sin\theta & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} \cos\theta & 0 & \sin\theta & 0 \\ 0 & 1 & 0 & 0 \\ -\sin\theta & 0 & \cos\theta & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}
MrotatZMrotatXMrotatY=⎣⎢⎢⎡cosθsinθ00−sinθcosθ0000100001⎦⎥⎥⎤⎣⎢⎢⎡10000cosθsinθ00−sinθcosθ00001⎦⎥⎥⎤⎣⎢⎢⎡cosθ0−sinθ00100sinθ0cosθ00001⎦⎥⎥⎤
4.6.2坐标空间的变换
设:父坐标空间P和子坐标空间C 我们常用到将C下的点与矢量转换到P下 或 相反:Mc->p,Mp->c
如果我们得到Mc->p,其逆矩阵便是Mp->c
而求Mc->p时,我们知道C的三个坐标轴在P下表示为xc,yc,zc,以及其原点位置Oc
那么我们可以得到他的变换矩阵为:
M
c
→
p
=
[
∣
∣
∣
∣
x
c
y
c
z
c
O
c
∣
∣
∣
∣
0
0
0
1
]
M_{c\to p}= \begin{bmatrix} | & | & | & | \\ x_c & y_c & z_c & O_c \\ | & | & | & | \\ 0 & 0 & 0 & 1 \\ \end{bmatrix}
Mc→p=⎣⎢⎢⎡∣xc∣0∣yc∣0∣zc∣0∣Oc∣1⎦⎥⎥⎤
对方向矢量的坐标空间变幻可以使用3×3的矩阵表示,不需要表示平移变换。
M
c
→
p
=
[
∣
∣
∣
x
c
y
c
z
c
∣
∣
∣
]
M_{c\to p}= \begin{bmatrix} | & | & | & \\ x_c & y_c & z_c \\ | & | & | \\ \end{bmatrix}
Mc→p=⎣⎡∣xc∣∣yc∣∣zc∣⎦⎤
模型空间:也叫对象/局部空间,模型自己独有的坐标空间。
世界空间:宏观概念上的最大空间。
观察空间:摄像机空间。
裁剪空间:(齐次裁剪空间)由视锥体来决定对渲染图源进行裁剪的空间。完全位于这块空间内部的图元将会被保留,完全位于这块空间外部的图元将会被剔除,而与这块空间边界相交的图元就会被裁剪。视椎体有两种:正交投影与透视投影。
屏幕空间:像素位置投影的二维空间。
模型变换:将顶点坐标从模型空间变换到世界空间中。
观察变换:将顶点坐标从世界空间变换到观察空间中。
投影变换:从观察空间到裁剪空间,其中用于变换的矩阵叫裁剪矩阵(投影矩阵)。
Aspect:摄像机纵横比。FOV:摄像机可视角度。Near:近裁剪平面距离。Far:远裁剪平面距离。
透视投影矩阵与顶点相乘后结果本质是对xyz分量做了不同程度的缩放(z有了平移),此时w分量不再是1:
M
透
视
投
影
矩
阵
P
顶
点
[
cos
F
O
V
2
A
s
p
e
c
t
0
0
0
0
cos
F
O
V
2
0
0
0
0
−
F
a
r
+
N
e
a
r
F
a
r
−
N
e
a
r
−
2
⋅
F
a
r
⋅
N
e
a
r
F
a
r
−
N
e
a
r
0
0
−
1
0
]
[
x
y
z
1
]
=
[
x
cos
F
O
V
2
A
s
p
e
c
t
y
cos
F
O
V
2
−
z
F
a
r
+
N
e
a
r
F
a
r
−
N
e
a
r
−
2
⋅
F
a
r
⋅
N
e
a
r
F
a
r
−
N
e
a
r
−
z
]
M_{透视投影矩阵}P_{顶点} \begin{bmatrix} \cfrac{\cos\cfrac{FOV}{2}}{Aspect} & 0 & 0 & 0 \\ 0 & \cos\cfrac{FOV}{2} & 0 & 0 \\ 0 & 0 & -\cfrac{Far+Near}{Far-Near} & -\cfrac{2\cdot Far\cdot Near}{Far-Near} \\ 0 & 0 & -1 & 0 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \\ \end{bmatrix}= \begin{bmatrix} x\cfrac{\cos\cfrac{FOV}{2}}{Aspect} \\ y\cos\cfrac{FOV}{2} \\ -z\cfrac{Far+Near}{Far-Near} -\cfrac{2\cdot Far\cdot Near}{Far-Near} \\ -z \\ \end{bmatrix}
M透视投影矩阵P顶点⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡Aspectcos2FOV0000cos2FOV0000−Far−NearFar+Near−100−Far−Near2⋅Far⋅Near0⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎢⎡xAspectcos2FOVycos2FOV−zFar−NearFar+Near−Far−Near2⋅Far⋅Near−z⎦⎥⎥⎥⎥⎥⎥⎥⎥⎥⎤
Size:视椎体垂直方向上高度的一半。
正交投影矩阵与顶点相乘后:
M
正
交
投
影
矩
阵
P
顶
点
[
1
A
s
p
e
c
t
⋅
S
i
z
e
0
0
0
0
1
S
i
z
e
0
0
0
0
−
2
F
a
r
−
N
e
a
r
−
F
a
r
+
N
e
a
r
F
a
r
−
N
e
a
r
0
0
0
1
]
[
x
y
z
1
]
=
[
x
A
s
p
e
c
t
⋅
S
i
z
e
y
S
i
z
e
−
2
z
F
a
r
−
N
e
a
r
−
F
a
r
+
N
e
a
r
F
a
r
−
N
e
a
r
1
]
M_{正交投影矩阵}P_{顶点} \begin{bmatrix} \cfrac{1}{Aspect \cdot Size} & 0 & 0 & 0 \\ 0 & \cfrac{1}{Size} & 0 & 0 \\ 0 & 0 & -\cfrac{2}{Far-Near} & -\cfrac{Far + Near}{Far-Near} \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} \begin{bmatrix} x \\ y \\ z \\ 1 \\ \end{bmatrix}= \begin{bmatrix} \cfrac{x}{Aspect\cdot Size} \\ \cfrac{y}{Size} \\ -\cfrac{2z}{Far-Near} -\cfrac{Far+ Near}{Far-Near} \\ 1 \\ \end{bmatrix}
M正交投影矩阵P顶点⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡Aspect⋅Size10000Size10000−Far−Near2000−Far−NearFar+Near1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤⎣⎢⎢⎡xyz1⎦⎥⎥⎤=⎣⎢⎢⎢⎢⎢⎢⎢⎢⎡Aspect⋅SizexSizey−Far−Near2z−Far−NearFar+Near1⎦⎥⎥⎥⎥⎥⎥⎥⎥⎤
现在判断顶点在不在视椎体内,它需要满足-w≤x≤w,-w≤y≤w,-w≤z≤w
齐次除法与屏幕映射:齐次除法也叫透视除法,用w分量去除以x,y,z分量。得到归一化的设备坐标(NDC)。
unity中屏幕空间左下角的像素坐标是(0,0)。
齐次除法与屏幕映射的过程(unity会帮我们完成):
pixelWidth与pixelHeight是当前的屏幕像素宽高。cilpx/y是裁剪空间中的坐标x与y。
s
c
r
e
e
n
x
=
c
l
i
p
x
⋅
p
i
x
e
l
W
i
d
t
h
2
⋅
c
l
i
p
x
+
p
i
x
e
l
W
i
d
t
h
2
screen_x=\cfrac {clip_x \cdot pixelWidth}{2\cdot clip_x}+\cfrac{pixelWidth}{2}
screenx=2⋅clipxclipx⋅pixelWidth+2pixelWidth
s
c
r
e
e
n
y
=
c
l
i
p
y
⋅
p
i
x
e
l
H
e
i
g
h
t
2
⋅
c
l
i
p
y
+
p
i
x
e
l
H
e
i
g
h
t
2
screen_y=\cfrac {clip_y \cdot pixelHeight}{2\cdot clip_y}+\cfrac{pixelHeight}{2}
screeny=2⋅clipyclipy⋅pixelHeight+2pixelHeight
4.8UnityShader内置变量
4.8.1变换矩阵
Unity内置的变换矩阵 | 描述 |
---|---|
UNITY_MATRIX_MVP(后来版本变更为UnityObjectToClipPos()) | 当前模型·观察·投影矩阵,将顶点/方向矢量 从模型空间变换到裁剪空间 |
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的逆矩阵,用于将顶点/方向矢量从世界空间变换到模型空间 |
4.8.2摄像机和屏幕参数
变量名 | 类型 | 描述 |
---|---|---|
_WorldSpaceCameraPos | float3 | 该摄像机在世界空间中的位置 |
_ProjectionParams | float4 | x=1.0(或-1.0,如果正在使用一个翻转的投影矩阵进行渲染),y=Near,z=Far,w=1.0+1.0/Far,其中Far和Near分别是近裁剪平面和远裁剪平面的摄像机距离 |
_ScreenParams | float4 | x=width,y=height,z=1.0+1.0/width,w=1.0+1.0/height,其中width和height分别是该摄像机的渲染目标的像素宽度和高度 |
_ZBbufferParams | float4 | x=11-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个裁剪平面在世界空间下的等式,按如下顺序:左,右,下,上,近,远 裁剪平面 |