视频&图片来源:【B站】GAMES101-现代计算机图形学入门-闫令琪
目录
1.零碎的概念
- 实时:从CG的角度说,≥30fps的情况可以称作实时(Real-time);否则,则称为离线(Offline)。
2.向量
- A B → = B − A \overrightarrow {AB}=B-A AB=B−A
- 向量的长度: ∥ a → ∥ \lVert \overrightarrow{a}\rVert ∥a∥
- 单位向量: a ^ = a → ∥ a → ∥ \hat{a}=\frac{\overrightarrow{a}}{\lVert\overrightarrow{a}\rVert} a^=∥a∥a. 其中, ∥ a ^ ∥ = 1 \lVert\hat{a}\rVert=1 ∥a^∥=1.
- 向量求和:左图平行四边形法则;右图三角法则
- 笛卡尔坐标系下的描述:
A = ( x y ) A=\left(\begin{matrix} x\\ y\\ \end{matrix}\right) A=(xy) , A T = ( x , y ) A^T=\left(x,y\right) AT=(x,y), ∥ A ∥ = x 2 + y 2 \lVert A\rVert=\sqrt{x^2+y^2} ∥A∥=x2+y2
3.向量的点乘
3.1 概念
- 向量的点乘:可以帮助快速得到两个向量之间的夹角
a → ⋅ b → = ∥ a → ∥ ∥ b → ∥ cos θ \overrightarrow{a}\cdot\overrightarrow{b}=\lVert\overrightarrow{a}\rVert \lVert\overrightarrow{b}\rVert \cos\theta a⋅b=∥a∥∥b∥cosθ. 其中, cos θ = a → ⋅ b → ∥ a → ∥ ∥ b → ∥ \cos\theta=\frac{\overrightarrow{a}\cdot\overrightarrow{b}}{\lVert\overrightarrow{a}\rVert \lVert\overrightarrow{b}\rVert} cosθ=∥a∥∥b∥a⋅b
对于单位向量: cos θ = a ^ ⋅ b ^ \cos\theta=\hat{a}\cdot\hat{b} cosθ=a^⋅b^. - 向量点乘的性质:
a → ⋅ b → = b → ⋅ a → \overrightarrow{a}\cdot\overrightarrow{b}=\overrightarrow{b}\cdot\overrightarrow{a} a⋅b=b⋅a
a → ⋅ ( b → + c → ) = a → ⋅ b → + a → ⋅ c → \overrightarrow{a}\cdot(\overrightarrow{b}+\overrightarrow{c})=\overrightarrow{a}\cdot\overrightarrow{b}+\overrightarrow{a}\cdot\overrightarrow{c} a⋅(b+c)=a⋅b+a⋅c
( k a → ) ⋅ b → = a → ⋅ ( k b → ) = k ( a → ⋅ b → ) (k\overrightarrow{a})\cdot\overrightarrow{b}=\overrightarrow{a}\cdot(k\overrightarrow{b})=k(\overrightarrow{a}\cdot\overrightarrow{b}) (ka)⋅b=a⋅(kb)=k(a⋅b)
3.2 笛卡尔坐标系下的向量点乘
- 2D环境
a → ⋅ b → = ( x a y a ) ⋅ ( x b y b ) = x a x b + y a y b \overrightarrow{a}\cdot\overrightarrow{b}=\left(\begin{matrix} x_a\\ y_a\\ \end{matrix}\right) \cdot \left(\begin{matrix} x_b\\ y_b\\ \end{matrix}\right)=x_ax_b+y_ay_b a⋅b=(xaya)⋅(xbyb)=xaxb+yayb. - 3D环境
a → ⋅ b → = ( x a y a z a ) ⋅ ( x b y b z b ) = x a x b + y a y b + z a z b \overrightarrow{a}\cdot\overrightarrow{b}=\left(\begin{matrix} x_a\\ y_a\\ z_a\\ \end{matrix}\right) \cdot \left(\begin{matrix} x_b\\ y_b\\ z_b\\ \end{matrix}\right)=x_ax_b+y_ay_b+z_az_b a⋅b=⎝⎛xayaza⎠⎞⋅⎝⎛xbybzb⎠⎞=xaxb+yayb+zazb.
3.3 点乘在图形学中的作用
- 快速找到两个向量之间的夹角
- 找到一个向量到另一个向量上的投影
e.g. b → ⊥ \overrightarrow{b}_\bot b⊥是 b → \overrightarrow{b} b在 a → \overrightarrow{a} a上的投影- b → ⊥ \overrightarrow{b}_\bot b⊥必须沿着 a → \overrightarrow{a} a或者 a ^ \hat{a} a^的方向,即 b → ⊥ = k a ^ \overrightarrow{b}_\bot=k\hat{a} b⊥=ka^
- 系数
k
k
k:
k
=
∥
b
→
⊥
∥
=
∥
b
→
∥
cos
θ
k=\lVert\overrightarrow{b}_\bot\rVert=\lVert\overrightarrow{b}\rVert\cos\theta
k=∥b⊥∥=∥b∥cosθ. 算长度用的。
- 测量两个方向上的距离
- 向量分解
- 确认向量前(forward)与后(backward)的信息:在方向上有多接近
4.向量的叉乘
4.1 概念
- 叉乘计算得出的向量必然和原始的两个向量垂直(不在一个平面内)
即: a → × b → = c → \overrightarrow{a}\times\overrightarrow{b}=\overrightarrow{c} a×b=c,其中, a → ⊥ b → \overrightarrow{a}\bot\overrightarrow{b} a⊥b且 b → ⊥ c → \overrightarrow{b}\bot\overrightarrow{c} b⊥c,遵循右手螺旋定则。 - 性质:
a → × b → = − b → × a → \overrightarrow{a}\times\overrightarrow{b}=-\overrightarrow{b}\times\overrightarrow{a} a×b=−b×a
∥ a → × b → ∥ = ∥ a → ∥ ∥ b → ∥ sin θ \lVert\overrightarrow{a}\times\overrightarrow{b}\rVert=\lVert \overrightarrow{a}\rVert\lVert\overrightarrow{b}\rVert\sin\theta ∥a×b∥=∥a∥∥b∥sinθ
a → × a → = 0 → \overrightarrow{a}\times\overrightarrow{a}=\overrightarrow{0} a×a=0. 强调:得到的是一个长度为0的向量
a → × ( b → + c → ) = a → × b → + a → × c → \overrightarrow{a}\times(\overrightarrow{b}+\overrightarrow{c})=\overrightarrow{a}\times\overrightarrow{b}+\overrightarrow{a}\times\overrightarrow{c} a×(b+c)=a×b+a×c
a → × ( k b → ) = k ( a → × b → ) \overrightarrow{a}\times(k\overrightarrow{b})=k(\overrightarrow{a}\times\overrightarrow{b}) a×(kb)=k(a×b)
4.2 笛卡尔坐标系下的叉乘
a → × b → = ( y a z b − y b z a z a x b − x a z b x a y b − y a x b ) \overrightarrow{a}\times\overrightarrow{b}=\left(\begin{matrix} y_az_b-y_bz_a\\ z_ax_b-x_az_b\\ x_ay_b-y_ax_b\\ \end{matrix}\right) a×b=⎝⎛yazb−ybzazaxb−xazbxayb−yaxb⎠⎞
- 矩阵表示形式
a → × b → = A ∗ b = ( 0 − z a y a z a 0 − x a − y a x a 0 ) ( x b y b z b ) \overrightarrow{a}\times\overrightarrow{b}=A^*b=\left(\begin{matrix} 0&-z_a&y_a\\ z_a&0&-x_a\\ -y_a&x_a&0\\ \end{matrix}\right)\left(\begin{matrix} x_b\\ y_b\\ z_b\\ \end{matrix}\right) a×b=A∗b=⎝⎛0za−ya−za0xaya−xa0⎠⎞⎝⎛xbybzb⎠⎞
4.3 叉乘在图形学中的作用
- 判定左右:为正,在左;为负,在右。
- 判定内外:多边形的每个顶点和这个点的连线叉乘多边形的每一条边,在边的左侧还是边的右侧,判断是不是同在左or同在右。得到0向量的话up to you…
5. 正交坐标系内的表示
- 3D,其中
u
→
,
v
→
,
w
→
\overrightarrow{u},\overrightarrow{v},\overrightarrow{w}
u,v,w互相垂直,且都是单位向量
∥ u → ∥ = ∥ v → ∥ = ∥ w → ∥ = 1 \lVert\overrightarrow{u}\rVert=\lVert\overrightarrow{v}\rVert=\lVert\overrightarrow{w}\rVert=1 ∥u∥=∥v∥=∥w∥=1
u → ⋅ v → = v → ⋅ w → = u → ⋅ w → = 0 \overrightarrow{u}\cdot\overrightarrow{v}=\overrightarrow{v}\cdot\overrightarrow{w}=\overrightarrow{u}\cdot\overrightarrow{w}=0 u⋅v=v⋅w=u⋅w=0
w → = u → × v → \overrightarrow{w}=\overrightarrow{u}\times\overrightarrow{v} w=u×v 右手螺旋定则 -
p
→
\overrightarrow{p}
p分解到三个方向上:
p → = ( p → ⋅ u → ) u → + ( p → ⋅ v → ) v → + ( p → ⋅ w → ) w → \overrightarrow{p}=(\overrightarrow{p}\cdot\overrightarrow{u})\overrightarrow{u}+(\overrightarrow{p}\cdot\overrightarrow{v})\overrightarrow{v}+(\overrightarrow{p}\cdot\overrightarrow{w})\overrightarrow{w} p=(p⋅u)u+(p⋅v)v+(p⋅w)w
6.矩阵
6.1 矩阵乘法
- 成立条件:对于
A
×
B
=
C
A\times B=C
A×B=C,乘法成立的条件是矩阵A的列数=矩阵B的行数
大概这种感觉: A m × n × B n × p = C m × p A_{m\times n}\times B_{n\times p}=C_{m\times p} Am×n×Bn×p=Cm×p - 性质: 交换律不成立,结合律和分配律成立。
( A B ) C = A ( B C ) (AB)C=A(BC) (AB)C=A(BC)
A ( B + C ) = A B + A C A(B+C)=AB+AC A(B+C)=AB+AC
( A + B ) C = A C + B C (A+B)C=AC+BC (A+B)C=AC+BC - 矩阵和向量的乘法:把向量看作 m × 1 m\times1 m×1的列矩阵,是变换的核心
6.2 矩阵形式的向量乘法
- 点乘: a → ⋅ b → = a → T b → = ( x a y a z a ) ( x b y b z b ) = ( x a x b + y a y b + z a z b ) \overrightarrow{a}\cdot\overrightarrow{b}=\overrightarrow{a}^T\overrightarrow{b}=(\begin{matrix}x_a&y_a&z_a\end{matrix})\left(\begin{matrix}x_b\\y_b\\z_b\end{matrix}\right)=(x_ax_b+y_ay_b+z_az_b) a⋅b=aTb=(xayaza)⎝⎛xbybzb⎠⎞=(xaxb+yayb+zazb)
- 叉乘:
a
→
×
b
→
=
A
∗
b
=
(
0
−
z
a
y
a
z
a
0
−
x
a
−
y
a
x
a
0
)
(
x
b
y
b
z
b
)
\overrightarrow{a}\times\overrightarrow{b}=A^*b=\left(\begin{matrix}0&-z_a&y_a\\z_a&0&-x_a\\-y_a&x_a&0\end{matrix}\right)\left(\begin{matrix}x_b\\y_b\\z_b\end{matrix}\right)
a×b=A∗b=⎝⎛0za−ya−za0xaya−xa0⎠⎞⎝⎛xbybzb⎠⎞
其中, A ∗ A^* A∗是 a → \overrightarrow{a} a的对偶矩阵(dual matrix)
6.3 矩阵的其他操作
-
转置: ( 1 2 3 4 5 6 ) T = ( 1 3 5 2 4 6 ) \left(\begin{matrix} 1&2\\ 3&4\\ 5&6\\ \end{matrix}\right)^T=\left(\begin{matrix} 1&3&5\\ 2&4&6 \end{matrix}\right) ⎝⎛135246⎠⎞T=(123456)
转置的性质: ( A B ) T = B T A T (AB)^T=B^TA^T (AB)T=BTAT -
单位矩阵及其逆矩阵
单位矩阵: I 3 × 3 = ( 1 0 0 0 1 0 0 0 1 ) I_{3\times3}=\left(\begin{matrix} 1&0&0\\ 0&1&0\\ 0&0&1 \end{matrix}\right) I3×3=⎝⎛100010001⎠⎞
A A − 1 = A − 1 A = I AA^{-1}=A^{-1}A=I AA−1=A−1A=I
( A B ) − 1 = B − 1 A − 1 (AB)^{-1}=B^{-1}A^{-1} (AB)−1=B−1A−1