MickeyMiao

起点草甸

MickeyMiao

code is cheap, show me your prompt

51 篇文章 · 18 个分类 · 4 位朋友

向下滑动,出发 (或按 1-6 直达)

服务器小镇

家里小主机上的 Minecraft 生存服,白名单制。加入:QQ 群

状态
读取中…
在线
-
版本
-
已开服
-

每 10 分钟更新一次

关于雪松林

嗨,我是王思淼

图形渲染开发工程师 @ 小米。喜欢图形学、游戏和折腾服务器。

完整介绍 GitHub Bilibili Steam

回到森林 Esc 关闭

笔记GAMES101

GAMES101 第3讲 变换(二维)

二维空间中的变换

缩放

坐标经过缩放后, 坐标的变化为:

其中 的值为 , 表示缩小一半。

可以写成矩阵的形式:

缩放矩阵可以写成一个对角矩阵, 对角线上的元素为缩放的比例

当x与y轴缩放比例不相等时, 可以写成:

对称(反射)

对称变换是一种特殊的缩放变换, 缩放比例为 , 在图中的情况下:

可以写成矩阵的形式:

切变

在图中的情况下, 任意一个点的 坐标没有变化, 坐标的变化为:

  • 当 时,
  • 当 时,

也就是说, x坐标的变化量为 , 以矩阵的形式表示为:

旋转

任何旋转我们都默认为绕着原点 旋转, 默认的旋转方向为逆时针方向

二维旋转矩阵为:

二维旋转矩阵的推导

假设一个点 绕原点 逆时针旋转 角度后的坐标为

当该点原坐标 为 时, 旋转后的坐标 为

解方程得到:

同理, 当该点原坐标 为 时, 旋转后的坐标 为

解方程得到:

综上所述, 二维旋转矩阵为:

相反方向的旋转矩阵

如果要旋转 角度, 则旋转矩阵的推导过程为:

同时, 从定义上看, 旋转 角与旋转 角正好应该是互逆的操作, 即向相反方向旋转的矩阵等于旋转矩阵的逆矩阵:

因此, 在旋转的矩阵中, 旋转矩阵的逆矩阵就是其转置矩阵

如果一个矩阵的逆矩阵等于其转置矩阵, 则称这个矩阵为正交矩阵

线性变换

当一个变换可以写成以下形式时, 称为线性变换:

也就是说, 如果一个变换可以写成矩阵的形式:

即若 ,则称这个变换为线性变换

齐次坐标

引入齐次坐标的原因

平移变换是一种比较特殊的变换, 无法用线性变换的形式表示, 但是可以用齐次坐标的形式表示

只能写作以下形式:

所以, 平移变换不是线性变换

但是, 我们不想要这样的结果, 我们希望所有的变换都可以写成线性变换的形式, 所以引入了齐次坐标 (当然, 这是有代价的: No Free Lunch)

齐次坐标

引入一个新的形式来表示坐标变换: 增加一个维度

  • 2D的点:
  • 2D的向量:

矩阵的形式表示平移变换:

向量的齐次坐标最后一位是0, 在平移的矩阵乘法中不会影响结果, 体现了向量的平移不变性

  • 向量 + 向量 = 向量
  • 点 - 点 = 向量
  • 点 + 向量 = 点
  • 点 + 点 = 无意义

在二维齐次坐标中, 一个点的坐标可以表示为:

推论: 在齐次坐标中, 一个点加一个点的结果是两个点的中点

所有变换的齐次坐标形式

对于任何一种变换(无论是线性变换还是非线性变换), 只要满足以下形式:

都称其为仿射变换(Affine Transformation)

仿射变换的齐次坐标形式为:

其中, 为线性变换的矩阵参数, 为平移的矩阵参数

缩放, 旋转, 平移的齐次坐标矩阵

缩放

旋转

平移

逆变换

将一个变换的操作逆转, 称为逆变换

在数学上, 逆变换的矩阵为原变换矩阵的逆矩阵

变换的组合

变换的顺序

变换的组合是指将多个变换按照一定的顺序进行组合, 使得多个变换的效果等同于一个变换

思考: 如何实现下图的变换?

  • 方法一: 先平移, 再旋转 (可见, 先平移再旋转的效果与目标效果并不一致)

  • 方法二: 先旋转, 再平移 (达到目标效果)

由此可见, 变换的顺序是很重要的 (矩阵的乘法是不满足交换律的)

变换矩阵的写法

向量将会从右向左逐个进行矩阵变换的应用 (在算式里是从左向右计算的)

但是, 矩阵虽然没有交换律, 但是有结合律, 因此我们可以先将多个变换矩阵相乘, 再将向量与结果相乘

变换的分解

以任意点为中心的旋转

假设我们要以点 为中心, 逆时针旋转 角度

那么我们可以将这个变换分解为以下三个变换的组合:

  1. 平移 (整个图形一起平移到原点)
  2. 旋转 (以原点为中心旋转)
  3. 平移 (整个图形平移到原来的位置)

矩阵的形式表示为(注意, 矩阵的乘法是从右向左的):

#GAMES101#计算机图形学

评论