图形学知识基础:变换与矩阵的关系,齐次坐标

本文探讨了图形学中的变换,如模型变换、视图变换,以及它们如何通过线性代数中的矩阵表示。涉及缩放、旋转、投影等变换原理,同时剖析了复平面在变换中的应用,线性变换的定义,以及二维空间中的各种变换矩阵,如缩放、对称、切变、旋转和平移。并介绍了齐次坐标和仿射变换在表达复杂变换中的作用。
摘要由CSDN通过智能技术生成

何为变换

首先是两个参考视频:

视频1:现代计算机图形学入门-闫令琪(第三章:变换的介绍)

视频2:线性代数的本质 - 03 - 矩阵与线性变换

在生活中,或者说在我们开发游戏的时候,会碰见很多很多的变换。在图形学中,主要有如下两种变换,模型变换(例如模型的缩放,IK)和视图变换(例如相机的移动旋转)。还有例如三维空间到二维空间(投影)也是非常重要的变换。

上面提到的移动,缩放,旋转这些变换,其实都是将一个输入的值,进过一些操作,变成一个新的输出值。例如输入一个点的位置0,最后输出其位置10,即发生了移动变换。由这一个特性也可得出,所谓的变换其实就是函数

输入值x -> 变换( 函数f(x) ) -> 输出值x

而使用变换是为了让我们以运动的方式去思考,例如前面提到位置0变为10,我们要想成是从0慢慢移动到10,并不是一下子变为10。

 

线性代数中,变换考虑的是一个向量的输入以及输出,向量的起点都为原点,例如将向量(2,4)缩放0.5倍,即得到向量(1,2)。对于一个整个空间(称之为线性空间向量空间),我们可以看作空间内有无数个点,而原点到每一个点的连线即为一个向量。空间的变换即空间中每一个向量都移动到对应输出向量的位置,也可以看作是空间中的每个点移动到变换后的目标位置。

例如下图,便是一个简单的空间旋转变换,向量(0,1)旋转后变为(1,0)。

接下来我们来看一个比较复杂的变换,如下图,为复平面f(v)=v^{2} / 2 的变换:

看着很高级,那么它是怎么变换成这样的呢?首先我们要了解何为复平面,简单来说复平面是用来表示复数的,即a+bi,其中a和b为实数,i为虚数(i^{2}=-1)。复平面中x轴的值代表着复数中实部a的值,y轴的值代表着虚部b的值,因此点(1,1)代表着1+i,点(7,-8)代表着7-8i。清楚这一点后,我们就可以通过一些特殊的点,来计算出其变化后的值了,例如:

变化前的点 对应的复数 进行 f(v)=v^{2} / 2 变化 变化后的点
(1,0) 1 1^{2}/2=0.5 (0.5,0)
(1,1) 1+i (1+i)^2/2=(1+i^2+2i)/2=(1-1+2i)/2=i (0,1)
(1,2) 1+2i (1+2i)^2/2=(1+4i^2+4i)/2=(1-4+4i)/2=-1.5+2i (-1.5,2)

上面其实也就解释了下图中两根黄线的变化前后的缘由。至于为什么要在复平面上,应该是因为如果单纯的只是向量的平方那是没有意义的,因为向量是一个2*1的矩阵,向量的平方即为2*1的矩阵乘以2*1的矩阵,根据矩阵的乘法定义,我们知道它们无法相乘。

 

线性变换

线性代数限制在一种特殊类型的变换上,即线性变换。如果一个变换拥有以下两个性质,我们就称它为线性的变化:

  • 直线在变换后仍保持直线,不能有所弯曲。
  • 原点保持固定

我们知道变换即为一个函数,我们假设这个函数为 f(x) ,那么站在数学的角度上,如果同一个空间中的任意两个向量 \vec{a} 和 \vec{b},以及数域中的一个数k(可以简单的理解为k为一个实数),满足以下条件的话,函数 f(x) 即为线性变换:

  • f(\vec{a} + \vec{b}) = f(\vec{a}) + f(\vec{b})
  • kf(\vec{a}) = f(k\vec{a})

例如 f(x) = 2x,代表着一个放大两倍的变换,设 \vec{a} = (2, 0), \vec{b} = (0, 3),那么 \vec{a} + \vec{b} = (2, 3)。可得到 f(\vec{a}) = (4, 0)f(\vec{b}) = (0, 6)f(\vec{a}) + f(\vec{b}) = f(\vec{a} + \vec{b}) = (4, 6) ,满足第一条定则。设k=3,那么k\vec{a} = (6, 0)kf(\vec{a}) = f(k\vec{a}) = (12, 0),满足第二条定则。因此该变换为线性变换。

 

推导

设两个基向量 \vec{x}=(1,0)\vec{y}=(0,1) 那么任意一个向量\vec{a} 都有 \vec{a} = (i,j) = i\vec{x}+j\vec{y},当空间发生线性变换后,所有向量都会发生变换,包括我们的基向量。假设变换后\vec{x}=(x_{a},y_{a})\vec{y}=(x_{b},y_{b}),那么变换后的\vec{a}即等于\vec{a} = i(x_{a},y_{a})+j(x_{b},y_{b}),能推导出这步也是因为线性变换的那两个性质。

我们把它写成矩阵的形式:

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值