计算机图形学——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就在三角形的里面
指令矩阵在图形学的应用
\]
上面的矩阵做的就是:在二维里面,我们把整个图形以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,那就是一个向量)
X = x/w\\
Y = y/w\\
\end{align}
\]
那怎么应用到实际的平移中呢,就是以下的变换。这样的变换成功表示了每一个平移的点,而且直观的有了一个平移的指令矩阵
\]
欧氏空间中数学证明:两条平行线可以相交
考虑以下欧氏空间的线性系统。
Ax + By + C = 0 \\
Ax + By + D = 0
\end{cases}
\]
而我们知道,由于 \(C \neq D\),所以上述方程没有解。如果 \(C = D\),那么两条线是相同的(重叠的)。
让我们重写投影空间的方程,将 \( x \) 和 \( y \) 分别替换为 \( x/w \),\( y/w \)。
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)\)))
仿射变换
\]
像这样线性变换之后加上平移量的变换叫做放射变换
所有的放射变换都可以写成齐次坐标的形式
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]
注意: 在上面的变换中我们能够发现,是先线性变换再进行平移的
- 缩放矩阵
\begin{pmatrix}
s_x & 0 & 0 \\
0 & s_y & 0 \\
0 & 0 & 1
\end{pmatrix}
\]
- 旋转矩阵
\begin{pmatrix}
\cos \alpha & -\sin \alpha & 0 \\
\sin \alpha & \cos \alpha & 0 \\
0 & 0 & 1
\end{pmatrix}
\]
- 平移矩阵 :
\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深度解析_第一章的更多相关文章
- ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区
原文:ArcGIS for Desktop入门教程_第一章_引言 - ArcGIS知乎-新一代ArcGIS问答社区 1 引言 1.1 读者定位 我们假设用户在阅读本指南前应已具备以下知识: · 熟悉W ...
- Linux系统shell编程自学_第一章基础
第一章 基础shell的优势在于处理操作系统底层的业务,Python,php的优势在于开发运维工具,web界面的管理工具以及web业务开发.处理一键安装.优化.报警脚本shell又叫命令解释器,它能识 ...
- Python之旅_第一章Python入门
一.编程语言分类 1.机器语言:即计算机能听懂的二进制语言,0000 0001,直接操控硬件: 2.汇编语言:简写的英文标识符代替二进制语言,本质同样是直接操控硬件: 3.高级语言:用更贴近人类的语言 ...
- 《Spring源码深度解析》第二章 容器的基本实现
入门级别的spring配置文件 <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi=&q ...
- C语言_第一章
1. 计算机能直接识别和接受的二进制代码称为 机器指令——>(集合) 机器语言. 2. 输出C #include<stdio.h> int main(){ printf(&q ...
- 《pyhton语言程序设计》_第一章笔记
章1.62 (1).python区分大小写. (2).python忽略在符号#之后的同行的内容 (3).python和matlab很相似(个人感觉) (4).章节1.91: >>>i ...
- 【C++ Primer】读书笔记_第一章
Main(): 1. C++程序必须包含main()函数,操作系统通过调用main来运行C++程序. 2. main()的形参可以为空. 3. main函数的返回类型必须为int,返回给操作系统.in ...
- 《python语言程序设计》_第一章编程题
题目1.1 :显示"welcome to python " 答案:print('welcome to python') 题目1.2:显示"welcome to pytho ...
- SqlServer2008查询性能优化_第一章
- 【工具解析】瑞士军刀bettercap2.X解析_第一期_编写HTTP代理注入模块_http(s).proxy.script
/文章作者:Kali_MG1937 CNBLOG博客号:ALDYS4 QQ:3496925334/ 前言 bettercap已经从1.6更新至2.0版本 语言也从ruby改为了go 编写注入模块指定的 ...
随机推荐
- Navicat 如何将表恢复默认状态下
场景: 测试一套流程后,造测试数据非常麻烦的情况下,如何通过更改数据库为默认情况即初始表数据 案例: 比如表原有结构如下图(一) 修改后数据如下图(二): 需求:将图二数据恢复到图一内容下 操作思想: ...
- mac强制关闭程序
使用快捷键:Command+Option+Esc 来打开"强制退出应用程序"的窗口,然后选中你需要退出的程序,再点右下方的"强制退出"即可.
- Failed to start MySQL 8.0 database server.
原因 在mysql错误日志里出现:The innodb_system data file 'ibdata1' must be writable,字面意思:ibdata1必须可写 查看日志报错,文件夹无 ...
- Hack The Box-代理连接及靶机-Meow-喵呜
前言 在第一层,您将获得网络安全渗透测试领域的基本技能.您将首先学习如何匿名连接到各种服务,例如 FTP.SMB.Telnet.Rsync 和 RDP.接下来,您将发现 Nmap 的强大功能,这是 ...
- 密码编码学与网络安全 原理与实践(第七版)William Stallings---读书笔记(1.1-1.5)
密码编码学与网络安全 原理与实践(第七版)William Stallings---读书笔记 第一部分 概览 第1章 计算机与网络安全概念 密码算法与协议又可分为4个主要领域: 对称加密 加密任意大小的 ...
- 基于pandas的数据清洗 -- 缺失值(空值)的清洗
博客地址:https://www.cnblogs.com/zylyehuo/ 开发环境 anaconda 集成环境:集成好了数据分析和机器学习中所需要的全部环境 安装目录不可以有中文和特殊符号 jup ...
- breach1靶机渗透学习
靶机下载 https://www.vulnhub.com/ 找Breach-1.0,不过这个是老靶机了,可以看网上其他博客附带有靶机下载的网盘链接,靶机官网访问很慢而且网站好像出问题了排版很乱,不打也 ...
- Ribbon-Loadbalancer自定义负载均衡策略:本地优先+偏向服务器优先
Ribbon 核心顶层抽象 package com.netflix.loadbalancer; public interface IRule { Server choose(Object var1); ...
- 基于.NetCore开发 StarBlog 番外篇 (2) 深入解析Markdig源码,优化ToC标题提取和文章目录树生成逻辑
前言 虽然现在工作重心以AI为主了,不过相比起各种大模型的宏大叙事,我还是更喜欢自己构思功能.写代码,享受解决问题和发布上线的过程. 之前 StarBlog 系列更新的时候我也有提到,随着功能更新,会 ...
- BUUCTF---达芬奇的密码
题目 达芬奇隐藏在蒙娜丽莎中的数字列:1 233 3 2584 1346269 144 5 196418 21 1597 610 377 10946 89 514229 987 8 55 6765 2 ...