目录
N维空间中的仿射变换可以转换成N+1维空间中的线性变换来实现。
游戏中的场景渲染
场景渲染:游戏中包含很多炫酷的场景渲染,如下图所示
但大家有没有发现,场景中远处的树木要比近处的小,蜿蜒崎岖的小路在遥远的尽头汇聚成了一个点,这很符合我们眼睛中真实的世界——近大远小。
那么问题来了?这些场景是如何实现的呢?难道是按照距离的远近来设计景物的大小?从渲染源出发虽然能解决问题,但不可能把每一个视角都制作成一个独立的渲染源,工作量太大了,只能是按照真实世界的大小去设计,那么我们玩游戏的时候,游戏中的世界是如何模拟我们的眼睛呈现出透视效果呢?我们先来看下图:
这就要用到相机成像的原理了, 根据相似三角形定理:
整理后可得:
小写字母x,y,z代表图像坐标,大写字母X,Y,Z代表相机坐标,可见图像坐标与物体离相机光心的距离成反比,这就是为什么物体近大远小的根本原因。
让我们继续,使用齐次坐标,然后转换成矩阵的形式:
补充概念:齐次坐标
上面的x,y是假定坐标系原点为成像平面中心,其单位为mm;但实际使用更多的是以成像平面左上角为坐标系原点,且使用像素坐标,因此像素和长度之间需要转换,且水平和垂直方向的转换是不同的,上式经过变换后如下:
fu和fv为焦距f在横纵轴的长度和像素的转换,K就是相机内参矩阵,由相机的物理参数决定的。
有了内参矩阵,那存在外参矩阵的说法吗?答案是还真有这么一个东西,上面我们讲世界坐标系的时候,为了简化模型,假定世界坐标系和相机坐标系是重合的,但现实中,这两个坐标系可能不是重合的,既然不重合,成像过程还必须知道点在相机坐标系下的坐标,那就一定存在一个转换过程,将世界坐标系下的物体坐标转换到相机坐标系下,这个过程可以用矩阵来表示,这就是外参矩阵。
将其与上面内参矩阵合并:
让我们来总结一下:通过变换矩阵M,就实现了将三维世界坐标系下的物体投影到了二维相机图像坐标系下,这和我们之前理论中所讲的一致:矩阵与向量的乘积可以实现不同维度向量空间之间的转换。
物体移动:
游戏作为动态场景,会有大量的角色移动,其中最常见的就是旋转和平移,那么我们怎么完成一个3D空间中物体的移动呢?
我们一般可以将一个3D空间中物体的旋转拆分成欧拉角,也就是绕X轴,Y轴,Z轴3个轴的旋转。就和空间中任意一个点都可以通过(x,y,z)来表示一样,空间中任何一个旋转都可以表示成(α,β,γ)简单起见,假设都分别旋转角。那么如何用矩阵的方式进行表示呢?
如果空间中一个点X,如果按照如下顺序进行旋转:
1.绕X轴旋转角
2.绕Y轴旋转角
3.绕Z轴旋转角
则转换后的点为:
如上图所示,这就涉及到了前面讲的矩阵的复合变换。
如果进行平移呢?我们能否通过3x3的一个矩阵实现一个平移变换呢?答案是不能。
旋转是一个线性变换,如果把旋转想象成基底(我们可以先把基底想象成坐标系)的旋转,则在线性变换的过程中,原点不会发生变化。
但是平移变换会发生原点的变化,所以在3D空间中的线性变换无法达到平移的效果。那么我们如何利用线性变化达到旋转+平移(仿射变换)的效果呢?就是提高一维。
N维空间中的仿射变换可以转换成N+1维空间中的线性变换来实现。
上面这句话很重要。
所以我们首先要提高一维,首先将3维空间中的点提高成4维(齐次坐标),然后利用线性变换达到平移的效果。
那么平移矩阵是什么呢?
其中X,Y,Z分别代表沿X,Y,Z轴移动的距离。
同理,上述旋转变换矩阵也得扩展成4维。
平移与旋转并没有像前面的投影变换那样改变向量空间的维度。
到此,我们知道了线性代数的知识可以帮助我们完成游戏场景的创建和场景中物体的移动。
你可能会说了,这里面的平移变换和旋转变换计算机会帮助我们处理,我们学习线性代数有什么作用呢?
计算机只是你思想的执行者,并不能帮助你思考。
在上面的游戏设计中,有下面两种变换方式
先进行平移再进行旋转
先进行旋转再进行平移
请问这两种变换结果是一样的吗?
如果你知道在矩阵乘法中 AB!=BA,也就是不满足交换律,那么上面的问题,你可能不用过多思考就能给出答案。所以,掌握好线性代数基础非常重要。
角色进入特定区域:
如下图,游戏中有一个八卦阵,玩家控制的角色进入到八卦阵中,中间的怪兽立即发光。
如果你来设计这个游戏,如何检测一个角色进入到八卦阵中呢?试着将它简化为一个数学问题,把角色当成一个质点,就是如何判断一个点在一个八边形内?
更一般的,就是如何判断一个点在凸多边形内或凸多边形上?
看起来好像很简单,不就是在一个多边形内吗?其实这个还真不简单。这里涉及到计算机图形学的知识,当然有很多判断方法,这里介绍一种利用线性代数的方法。
如果点O在多边形内部(如下图),我们将多边形顶点A-G和O点连起来,组成有序向量AO...GO共7个向量。另外多边形的顶点顺时针连接,组成向量AB,BC....GA也组成七个向量。
将上面两组向量两两配对,组成(AO,AB),....(GO,GA),共7组向量,我们看看每组向量有什么特点?是不是每组向量中的第1个向量都在第2个向量的顺时针方向?
比如AO在AB的顺时针方向,DO在DE的顺时针方向,也就是如果O点在多边形内部,则每组向量中的位置关系是固定的,即第1个向量在第2个向量的顺时针方向。而且这个条件是充要的。
再看下图,如果点O在多边形外部,AO在AB的顺时针方向,但是GO却在GA的逆时针方向,也就是说如果O点在凸多边形外,则每组向量中的位置关系是不固定的。
好了,那我们怎么表示这种顺时针的位置关系呢?这就用到了线性代数中的行列式。我们知道行列式的几何意义是什么吗?
如上图,我们有两个向量(1, 2), (-1, 1),组成的行列式为
这里面行列式的值就是由OA,OB组成的平行四边形面积。
有人可能会有疑问,行列式有可能是负值,那么负值的含义是什么呢?于是我们将上面两个向量对调,重新组成行列式。
看到了吗,行列式的绝对值就是由两组向量组成的平行四边形的面积。而符号呢,代表了OA,OB的相对位置关系。
我们可以参考下面的右手定则,如果OA在OB的顺时针方向,,则用行列式求出来的符号也就是叉乘出来的值就是正的,反之,符号就是负的。
所以,我们竟然可以用线性代数中行列式的正负来表示两组向量的位置关系,从而能够表示一个点是否在一个凸多边形内或凸多边形上,进而判断角色是否进入八卦阵中。是不是特别的神奇?
其实“线性代数”的用处远不止于此,在“图像处理”,机器学习”等领域都有非常广泛的应用