计算机图形学学习笔记(一)
什么是计算机图形学
计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。
什么是好的画面?
从技术层面简单的评判标准:直接看画面是否足够“亮”。体现了图形学中的全局光照是否做的好,如果光照做的好,画面就亮,相反就暗。
线性代数
向量
向量的两个基础内容,方向和长度。
一、单位向量
长度为一的向量,叫单位向量。
a^\hat{a}a^是单位向量
a^=a⃗∣a⃗∣
\hat{a}= {{\vec{a}} \over {|\vec{a}|}}
a^=∣a∣a
二、向量的和
a⃗\vec{a}a为(xa,ya)(x_a,y_a)(xa,ya)
b⃗\vec{b}b为(xb,yb)(x_b,y_b)(xb,yb)
a⃗+b⃗=(xa+xb,ya+yb) \vec{a}+\vec{b}=(x_a+x_b,y_a+y_b) a+b=(xa+xb,ya+yb)
三、向量点乘
a⃗\vec{a}a为(xa,ya,za)(x_a,y_a,z_a)(xa,ya,za)
b⃗\vec{b}b为(xb,yb,zb)(x_b,y_b,z_b)(xb,yb,zb)
a⃗\vec{a}a和b⃗\vec{b}b点乘表示为:
a⃗⋅b⃗=cosθ∣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^
cosθ=a^⋅b^
cos \theta=\hat{a}\cdot\hat{b}
cosθ=a^⋅b^
a⃗\vec{a}a和b⃗\vec{b}b点乘还可以表示为:
a⃗⋅b⃗=a⃗Tb⃗=(xayaza)(xbybzb)=xaxb+yayb+zazb
{\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
点乘的作用
-
求夹角
将两个向量归一化得单位向量,这单位向量的点乘就是夹角的余弦值。
即:
cosθ=a^⋅b^
cos \theta=\hat{a}\cdot\hat{b}
cosθ=a^⋅b^
补充一下余弦定理和推导过程:
余弦定理公式:
cosθ=∣AC⃗∣2+∣AB⃗∣2−∣BC⃗∣22∣AC⃗∣∣AB⃗∣
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
余弦定理推导过程:
BC⃗=AC⃗−AB⃗BC⃗2=(AC⃗−AB⃗)2BC⃗TBC⃗=(AC⃗−AB⃗)T(AC⃗−AB⃗)∣BC⃗∣2=AC⃗TAC⃗−2AC⃗⋅AB⃗+AB⃗TAB⃗∣BC⃗∣2=∣AC⃗∣2−2AC⃗⋅AB⃗+∣AB⃗∣2∣BC⃗∣2=∣AC⃗∣2−2cosθ∣AC⃗∣∣AB⃗∣+∣AB⃗∣2cosθ=∣AC⃗∣2+∣AB⃗∣2−∣BC⃗∣22∣AC⃗∣∣AB⃗∣
\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
余弦定理也可以通过向量的点乘退导出来
-
求投影
求AB⃗\vec{AB}AB到AC⃗\vec{AC}AC的投影AD⃗\vec{AD}AD
AC^\hat{AC}AC^是AB⃗\vec{AB}AB的单位向量
∣AD⃗∣=∣AB⃗∣cosθ|\vec{AD}|=|\vec{AB}|cos\theta∣AD∣=∣AB∣cosθ
AD⃗=AC^∣AD⃗∣\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)]
当AB⃗\vec{AB}AB越接近AC⃗\vec{AC}AC,θ约小的时候,cosθcos\thetacosθ越接近1
当AB⃗\vec{AB}AB和AC⃗\vec{AC}AC方向相反时,θ大于90°,cosθcos\thetacosθ为负值,且越接近-1
四、向量叉乘
在右手坐标系中:AD⃗=AB⃗×AC⃗\vec{AD}=\vec{AB} \times \vec{AC}AD=AB×AC
AD⃗\vec{AD}AD垂直于AC⃗\vec{AC}AC
AD⃗\vec{AD}AD垂直于AB⃗\vec{AB}AB
∣AD⃗∣=sinθ∣AB⃗∣∣AC⃗∣|\vec{AD}|=sin\theta|\vec{AB}||\vec{AC}|∣AD∣=sinθ∣AB∣∣AC∣
公式:
a⃗=(xa,ya,za)\vec{a}=(x_a,y_a,z_a)a=(xa,ya,za)
b⃗=(xb,yb,zb)\vec{b}=(x_b,y_b,z_b)b=(xb,yb,zb)
a⃗×b⃗=(0,−za,yaza,0,−xa−ya,xa,0)(xbybzb)=(yazb−ybzazaxb−xazbxayb−yaxb)\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,0xbybzb=yazb−ybzazaxb−xazbxayb−yaxb
叉乘的作用
-
判断左右
在左手坐标系中,b⃗×a⃗\vec{b}\times\vec{a}b×a和z轴为正值,说明b⃗\vec{b}b在a⃗\vec{a}a的顺时针方向。
-
判断内外
∵(CA⃗×CD⃗)⋅(AB⃗×AD⃗)\because(\vec{CA}\times\vec{CD} )\cdot(\vec{AB}\times\vec{AD})∵(CA×CD)⋅(AB×AD)的z轴为正值
∵(AB⃗×AD⃗)⋅(BC⃗×BD⃗)\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⃗)世界坐标系向量在uvw坐标上的分量
|\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,00,1,0,00,0,1,00,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
矩阵的乘积
(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.. \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,b33a00,a01,a02,a03a10,a11.a12,a13a20,a21,a22,a23a30,a31,a32,a33c00,c01,c02,c03c10,c11.c12,c13c20,c21,c22,c23c30,c31,c32,c33 c00=a00b00+a01b10+a02b20+a03b30c01=a00b01+a01b11+a02b21+a03b31..
ccc矩阵的第xxx行,第yyy列cxyc_{xy}cxy等于aaa矩阵的第xxx行和bbb矩阵的第yyy列相乘相加。
矩阵乘向量
(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) \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,a33b00b10b200=a00b00+a01b10+a02b20+0a10b00+a11b10+a12b20+0a20b00+a21b10+a22b20+0a30b00+a31b10+a32b20+0
矩阵变换
缩放矩阵
(S00, 0, 0, 0 0,S11, 0, 0 0, 0,S22, 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, T04 0, 0, 0, T14 0, 0, 0, T24 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, 23, 45, 67, 8)T=(1, 3, 5, 72, 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, 8T=(1, 3, 5, 72, 4, 6, 8)