写在前面

关于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就在三角形的里面

指令矩阵在图形学的应用

\[\begin{pmatrix} -1 & 0 \\ 0 & 1 \end{pmatrix} \begin{pmatrix} x \\ y \end{pmatrix} = \begin{pmatrix} -x \\ y \end{pmatrix}
\]

上面的矩阵做的就是:在二维里面,我们把整个图形以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\) 的值就必定是1,那就是一个向量)

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

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

\[\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}
\]

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

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

\[\begin{cases}
Ax + By + C = 0 \\
Ax + By + D = 0
\end{cases}
\]

而我们知道,由于 \(C \neq D\),所以上述方程没有解。如果 \(C = D\),那么两条线是相同的(重叠的)。

让我们重写投影空间的方程,将 \( x \) 和 \( y \) 分别替换为 \( x/w \),\( y/w \)。

\[\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}
\]

现在,我们有一个解,(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_2,y_2,1)\) = \((x_1+x_2,y_1+y_2,2)\) = \((\frac{x_1+x_2}{2},\frac{y_1+y_2}{2},1)\)))

仿射变换

\[\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}
\]

像这样线性变换之后加上平移量的变换叫做放射变换

所有的放射变换都可以写成齐次坐标的形式

\[\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}
\]

[!danger]

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

  1. 缩放矩阵
\[\mathbf{S}(s_x, s_y) =
\begin{pmatrix}
s_x & 0 & 0 \\
0 & s_y & 0 \\
0 & 0 & 1
\end{pmatrix}
\]
  1. 旋转矩阵
\[\mathbf{R}(\alpha) =
\begin{pmatrix}
\cos \alpha & -\sin \alpha & 0 \\
\sin \alpha & \cos \alpha & 0 \\

0 & 0 & 1
\end{pmatrix}
\]

  1. 平移矩阵 :
\[\mathbf{T}(t_x, t_y) =
\begin{pmatrix}
1 & 0 & t_x \\
0 & 1 & t_y \\
0 & 0 & 1
\end{pmatrix}
\]

逆变换

[!note]

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

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

[!note]

旋转矩阵的逆矩阵就是旋转矩阵的转置矩阵:\({R_\alpha}^T={R_\alpha}^{-1}\)

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

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

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

先平移再旋转如下:

先旋转再平移如下:

这里就能够体现出两者的变换顺序不同对应着矩阵的乘法没有交换律。

当然,多个线性变换由于有结合律的缘故,我们可以对线性变换先进行线性变换,最后得到一个大的线性变换再对其最开始的向量进行线性变换都行

任意点的旋转

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

计算机图形学——Games101深度解析_第一章的更多相关文章

  1. ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区

    原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉W ...

  2. Linux系统shell编程自学_第一章基础

    第一章 基础shell的优势在于处理操作系统底层的业务,Python,php的优势在于开发运维工具,web界面的管理工具以及web业务开发.处理一键安装.优化.报警脚本shell又叫命令解释器,它能识 ...

  3. Python之旅_第一章Python入门

    一.编程语言分类 1.机器语言:即计算机能听懂的二进制语言,0000 0001,直接操控硬件: 2.汇编语言:简写的英文标识符代替二进制语言,本质同样是直接操控硬件: 3.高级语言:用更贴近人类的语言 ...

  4. 《Spring源码深度解析》第二章 容器的基本实现

    入门级别的spring配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&q ...

  5. C语言_第一章

    1. 计算机能直接识别和接受的二进制代码称为     机器指令——>(集合) 机器语言. 2. 输出C #include<stdio.h> int main(){ printf(&q ...

  6. 《pyhton语言程序设计》_第一章笔记

    章1.62 (1).python区分大小写. (2).python忽略在符号#之后的同行的内容 (3).python和matlab很相似(个人感觉) (4).章节1.91: >>>i ...

  7. 【C++ Primer】读书笔记_第一章

    Main(): 1. C++程序必须包含main()函数,操作系统通过调用main来运行C++程序. 2. main()的形参可以为空. 3. main函数的返回类型必须为int,返回给操作系统.in ...

  8. 《python语言程序设计》_第一章编程题

    题目1.1 :显示"welcome to python " 答案:print('welcome to python') 题目1.2:显示"welcome to pytho ...

  9. SqlServer2008查询性能优化_第一章

  10. 【工具解析】瑞士军刀bettercap2.X解析_第一期_编写HTTP代理注入模块_http(s).proxy.script

    /文章作者:Kali_MG1937 CNBLOG博客号:ALDYS4 QQ:3496925334/ 前言 bettercap已经从1.6更新至2.0版本 语言也从ruby改为了go 编写注入模块指定的 ...

随机推荐

  1. Flink学习(二) 应用场景和架构模型

    实时计算最好的时代 在过去的十年里,面向数据时代的实时计算技术接踵而至.从我们最初认识的 Storm,再到 Spark 的异军突起,迅速占领了整个实时计算领域.直到 2019 年 1 月底,阿里巴巴内 ...

  2. Kubernetes身份认证资源 —— TokenReview详解

    1.概述 Kubernetes 中的 TokenReview 是用于验证令牌(Token)有效性的一种 API 资源,属于 authentication.k8s.io/v1 API 组.它允许客户端通 ...

  3. dockerfile 由于公钥不可用,无法验证以下签名

    报错 当我在打包 docker镜像时,发生了报错 $ sudo docker build -t dcgm-exporter:3.2.5 . 1.772 The following signatures ...

  4. HTTP/1.1、HTTP/2、HTTP/3

    HTTP/1.1 相比 HTTP/1.0 性能上的改进: 使用长连接的方式改善了 HTTP/1.0 短连接造成的性能开销. 支持管道(pipeline)网络传输,只要第一个请求发出去了,不必等其回来, ...

  5. MFC编程中与编码方式有关的宏定义的使用

    1 多字节字符集:char *strcpy(char *strDestination, const char *strSource); Unicode字符集:wchar_t *wcscpy(wchar ...

  6. docker clean images

    docker ps | grep portal | awk '{print $2}' | cut -d ":" -f3 used=`docker ps | grep portal ...

  7. Object类--toString方法--java进阶day05

    1.Object类.以及通用的类 2.toString方法 默认的toString方法,返回的是地址值(全类名再加上通过地址值算出来的十六进制哈希值) . 为什么打印语句会自动调用toString方法 ...

  8. 事务注解@Transactional

    目录 1.属性介绍 2.传播机制 准备例子 总结 3.原理 4.失效场景 一.属性介绍 1.isolation 属性 事务的隔离级别,默认值为 Isolation.DEFAULT.可选的值有: Iso ...

  9. 2319. 判断矩阵是否是一个 X 矩阵

    2319. 判断矩阵是否是一个 X 矩阵 题解: 模拟 class Solution { public boolean checkXMatrix(int[][] grid) { int n = gri ...

  10. AI提示词:通用 vscode linux c++ 项目CMakeLists和bulid模板

    AI提示词 写vscode linux c++20 的CMakeLists.txt文件.build.rebuild文件 这是多项目结构,目录结构如下: projs: │ build.sh 顶层buil ...