图形学——变换


二维平面上的变换

二维缩放

image

一个坐标左乘一个缩放矩阵,得到缩放变换后的坐标

切变

image

二维旋转

image

默认为绕原点,逆时针旋转

旋转矩阵还是一个正交矩阵,正交矩阵满足的性质是:矩阵的转置=矩阵的逆
所以旋转-θ角度,将旋转矩阵转置即可

缩放、切边、旋转均是线性变换,变换只包括数乘和加法
image

线性变换一定可以用上述形式表示

如何写出变换的方程:
找到变换后的坐标和原始坐标的关系,并用矩阵乘积的形式来表达

二维平移

平移变换不能简单地通过用线性变换(左乘一个2x2的矩阵)来表示
image
image

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

二维齐次坐标系

齐次坐标系就是用来解决平移变换的特殊性,用统一的形式表达所有的变换

齐次坐标系的特点:
给二维的点和向量加上一个维度,用三个元素来表示
image

齐次坐标系可以保证以下事实
image
还有“向量平移后还是原来的向量”

给三维的向量(x,y,w),(w!=0)扩充定义,可以对其进行数乘,使得第三维为1,此时是一个标准形式的齐次坐标系表示
对任意一个w!=0的三维向量进行数乘不会改变它代表的点
这样任意一个三维向量都可以用来表示一个点或者一个向量
而且任意一个二维点可以有无数种表示
image

而且利用这个扩充的定义很容易可以推出
point + point 的含义就是两个点的中点

二维仿射变换

仿射变化用二维向量表示是如下形式
image

用齐次坐标系可以表示出一个仿射变换的矩阵
image

仿射变换的3x3矩阵中
左上角2x2的矩阵是二维向量中线性变换的矩阵,(1,3)是x方向上的位移量,(2,3)是y方向上的位移量,第三行在仿射变换中默认为(0,0,1),保证了点在仿射变换后还是点,向量还是向量

一个仿射变换的矩阵,表示的是先进行左上角2x2矩阵的线性变换,再进行平移变换,注意这个顺序是确定的

逆变换

image

一个点或向量变换后,将这个变换矩阵求逆后左乘到当前的点或向量上,即可恢复原来的情况,也就是逆变换

变换的组合

一个变换的组合中变换的顺序应该是确定的,变换了顺序得到的变换结果是不一样的
我们用矩阵的乘法来表示变换的组合
矩阵的乘法也是不满足交换律的,和变换的组合一致

变换矩阵应该放在作用对象的左边,即进行矩阵的左乘,而且从最靠近对象的变换矩阵开始运算
image

如上组合变换就是先旋转,再平移

矩阵的乘法满足结合律,可以把所有变换矩阵都乘起来,成为一个复杂的变换矩阵,而且这个复杂的变换矩阵始终和作用对象保持一致的大小。这说明无论变换多复杂,大小都不会发生变化
image

变换的分解

一个复杂的变换可以分解为一系列变换步骤,和变换的组合是相反的关系
一个非绕原点的旋转就可以分解为 平移 + 绕原点旋转 + 平移
image

三维空间中的变换

三维齐次坐标系

三维空间中的齐次坐标系和平面上的齐次坐标系概念一致,也是加多了一个维度
此时用四个元素来表示三维向量和点
image

同理任意(x,y,z,w)(w != 0)都可以通过数乘,使得w = 1,转换为一个标准的三维点的表示方式,所以任意一个四维向量都可以用来表示一个三维的点或向量
任意一个三维点可以有无数种表示
image

三维仿射变换

image

左上角3x3表示的是线性变换
(1,4),(2,4),(3,4)表示的是三个坐标轴上的位移量

缩放

image

三维平移

image

三维旋转

使用轴角表示旋转

轴角也就是绕单轴旋转
用(x,y,z,w)来表示
x,y,z用来表示轴的方向,是一个向量,w是标量,表示旋转的角度
通过轴角可以完成所有的从一个方向变换到另一个方向的旋转
和两点之间直线最短一样,两个方向之间,绕单轴旋转路径最短

但这种旋转方式适用情况不多

使用欧拉角表示旋转

欧拉角是三个一组的角参量
由章动角θ、旋进角ψ和自转角φ组成
分别对应绕三个坐标轴旋转的角度
我们往往把单纯绕y轴的旋转叫做yaw
单纯绕x轴旋转叫做pitch
单纯绕z轴旋转叫做roll
image

我们采用的是右手笛卡尔坐标系
image

三维空间中绕原点的任意旋转一定可以分解为三个绕轴旋转的组合,由下方罗德里格斯旋转公式证明
罗德斯格斯旋转公式也提供了绕过原点的任意轴旋转的计算方法
image

分别单独绕x,y,z轴旋转的矩阵如下
image

我们将三个矩阵组合起来,就得到了任意绕原点旋转的公式
image

若三维空间中非绕原点旋转,和二维空间一样,可以分解为平移+旋转+平移

欧拉角存在的问题

坐标系

实际中,物体旋转应该按照物体自身的坐标系来旋转,而不是绝对的坐标系,也就是说欧拉角应该用来标记物体自身坐标系下的旋转量

但每一次旋转都造成了物体自身坐标系与绝对坐标系的偏移,并不方便观察,而且旋转的组合是不能交换顺序的,先发生的旋转会在坐标系上对后发生的旋转造成影响

万向节死锁

万向节
image

用欧拉角旋转,会造成万向节死锁的情况(具体原因不理解)
image

当出现死锁,会丧失一维甚至两维自由度,也就是只能在二维平面甚至是一维直线上旋转了

使用四元数表示旋转

四元数可以避免使用欧拉角出现的问题

四元数的定义

一个四元数q,形如(a,b,c,d)
q = a + bi + cj + dk
一个标量作为实部,虚部有三个部分
可以和四维空间上的点一一对应
a是在过原点且垂直于三维空间的一条实轴上的位移
image

i,j,k满足
image

扩展一下加法的定义
四元数可以用标量加上向量的形式表示
image

四元数乘法公式

image
image

用四元数表示三维空间中的旋转

q = a + v(向量),a=0时,q代表一个纯四元数,也就是纯三维空间上的一个向量

三维空间中的旋转就是一个纯四元数绕着另一个纯四元数旋转
image

v绕着u旋转得到v'
旋转的公式如下
image

观测变换

我们对图形进行变换的目的:将三维的物体转换为二维的一张图片

我们模拟得到一张照片的步骤

  1. 将观测物体进行模型变换
  2. 将相机进行视图变换
  3. 投影变换
    简称为model-view-projection MVP变换
    我们用观测变换来描述第2和第3步,包括了视图变换和投影变换

视图变换

相机的几个属性
image

我们的相机需要满足一个事实
当相机和观测物体不发生相对运动时,拍出来的照片应该永远是一样的
我们可以假设,相机永远放在原点
朝向-Z轴,up-direction是Y (约定俗成)

则将任意一个位置的相机,摆放到我们要求的位置,需要
image

先进行平移,平移矩阵如下
image

g作为一个不特定的方向,很难用矩阵表示g旋转到-Z方向,但将-Z方向旋转到任意方向的矩阵都好写(t同理)
所以我们就写出从标准位置旋转到相机原位置的矩阵
image

可以观察到
这个矩阵右乘X方向,得到了gxt
右乘Y方向,得到t
右乘Z方向,得到-g
和我们需要的变换恰好相反

再将矩阵求逆就是我们需要的旋转矩阵
因为旋转矩阵是正交矩阵,转置即可得到逆矩阵
image

视图变换由下式表达
image
先进行平移,再进行旋转

不仅是相机做视图变换,应该是相机和所有观测物体组成的整体进行视图变换,以保持相对位置一定,且相机位于标准位置

投影变换

投影变换分为正交投影和透视投影

透视投影下,两条平行线会在远处相交,可以产生近大远小的效果,符合人眼的成像规律,正交投影下平行线不会相交,符合工程实际

image

将相机假设为一个点,通过这个点无限延伸出空间中的一个锥
我们规定这个锥上的一个far clip plane远平面和一个near clip plane近平面,两个平面中间的图形叫做frustum
在照相时,我们希望frustum中的物体会被显示到近平面上
frustum内部的物体通过视图变换就会变小(注意相机的的透视投影成像是将实际物体变小)
在正交投影下,我们可以理解为相机无限远,不存在变大或者变小,把深度信息忽略

正交投影

正交投影的一种理解

image

将相机放在标准位置
将z轴丢掉,所有三维物体将会被投影到xy平面上
我们将印有所有物体投影的xy平面缩放成以原点为中心的2x2的矩形,代表着相机成像

正交投影的通用理解

一个立方体有如下属性
image

\(l,r\) 代表左右,是x轴上的坐标
\(b, t\)代表下上,是y轴上的坐标
\(f, n\)代表远近,是z轴上的坐标
image

需要注意的是,\(z\)越小,离我们越远,反之离我们越近

正交投影可以分为两个步骤

  1. 将立方体中心平移到原点
  2. 将立方体缩放成2x2x2的正方体
    image

则正交投影的矩阵如下
image

透视投影

在图形学中更常见地是使用投影变换

image

投影变换中,我们对图中的frustum先进行一个“挤压”的变换
使得frustum变换为一个cuboid
再对cuboid进行正交投影,透视投影就完成了
image

对于一个frustum,我们将其压缩成一个cuboid,可以列出以下两个条件
image

除了特定点,我们并不知道z的变化情况(注意cuboid上,除了两个平面上,其他点的z都会发生一定的变化)
用矩阵形式来表示这个线性变换
image
image

根据这两个条件可以写出变换的矩阵的一部分
image

此时要写出第三行,我们还需要一些信息
注意到,在近平面,所有点都没有发生变化,
image

而在远平面,中心点没有发生变化
image

通过上述两个条件,就可以解出“压缩”矩阵
image

而整个投影变换的矩阵就是正交矩阵左乘“压缩”矩阵
image


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM