图形学中的基本变换梳理(未完待续)

图形学中的Basic Transforms

A transform is an operation that takes entities such as points, vectors, or colors and converts them in some way.

顾名思义,transform(变换)就是一种操作,输入实体(点,向量,颜色),以某种特定的方式转换他们。基本的变换包括平移、旋转、缩放、反射和错切矩阵,同样,讲这些基本的变换组合应用,也会产生不同的作用。

本文尽量以一种,轻松,通俗易懂的风格阐释,这也是我在学习图形学中的笔记

如果想学好计算机图形学,transform很重要,你只有掌握了它,你才能说你入门了计算机图形学。学他有什么用呢?因为这是基石呀少年。学了之后,你就可以摆放物体,玩弄灯光,操控相机,甚至reshape他们的形状,animate他们让他们动起来。将不同的物体结合起来,只有掌握变换,你才能在同一个坐标系中正确的使用坐标。总而言之就是很重要!


线性变换是一种保留向量加法和标量乘法的运算,比如说
上面的两个公式阐述了线性变换的本质,只要满足上面两个公式,就可以说这个变换是线性的。常见的线性变化缩放变换,比如说f(x) = 5x用标量5乘以向量的每一个元素,这个函数就是一个简单的缩放变化,可以所放物体的尺寸。还有旋转变换,比如说proj0(参看上一篇博文)中涉及的将点绕某点旋转多少度就是一个旋转变换,事实上所有的对于3D向量的线性变化,都可以表示成一个3 x 3的矩阵。

然而,3D矩阵的大小还是不够实现对所有3D物体的变换,注意我们这里提到的是变换而不是单纯线性变换。我们常见的变换还有平移变换,我们最先接触到的(小学一年级讲了?)变换应该就是平移变换,比如:f(x) = x + (1, 2, 3),就可以视为一个点的平移变换。

在计算机图形学中,我们时常想要把各种变换结合起来,比如先把一个物体缩小一半,再绕某个轴旋转90°,再平移到某个位置,这样复杂的结合无法只用一个简单的3D矩阵实现。

为了结合线性变换和平移变换我们可以使用仿射变换affine transform),通常存储在一个4 x 4的矩阵中,放射变换是一种变换,即先完成线性变换,然后再完成平移变换。为了表示四维向量我们使用齐次坐标,用统一的方式表示点和方向。

方向向量:

点的坐标:
所有的平移、旋转、缩放、反射和错切矩阵都是放射的。仿射变换的主要特征是保持平行性,即给平行线施加放射变换后,得到的仍是平行线。但放射变换不一定保持长度lengths和角度angles不变,我们可以将一个仿射变换理解成上面所说的单个仿射变换的序列组合。

All translation, rotation, scaling, reflection, and shearing matrices are affine.


基本变换

基本变换主要包括:平移-translation,旋转-rotation,缩放-scaling,错切-shearing,变换连接-transform-concatenation,刚体变换-rigid-body transform,法线变换-normal transform,逆的计算-computation of inverses

首先我们看看一看平移translation

Translation

平移表示点的位置从一处变到另一处,用平移矩阵T表示。设表示平移向量,就是每个方向平移的分量都组合到一起,我们可以得到平移矩阵:
(打公式真的太累了,说不定熟练后就好了?)
很好理解,平移变换的逆矩阵就是每个平移向量都取负数,相当于平移过来,再平移回去。

给定一个点,对其施加平移矩阵就可以得到平移后的点,要注意的是,方向向量不受平移矩阵的影响,因为方向就是方向,平移后方向并不会改变,这点也可以在数学上得到验证。比如这个平移矩阵去乘向量,得出来的结果不变。

还有一点要注意的,就是平移矩阵有两种形式一种是列优先(column-major)形式,在进行平移运算时用矩阵左乘向量,就是上面的那种矩阵,还有一种矩阵是行优先(row-major),就是把平移向量放在了最后一行,DirectX中用的就是行有限,矩阵要右乘向量,也要对向量进行一次转置。

Rotation

旋转变换用一个给定的旋转角度和过圆心的旋转轴来旋转一个向量(位置或方向)。和平移矩阵一样,它是一个刚体变换(rigid-body transform),即它保持变换后点之间的距离不变,保持handedness(惯用手)左右不变。


未完待续

全部评论

相关推荐

点赞 评论 收藏
转发
点赞 收藏 评论
分享
牛客网
牛客企业服务