计算机图形学——Games101深度解析_第一章

写在前面

关于Games101深度解析参考了很多佬的文章,并且加上了自己的理解。主要感觉games101课程里面还有很多由于时间原因都没讲的很详细,略过了很多,所以我对于课程中困难的知识点进行了更多的步骤思路解释,希望能对正在学习这篇课程的后者提供更清晰的思路。

本文建议配上games101视频以及games101网站中的PDF配合学习https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html

这一章含有大量线代的几何知识,对于线代的几何理解可以跳到这学习(一步一步看完基本上就没有太大的问题了):https://www.bilibili.com/video/BV1Ys411k7yQ/?spm_id_from=333.337.search-card.all.click&vd_source=93699bcffa78a7a266992d3b23c6dc20
这一章由于知识点都较为简单,所以看起来会很杂,但是后面从第二章开始就开始有章法了。刚开始的数学基础知识就不再提了,我们从线代在图形学的应用开始。

参考文章:
https://zhuanlan.zhihu.com/p/394932478
https://iewug.github.io/book/GAMES101.html#2-3d-transformation
https://sites.cs.ucsb.edu/~lingqi/teaching/games101.html
https://caterpillarstudygroup.github.io/GAMES101_mdbook/index.html

向量叉乘的应用


上图中,判断p是否在三角形ABC的内侧,只用将p点与ABC三点相连接,然后再分别叉乘三个边,看结果的符号是否一致,若一致,那么就在内侧,反之亦然。
比如AP叉乘AB,然后BP叉乘BC,然后CP叉乘CA,他们的符号都是一致的,则P就在三角形的里面

指令矩阵在图形学的应用

( − 1 0 0 1 ) ( x y ) = ( − x y ) \begin{pmatrix} -1 & 0 \\ 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} -x \\ y \end{pmatrix} (1001)(xy)=(xy)

上面的矩阵做的就是:在二维里面,我们把整个图形以y轴为对称轴做一个对称图形。
那么我们y轴就不用变,把x的数都换个符号就行。上面不止是指令矩阵的角度,线性变换也是这个角度。

几种变换

根据上面的内容我们就可以得到下面的效果

  • 缩放矩阵

  • 拉伸变换

  • 旋转变换

平移变换
我们前面看了这么多变换都是基于原点的变换,但是如果是下面的这个变换(平移)我们该怎么表示呢?

我们这个时候就发现了,我们常规的矩阵往往都只能表示一个向量,但是我们明白,向量平移是不会改变什么的,常规矩阵就是没有办法去表示平移这个动作。
这个时候我们就引入一个新的东西:齐次坐标(homogeneous coordinates)

齐次坐标是用N+1个数来表示N维坐标的一种方式。

要制作二维齐次坐标,我们只需在现有坐标中增加一个额外的变量w,这个w并不代表更高维度的一个坐标,简单说就是表示这里的(x,y)是一个向量或者是一个点。
因此,笛卡尔坐标中的一点,(X,Y)在齐次坐标中就变成了(x,y,w)。在w=1的时候,齐次坐标就是一个点,而w=0的时候,齐次坐标表示的就是一个向量。而笛卡儿坐标中的X和Y在齐次坐标中的x、y和w则重新表达为(这里把所有的坐标都除了一个 w w w ,这样 w w w 的值就必定是1,那就是一个向量)

X = x / w Y = y / w \begin{align} X = x/w\\ Y = y/w\\ \end{align} X=x/wY=y/w

那怎么应用到实际的平移中呢,就是以下的变换。这样的变换成功表示了每一个平移的点,而且直观的有了一个平移的指令矩阵

[ x ′ y ′ w ′ ] = [ 1 0 t x 0 1 t y 0 0 1 ] ⋅ [ x y 1 ] = [ x + t x y + t y 1 ] \begin{bmatrix} x' \\ y' \\ w' \end{bmatrix} = \begin{bmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{bmatrix} \cdot \begin{bmatrix} x \\ y \\ 1 \end{bmatrix} = \begin{bmatrix} x + t_x \\ y + t_y \\ 1 \end{bmatrix} xyw = 100010txty1 xy1 = x+txy+ty1

欧氏空间中数学证明:两条平行线可以相交

考虑以下欧氏空间的线性系统。

{ A x + B y + C = 0 A x + B y + D = 0 \begin{cases} Ax + By + C = 0 \\ Ax + By + D = 0 \end{cases} {Ax+By+C=0Ax+By+D=0

而我们知道,由于 C ≠ D C \neq D C=D,所以上述方程没有解。如果 C = D C = D C=D,那么两条线是相同的(重叠的)。
让我们重写投影空间的方程,将 x x x y y y 分别替换为 x / w x/w x/w y / w y/w y/w

{ A x w + B y w + C = 0 A x w + B y w + D = 0 ⇒ { A x + B y + C w = 0 A x + B y + D w = 0 \begin{cases} A\frac{x}{w} + B\frac{y}{w} + C = 0 \\ A\frac{x}{w} + B\frac{y}{w} + D = 0 \end{cases} \Rightarrow \begin{cases} Ax + By + Cw = 0 \\ Ax + By + Dw = 0 \end{cases} {Awx+Bwy+C=0Awx+Bwy+D=0{Ax+By+Cw=0Ax+By+Dw=0

现在,我们有一个解,(x, y, 0),因为 (C-D)w = 0,所以 w = 0。因此,两条平行线在 (x, y, 0) 处相交。
(x, y, 0) 在几何上代表一条没有起点与终点,也没有长度的射线,它只有方向。

点与向量的加减

  • vector + vector = vector
  • point - point = vector
  • point + vector = vector
  • point + point = 两点的中点 (因为 ( x 1 , y 1 , 1 ) (x_1,y_1,1) (x1,y1,1) + ( x 2 , y 2 , 1 ) (x_2,y_2,1) (x2,y2,1) = ( x 1 + x 2 , y 1 + y 2 , 2 ) (x_1+x_2,y_1+y_2,2) (x1+x2,y1+y2,2) = ( x 1 + x 2 2 , y 1 + y 2 2 , 1 ) (\frac{x_1+x_2}{2},\frac{y_1+y_2}{2},1) (2x1+x2,2y1+y2,1)))

仿射变换

( x ′ y ′ ) = ( a b c d ) ⋅ ( x y ) + ( t x t y ) \begin{pmatrix}x' \\y'\end{pmatrix}=\begin{pmatrix}a & b \\c & d\end{pmatrix}\cdot\begin{pmatrix}x \\y\end{pmatrix}+\begin{pmatrix}t_x \\t_y\end{pmatrix} (xy)=(acbd)(xy)+(txty)

像这样线性变换之后加上平移量的变换叫做放射变换
所有的放射变换都可以写成齐次坐标的形式

( x ′ y ′ 1 ) = ( a b t x c d t y 0 0 1 ) ⋅ ( x y 1 ) \begin{pmatrix} x' \\ y' \\ 1 \end{pmatrix} = \begin{pmatrix} a & b & t_x \\ c & d & t_y \\ 0 & 0 & 1 \end{pmatrix} \cdot \begin{pmatrix} x \\ y \\ 1 \end{pmatrix} xy1 = ac0bd0txty1 xy1

[!danger]
注意: 在上面的变换中我们能够发现,是先线性变换再进行平移的

  1. 缩放矩阵

S ( s x , s y ) = ( s x 0 0 0 s y 0 0 0 1 ) \mathbf{S}(s_x, s_y) = \begin{pmatrix} s_x & 0 & 0 \\ 0 & s_y & 0 \\ 0 & 0 & 1 \end{pmatrix} S(sx,sy)= sx000sy0001

  1. 旋转矩阵

R ( α ) = ( cos ⁡ α − sin ⁡ α 0 sin ⁡ α cos ⁡ α 0 0 0 1 ) \mathbf{R}(\alpha) = \begin{pmatrix} \cos \alpha & -\sin \alpha & 0 \\ \sin \alpha & \cos \alpha & 0 \\ 0 & 0 & 1 \end{pmatrix} R(α)= cosαsinα0sinαcosα0001

  1. 平移矩阵 :

T ( t x , t y ) = ( 1 0 t x 0 1 t y 0 0 1 ) \mathbf{T}(t_x, t_y) = \begin{pmatrix} 1 & 0 & t_x \\ 0 & 1 & t_y \\ 0 & 0 & 1 \end{pmatrix} T(tx,ty)= 100010txty1

逆变换

[!note]
逆变换刚好对应矩阵中:一个矩阵 x 该矩阵的逆矩阵 = 单位矩阵(什么都没做)

值得注意的是,如果旋转负角度,我们就能发现:

[!note]
旋转矩阵的逆矩阵就是旋转矩阵的转置矩阵: R α T = R α − 1 {R_\alpha}^T={R_\alpha}^{-1} RαT=Rα1

[!note] 如果一个矩阵的逆等于他的转置,那么我们称此矩阵为正交矩阵

R ( α ) = ( cos ⁡ α − sin ⁡ α sin ⁡ α cos ⁡ α ) \mathbf{R}(\alpha) = \begin{pmatrix}\cos \alpha & -\sin \alpha \\\sin \alpha & \cos \alpha \\\end{pmatrix} R(α)=(cosαsinαsinαcosα) R ( − α ) = ( cos ⁡ α sin ⁡ α − sin ⁡ α cos ⁡ α ) = R α T = R α − 1 \mathbf{R}(-\alpha) = \begin{pmatrix}\cos \alpha & \sin \alpha \\-\sin \alpha & \cos \alpha \\\end{pmatrix} ={R_\alpha}^T={R_\alpha}^{-1} R(α)=(cosαsinαsinαcosα)=RαT=Rα1

矩阵的乘法没有交换律:变换的顺序会导致结果不同

先平移再旋转如下:

先旋转再平移如下:

这里就能够体现出两者的变换顺序不同对应着矩阵的乘法没有交换律。
当然,多个线性变换由于有结合律的缘故,我们可以对线性变换先进行线性变换,最后得到一个大的线性变换再对其最开始的向量进行线性变换都行

任意点的旋转

我们前面只知道怎么沿着原点旋转,如果要沿着其他的一个点旋转一个图形,我们就可以先平移到原点,然后进行旋转,最后我们旋转完之后再平移回去是一样的。

原创作者: ENchantedN 转载于: https://www.cnblogs.com/ENchantedN/p/18899492
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值