计算机图形学学习笔记(一)
什么是计算机图形学
计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。
什么是好的画面?
从技术层面简单的评判标准:直接看画面是否足够“亮”。体现了图形学中的全局光照是否做的好,如果光照做的好,画面就亮,相反就暗。
线性代数
向量
向量的两个基础内容,方向和长度。
一、单位向量
长度为一的向量,叫单位向量。
a
^
\hat{a}
a^是单位向量
a
^
=
a
⃗
∣
a
⃗
∣
\hat{a}= {{\vec{a}} \over {|\vec{a}|}}
a^=∣a∣a
二、向量的和
a ⃗ \vec{a} a为 ( x a , y a ) (x_a,y_a) (xa,ya)
b ⃗ \vec{b} b为 ( x b , y b ) (x_b,y_b) (xb,yb)
a ⃗ + b ⃗ = ( x a + x b , y a + y b ) \vec{a}+\vec{b}=(x_a+x_b,y_a+y_b) a+b=(xa+xb,ya+yb)
三、向量点乘
a
⃗
\vec{a}
a为
(
x
a
,
y
a
,
z
a
)
(x_a,y_a,z_a)
(xa,ya,za)
b
⃗
\vec{b}
b为
(
x
b
,
y
b
,
z
b
)
(x_b,y_b,z_b)
(xb,yb,zb)
a
⃗
\vec{a}
a和
b
⃗
\vec{b}
b点乘表示为:
a
⃗
⋅
b
⃗
=
c
o
s
θ
∣
a
⃗
∣
∣
b
⃗
∣
{\vec{a}\cdot\vec{b}=cos \theta|\vec{a}||\vec{b}|}
a⋅b=cosθ∣a∣∣b∣
如果
a
⃗
\vec{a}
a和
b
⃗
\vec{b}
b都是单位向量即
a
^
\hat{a}
a^
b
^
\hat{b}
b^
c
o
s
θ
=
a
^
⋅
b
^
cos \theta=\hat{a}\cdot\hat{b}
cosθ=a^⋅b^
a
⃗
\vec{a}
a和
b
⃗
\vec{b}
b点乘还可以表示为:
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
{\vec{a}\cdot\vec{b}=\vec{a}^T\vec{b}= \begin{pmatrix} x_a&y_a&z_a\\ \end{pmatrix}} \begin{pmatrix} x_b\\ y_b\\ z_b\\ \end{pmatrix} =x_ax_b+y_ay_b+z_az_b
a⋅b=aTb=(xayaza)
xbybzb
=xaxb+yayb+zazb
点乘的作用
-
求夹角
将两个向量归一化得单位向量,这单位向量的点乘就是夹角的余弦值。
即:
c
o
s
θ
=
a
^
⋅
b
^
cos \theta=\hat{a}\cdot\hat{b}
cosθ=a^⋅b^
补充一下余弦定理和推导过程:
余弦定理公式:
c
o
s
θ
=
∣
A
C
⃗
∣
2
+
∣
A
B
⃗
∣
2
−
∣
B
C
⃗
∣
2
2
∣
A
C
⃗
∣
∣
A
B
⃗
∣
cos \theta={{|\vec{AC}|^2+|\vec{AB}|^2-|\vec{BC}|^2}\over{2|\vec{AC}||\vec{AB}|}}
cosθ=2∣AC∣∣AB∣∣AC∣2+∣AB∣2−∣BC∣2
余弦定理推导过程:
B
C
⃗
=
A
C
⃗
−
A
B
⃗
B
C
⃗
2
=
(
A
C
⃗
−
A
B
⃗
)
2
B
C
⃗
T
B
C
⃗
=
(
A
C
⃗
−
A
B
⃗
)
T
(
A
C
⃗
−
A
B
⃗
)
∣
B
C
⃗
∣
2
=
A
C
⃗
T
A
C
⃗
−
2
A
C
⃗
⋅
A
B
⃗
+
A
B
⃗
T
A
B
⃗
∣
B
C
⃗
∣
2
=
∣
A
C
⃗
∣
2
−
2
A
C
⃗
⋅
A
B
⃗
+
∣
A
B
⃗
∣
2
∣
B
C
⃗
∣
2
=
∣
A
C
⃗
∣
2
−
2
c
o
s
θ
∣
A
C
⃗
∣
∣
A
B
⃗
∣
+
∣
A
B
⃗
∣
2
c
o
s
θ
=
∣
A
C
⃗
∣
2
+
∣
A
B
⃗
∣
2
−
∣
B
C
⃗
∣
2
2
∣
A
C
⃗
∣
∣
A
B
⃗
∣
\vec{BC}=\vec{AC}-\vec{AB} \\ \vec{BC}^2=(\vec{AC}-\vec{AB})^2 \\ \vec{BC}^T\vec{BC}=(\vec{AC}-\vec{AB})^T(\vec{AC}-\vec{AB}) \\ |\vec{BC}|^2=\vec{AC}^T\vec{AC}-2\vec{AC}\cdot\vec{AB}+\vec{AB}^T\vec{AB} \\ |\vec{BC}|^2=|\vec{AC}|^2-2\vec{AC}\cdot\vec{AB}+|\vec{AB}|^2 \\ |\vec{BC}|^2=|\vec{AC}|^2-2cos \theta|\vec{AC}||\vec{AB}|+|\vec{AB}|^2 \\ cos \theta={{|\vec{AC}|^2+|\vec{AB}|^2-|\vec{BC}|^2}\over{2|\vec{AC}||\vec{AB}|}}
BC=AC−ABBC2=(AC−AB)2BCTBC=(AC−AB)T(AC−AB)∣BC∣2=ACTAC−2AC⋅AB+ABTAB∣BC∣2=∣AC∣2−2AC⋅AB+∣AB∣2∣BC∣2=∣AC∣2−2cosθ∣AC∣∣AB∣+∣AB∣2cosθ=2∣AC∣∣AB∣∣AC∣2+∣AB∣2−∣BC∣2
余弦定理也可以通过向量的点乘退导出来
-
求投影
求 A B ⃗ \vec{AB} AB到 A C ⃗ \vec{AC} AC的投影 A D ⃗ \vec{AD} AD
A C ^ \hat{AC} AC^是 A B ⃗ \vec{AB} AB的单位向量
∣ A D ⃗ ∣ = ∣ A B ⃗ ∣ c o s θ |\vec{AD}|=|\vec{AB}|cos\theta ∣AD∣=∣AB∣cosθ
A D ⃗ = A C ^ ∣ A D ⃗ ∣ \vec{AD}=\hat{AC}|\vec{AD}| AD=AC^∣AD∣
-
接近和前后
cos在0°到180°上值的分布情况
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-egZWC9gH-1681284850478)(https://songimghost.oss-cn-nanjing.aliyuncs.com/img/desmos-graph1.png)]
当 A B ⃗ \vec{AB} AB越接近 A C ⃗ \vec{AC} AC,θ约小的时候, c o s θ cos\theta cosθ越接近1
当 A B ⃗ \vec{AB} AB和 A C ⃗ \vec{AC} AC方向相反时,θ大于90°, c o s θ cos\theta cosθ为负值,且越接近-1
四、向量叉乘
在右手坐标系中: A D ⃗ = A B ⃗ × A C ⃗ \vec{AD}=\vec{AB} \times \vec{AC} AD=AB×AC
A
D
⃗
\vec{AD}
AD垂直于
A
C
⃗
\vec{AC}
AC
A
D
⃗
\vec{AD}
AD垂直于
A
B
⃗
\vec{AB}
AB
∣ A D ⃗ ∣ = s i n θ ∣ A B ⃗ ∣ ∣ A C ⃗ ∣ |\vec{AD}|=sin\theta|\vec{AB}||\vec{AC}| ∣AD∣=sinθ∣AB∣∣AC∣
公式:
a ⃗ = ( x a , y a , z a ) \vec{a}=(x_a,y_a,z_a) a=(xa,ya,za)
b ⃗ = ( x b , y b , z b ) \vec{b}=(x_b,y_b,z_b) b=(xb,yb,zb)
a ⃗ × b ⃗ = ( 0 , − z a , y a z a , 0 , − x a − y a , x a , 0 ) ( x b y b z 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 ) \vec{a}\times\vec{b}=\begin{pmatrix}0,-z_a,y_a\\z_a, 0 ,-x_a\\-y_a,x_a,0 \end{pmatrix}\begin{pmatrix}x_b\\y_b\\z_b\end{pmatrix}=\begin{pmatrix}y_az_b-y_bz_a\\z_ax_b-x_az_b\\x_ay_b-y_ax_b \end{pmatrix} a×b= 0,−za,yaza,0,−xa−ya,xa,0 xbybzb = yazb−ybzazaxb−xazbxayb−yaxb
叉乘的作用
-
判断左右
在左手坐标系中, b ⃗ × a ⃗ \vec{b}\times\vec{a} b×a和z轴为正值,说明 b ⃗ \vec{b} b在 a ⃗ \vec{a} a的顺时针方向。
-
判断内外
∵ ( C A ⃗ × C D ⃗ ) ⋅ ( A B ⃗ × A D ⃗ ) \because(\vec{CA}\times\vec{CD} )\cdot(\vec{AB}\times\vec{AD}) ∵(CA×CD)⋅(AB×AD)的z轴为正值
∵ ( A B ⃗ × A D ⃗ ) ⋅ ( B C ⃗ × B D ⃗ ) \because (\vec{AB}\times\vec{AD} )\cdot(\vec{BC}\times\vec{BD}) ∵(AB×AD)⋅(BC×BD)的z轴为正值
∴ \therefore ∴ D点在ABC中间
坐标系定义
坐标分解
∣
u
⃗
∣
=
∣
v
⃗
∣
=
∣
w
⃗
∣
=
1
三个向量都是单位向量
u
⃗
⋅
v
⃗
=
v
⃗
⋅
w
⃗
=
w
⃗
⋅
u
⃗
=
0
三个向量两两夹角都是
90
°
w
⃗
=
u
⃗
×
v
⃗
向量
w
⃗
垂直于向量
u
⃗
和
v
⃗
组成的平面
p
⃗
=
(
(
p
⃗
⋅
u
⃗
)
u
⃗
(
p
⃗
⋅
v
⃗
)
v
⃗
(
p
⃗
⋅
w
⃗
)
w
⃗
)
世界坐标系向量在
u
v
w
坐标上的分量
|\vec{u}|=|\vec{v}|=|\vec{w}|=1\\ \\三个向量都是单位向量 \\~ \\\vec{u}\cdot\vec{v}=\vec{v}\cdot\vec{w}=\vec{w}\cdot\vec{u}=0\\ \\三个向量两两夹角都是90°\\ \\~\\ \vec{w}=\vec{u}\times\vec{v} \\向量\vec{w}垂直于向量\vec{u}和\vec{v}组成的平面 \\~\\ \vec{p}=\begin{pmatrix}(\vec{p}\cdot\vec{u})\vec{u}\\(\vec{p}\cdot\vec{v})\vec{v}\\(\vec{p}\cdot\vec{w})\vec{w}\end{pmatrix} \\世界坐标系向量在uvw坐标上的分量
∣u∣=∣v∣=∣w∣=1三个向量都是单位向量 u⋅v=v⋅w=w⋅u=0三个向量两两夹角都是90° w=u×v向量w垂直于向量u和v组成的平面 p=
(p⋅u)u(p⋅v)v(p⋅w)w
世界坐标系向量在uvw坐标上的分量
矩阵
单位矩阵
( 1 , 0 , 0 , 0 0 , 1 , 0 , 0 0 , 0 , 1 , 0 0 , 0 , 0 , 1 ) \begin{pmatrix}1,0,0,0\\0,1,0,0\\0,0,1,0\\0,0,0,1\end{pmatrix} 1,0,0,00,1,0,00,0,1,00,0,0,1
矩阵的乘积
( a 00 , a 01 , a 02 , a 03 a 10 , a 11 . a 12 , a 13 a 20 , a 21 , a 22 , a 23 a 30 , a 31 , a 32 , a 33 ) × ( b 00 , b 01 , b 02 , b 03 b 10 , b 11 . b 12 , b 13 b 20 , b 21 , b 22 , b 23 b 30 , b 31 , b 32 , b 33 ) = ( c 00 , c 01 , c 02 , c 03 c 10 , c 11 . c 12 , c 13 c 20 , c 21 , c 22 , c 23 c 30 , c 31 , c 32 , c 33 ) ( b 00 , b 01 , b 02 , b 03 b 10 , b 11 . b 12 , b 13 b 20 , b 21 , b 22 , b 23 b 30 , b 31 , b 32 , b 33 ) ( a 00 , a 01 , a 02 , a 03 a 10 , a 11 . a 12 , a 13 a 20 , a 21 , a 22 , a 23 a 30 , a 31 , a 32 , a 33 ) ( c 00 , c 01 , c 02 , c 03 c 10 , c 11 . c 12 , c 13 c 20 , c 21 , c 22 , c 23 c 30 , c 31 , c 32 , c 33 ) c 00 = a 00 b 00 + a 01 b 10 + a 02 b 20 + a 03 b 30 c 01 = a 00 b 01 + a 01 b 11 + a 02 b 21 + a 03 b 31 . . \begin{pmatrix}a_{00},a_{01},a_{02},a_{03}\\a_{10},a_{11}.a_{12},a_{13}\\a_{20},a_{21},a_{22},a_{23}\\a_{30},a_{31},a_{32},a_{33}\end{pmatrix}\times\begin{pmatrix}b_{00},b_{01},b_{02},b_{03}\\b_{10},b_{11}.b_{12},b_{13}\\b_{20},b_{21},b_{22},b_{23}\\b_{30},b_{31},b_{32},b_{33}\end{pmatrix}=\begin{pmatrix}c_{00},c_{01},c_{02},c_{03}\\c_{10},c_{11}.c_{12},c_{13}\\c_{20},c_{21},c_{22},c_{23}\\c_{30},c_{31},c_{32},c_{33}\end{pmatrix}\\~\\ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\begin{pmatrix}b_{00},b_{01},b_{02},b_{03}\\b_{10},b_{11}.b_{12},b_{13}\\b_{20},b_{21},b_{22},b_{23}\\b_{30},b_{31},b_{32},b_{33}\end{pmatrix}\\\begin{pmatrix}a_{00},a_{01},a_{02},a_{03}\\a_{10},a_{11}.a_{12},a_{13}\\a_{20},a_{21},a_{22},a_{23}\\a_{30},a_{31},a_{32},a_{33}\end{pmatrix}\begin{pmatrix}c_{00},c_{01},c_{02},c_{03}\\c_{10},c_{11}.c_{12},c_{13}\\c_{20},c_{21},c_{22},c_{23}\\c_{30},c_{31},c_{32},c_{33}\end{pmatrix}\\~\\ c_{00}=a_{00}b_{00}+a_{01}b_{10}+a_{02}b_{20}+a_{03}b_{30}\\c_{01}=a_{00}b_{01}+a_{01}b_{11}+a_{02}b_{21}+a_{03}b_{31}\\.\\. a00,a01,a02,a03a10,a11.a12,a13a20,a21,a22,a23a30,a31,a32,a33 × b00,b01,b02,b03b10,b11.b12,b13b20,b21,b22,b23b30,b31,b32,b33 = c00,c01,c02,c03c10,c11.c12,c13c20,c21,c22,c23c30,c31,c32,c33 b00,b01,b02,b03b10,b11.b12,b13b20,b21,b22,b23b30,b31,b32,b33 a00,a01,a02,a03a10,a11.a12,a13a20,a21,a22,a23a30,a31,a32,a33 c00,c01,c02,c03c10,c11.c12,c13c20,c21,c22,c23c30,c31,c32,c33 c00=a00b00+a01b10+a02b20+a03b30c01=a00b01+a01b11+a02b21+a03b31..
c c c矩阵的第 x x x行,第 y y y列 c x y c_{xy} cxy等于 a a a矩阵的第 x x x行和 b b b矩阵的第 y y y列相乘相加。
矩阵乘向量
( a 00 , a 01 , a 02 , a 03 a 10 , a 11 . a 12 , a 13 a 20 , a 21 , a 22 , a 23 a 30 , a 31 , a 32 , a 33 ) ( b 00 b 10 b 20 0 ) = ( a 00 b 00 + a 01 b 10 + a 02 b 20 + 0 a 10 b 00 + a 11 b 10 + a 12 b 20 + 0 a 20 b 00 + a 21 b 10 + a 22 b 20 + 0 a 30 b 00 + a 31 b 10 + a 32 b 20 + 0 ) \begin{pmatrix}a_{00},a_{01},a_{02},a_{03}\\a_{10},a_{11}.a_{12},a_{13}\\a_{20},a_{21},a_{22},a_{23}\\a_{30},a_{31},a_{32},a_{33}\end{pmatrix}\begin{pmatrix}b_{00}\\b_{10}\\b_{20}\\0\end{pmatrix}=\begin{pmatrix}a_{00}b_{00}+a_{01}b_{10}+a_{02}b_{20}+0\\a_{10}b_{00}+a_{11}b_{10}+a_{12}b_{20}+0\\a_{20}b_{00}+a_{21}b_{10}+a_{22}b_{20}+0\\a_{30}b_{00}+a_{31}b_{10}+a_{32}b_{20}+0\end{pmatrix} a00,a01,a02,a03a10,a11.a12,a13a20,a21,a22,a23a30,a31,a32,a33 b00b10b200 = a00b00+a01b10+a02b20+0a10b00+a11b10+a12b20+0a20b00+a21b10+a22b20+0a30b00+a31b10+a32b20+0
矩阵变换
缩放矩阵
(
S
00
,
0
,
0
,
0
0
,
S
11
,
0
,
0
0
,
0
,
S
22
,
0
0
,
0
,
0
,
1
)
\begin{pmatrix}S_{00},~~0,~~0,~~0\\~0,S_{11},~~0,~~0\\~0,~~0,S_{22},~~0\\~~0,~~0,~~0,~~1\end{pmatrix}
S00, 0, 0, 0 0,S11, 0, 0 0, 0,S22, 0 0, 0, 0, 1
平移矩阵
(
0
,
0
,
0
,
T
04
0
,
0
,
0
,
T
14
0
,
0
,
0
,
T
24
0
,
0
,
0
,
1
)
\begin{pmatrix}~~0,~~0,~~0,~~T_{04}\\~~0,~~0,~~0,~~T_{14}\\~~0,~~0,~~0,~~T_{24}\\~~0,~~0,~~0,~~1\end{pmatrix}
0, 0, 0, T04 0, 0, 0, T14 0, 0, 0, T24 0, 0, 0, 1
旋转矩阵
矩阵转置
( 1 , 2 3 , 4 5 , 6 7 , 8 ) T = ( 1 , 3 , 5 , 7 2 , 4 , 6 , 8 ) \begin{pmatrix}1,~~2\\3,~~4\\5,~~6\\7,~~8\end{pmatrix}^T=\begin{pmatrix}1,~~3,~~5,~~7\\2,~~4,~~6,~~8\end{pmatrix} 1, 23, 45, 67, 8 T=(1, 3, 5, 72, 4, 6, 8)