> 文章列表 > [学习笔记]计算机图形学(一)

[学习笔记]计算机图形学(一)

[学习笔记]计算机图形学(一)

计算机图形学学习笔记(一)

什么是计算机图形学

计算机图形学的主要研究内容就是研究如何在计算机中表示图形、以及利用计算机进行图形的计算、处理和显示的相关原理与算法。

什么是好的画面?

从技术层面简单的评判标准:直接看画面是否足够“亮”。体现了图形学中的全局光照是否做的好,如果光照做的好,画面就亮,相反就暗。

线性代数

向量

向量的两个基础内容,方向和长度。

一、单位向量

长度为一的向量,叫单位向量。

a^\\hat{a}a^是单位向量
a^=a⃗∣a⃗∣\\hat{a}= {{\\vec{a}} \\over {|\\vec{a}|}} a^=aa

二、向量的和

[学习笔记]计算机图形学(一)

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}ab⃗\\vec{b}b点乘表示为:
a⃗⋅b⃗=cosθ∣a⃗∣∣b⃗∣{\\vec{a}\\cdot\\vec{b}=cos \\theta|\\vec{a}||\\vec{b}|} ab=cosθa∣∣b
如果a⃗\\vec{a}ab⃗\\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}ab⃗\\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 ab=aTb=(xayaza)xbybzb=xaxb+yayb+zazb
点乘的作用

  1. 求夹角

    将两个向量归一化得单位向量,这单位向量的点乘就是夹角的余弦值。

    即:

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∣∣ABAC2+AB2BC2
​ 余弦定理推导过程:

[学习笔记]计算机图形学(一)

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=ACABBC2=(ACAB)2BCTBC=(ACAB)T(ACAB)BC2=ACTAC2ACAB+ABTABBC2=AC22ACAB+AB2BC2=AC22cosθAC∣∣AB+AB2cosθ=2∣AC∣∣ABAC2+AB2BC2
​ 余弦定理也可以通过向量的点乘退导出来

  1. 求投影

    AB⃗\\vec{AB}ABAC⃗\\vec{AC}AC的投影AD⃗\\vec{AD}AD

    AC^\\hat{AC}AC^AB⃗\\vec{AB}AB的单位向量

    ∣AD⃗∣=∣AB⃗∣cosθ|\\vec{AD}|=|\\vec{AB}|cos\\thetaAD=ABcosθ

    AD⃗=AC^∣AD⃗∣\\vec{AD}=\\hat{AC}|\\vec{AD}|AD=AC^AD

  2. 接近和前后

    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}ABAC⃗\\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,xaya,xa,0xbybzb=yazbybzazaxbxazbxaybyaxb

叉乘的作用

  1. 判断左右

    [学习笔记]计算机图形学(一)

    在左手坐标系中,b⃗×a⃗\\vec{b}\\times\\vec{a}b×a和z轴为正值,说明b⃗\\vec{b}ba⃗\\vec{a}a的顺时针方向。

  2. 判断内外

    [学习笔记]计算机图形学(一)

    ∵(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三个向量都是单位向量 uv=vw=wu=0三个向量两两夹角都是90° w=u×v向量w垂直于向量uv组成的平面 p=(pu)u(pv)v(pw)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行,第yyycxyc_{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,00,S11,0,00,0,S22,00,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,T040,0,0,T140,0,0,T240,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)