计算机图形学基础知识

计算机图形学基础知识

本文介绍一些和计算机图形学相关的数学知识。这里假设读者对大一课上学的基础的线性代数非常熟悉,所以对向量是什么、矩阵是什么、矩阵的乘法以及线性变换等基本内容就不再介绍了。

计算机处理3D图形的过程主要分为三步:建模(Modeling),动画(Animation),绘制(Rendering)。这里首先介绍建模,然后介绍绘制,最后介绍动画。

建模部分负责构造要被绘制的3D对象。

绘制部分负责把3D对象渲染出来。目前绘制技术包括两大类,栅格(Rasterization)光线追踪(Raytracing)。这两类技术的思路刚好相反。栅格技术的出发点是3D对象,判定一个3D对象应该怎样绘制到屏幕上。光线追踪则考虑屏幕上的每个像素,追踪从这个像素出发的光线,分析这个像素是什么颜色。光线追踪技术绘制的画面更加逼真,但计算量也更大。

坐标和变换

外积

外积这种运算,是三维向量特有的,在空间几何中极为常用。

设有两个向量,它们的外积仍然是向量,记为

  • 的方向:和都垂直,因此决定的平面(如果不平行的话)垂直。具体方向由右手定则判定;
  • 的大小:,这里的夹角(所以如果平行,);
  • 外积不满***换律或结合律,但满足分配率:
  • 外积可以用行列式计算

这里为三个方向上的单位向量。

  • 外积也可以用如下公式计算:。这里的对偶矩阵.

计算机图形学中,常常用外积来计算和两个给定向量都垂直的向量。

坐标系

一个坐标系(Coordinate Frame)由三个向量表示,这三个向量满足

  • 单位向量
  • 两两正交

显然,以按顺序为行向量组成的矩阵,就是一个行列式为1的三阶单位正交阵。反过来,任意一个行列式为1的三阶单位正交阵的三个行向量也可以构成一个坐标系。

变换

变换是建模中最重要的概念之一。一个3D对象的大小、位置、方向,全部由变换决定。不同3D对象之间的相对位置和方向,也都由变换来表示。

变换可以用矩阵表示。变换的组合对应矩阵的乘法。

下面介绍基本变换。一般的变换可以通过这些基本变换组合出来。

缩放变换:

三个方向分别乘以对应的缩放倍数。

剪切变换:

剪切变换的效果如下图所示。

图片说明

2D旋转:

2D旋转满***换律,两个旋转的组合就是它们的旋转度数简单的相加。

3D旋转:

之所以把二维变换和三维变换分开来讲,是因为它们的区别实在太大了。

三维旋转没有一个一般的公式。实际上,所有不改变位置、不镜面反射的刚性变换,就是全部的旋转变换。换句话说,三维旋转的矩阵集合就是所有行列式为1的单位正交矩阵集合。

三维旋转是不满***换律的。放缩和平移变换都能够用三个坐标表示,因为在三个方向上的变换可以随意交换顺序。三维旋转不可以。

当使用3D建模软件或者3D游戏开发工具的时候,一个对象的控制面板上都会有“变换”这一模块,一般是三行三列数字,通常来说,第一行是平移,第二行是旋转,第三行是放缩。平移和放缩都很容易理解,只有旋转的三个数字代表什么效果,不是那么直观。实际上,只有其他数字是零的时候,改变其中一个值的效果才比较容易理解:某个方向上的旋转,就是绕这个方向的坐标轴旋转,迎着坐标轴的方向看去是逆时针旋转。所以三个基本的3D旋转的矩阵如下所示:

任何一个旋转都可以看做绕某个轴的旋转。所以,一个3D旋转可以用一个单位向量和旋转角度表示,其中表示旋转轴的方向。对应的矩阵可以由Rodrigues旋转公式算出:

这个公式的推导如下:设有任意一个向量,首先推导出旋转之后得到的向量的公式,然后把这个公式整理成矩阵乘以的形式。这个就是要求的矩阵。

拆开为沿方向的分量和与垂直的分量。显然,在旋转中保持不变,对应了上式中的,这个分量旋转度之后,就对应了上式中其他的部分。

同态坐标

到目前为止,我们仍然没有讲相对简单的平移变换。那是因为平移变换在三维空间中是一个尴尬的存在:它不对应于一个线性变换,无法用三维矩阵表示。平移变换只能用向量的加法表示,但这不是漂亮的解决办法。

为了解决这个问题,将三维空间中的平移用四维空间的剪切变换来表示。想象一下二维空间中的剪切变换,如果沿着剪切的方向取一个一维的横截面,那么在这个一维空间中,剪切变换就投影成了平移变换。四维空间和三维空间之间的关系也是如此。

一个三维空间中的点对应着四维空间中的一条线。反过来任意一个四维空间中的点可以投影为三维空间中的一个点,前提是。所有的点可以看作无穷远点。这样的四维坐标叫做同态坐标

之前介绍的所有变换对应的三维矩阵,都可以如下扩充为四维矩阵:

只有接下来介绍的平移矩阵不是这种格式。

平移:

变换的组合: 变换的组合对应于矩阵的乘法。和矩阵的乘法一样,这种组合是不可交换的。一般来说,先缩放、再旋转、最后平移,是比较直观的做法。

用到先平移再旋转的情况,一般是在选择摄像头的角度时。此时旋转变换会造成整个世界的旋转。

法向量的变换矩阵: 当变换一个曲面时,把同样的变换作用到法向量上,得到的结果可能和变换后的曲面不再垂直。因此,要计算变换之后的法向量,需要另外一个矩阵。

为了得到变换对应的法向量变换矩阵,考虑法向量和所有切向量垂直这一事实,也就是。变换之后,我们希望使得。要让这个式子对所有成立,必然有,所以

注意到这个结果符合一个直觉:当变换为刚性变换时(也就是只有旋转),法向量也遵从同样的变换。对应地,此时为单位正交矩阵,而正交阵恰好和自己的逆转置相等。

上述关于法向量变换矩阵讨论只针对三维空间。平移变换不会改变法向量。

模型矩阵

模型矩阵(Modelview Matrix)要把对象在世界中的位置,换算成这个对象在摄像头坐标系中的位置。OpenGL的gluLookAt()函数的作用就是根据指定的摄像头参数,设置模型矩阵,让摄像头“看着”目标点,

这个函数有三个向量作为参数:eye​,​centerup。其中,eyecenter固定了摄像头的位置和要对准的目标位置,up​则表示哪里是“上方”。

在OpenGL中,经过模型矩阵变换后,原先摄像头对准的方向,会变换到方向,摄像头头顶方向会变换到方向,摄像头右手方向则变换到方向。

gluLookAt()这个函数,是要计算一个模型矩阵,使得它代表这么一个变换:把摄像头坐标系平移到原点,旋转后对准标准坐标系。下图是二维情况下的示意图:

图片说明

首先计算摄像头坐标系的三个基向量的坐标。首先,因为摄像头瞄准的方向要被映射到需要对摄像头的方向取反,即eye - center,然后归一化得到的单位向量。计算up的外积并归一化,就得到了方向向量。最后,计算

如上计算好之后,得到如下矩阵:

因为为两两正交的单位向量,这个矩阵将分别映射到,也就是变换之后的坐标系。

这个矩阵代表了一个旋转变换,在旋转之前需要首先把摄像头移动到原点。因此,最终的模型矩阵是旋转矩阵乘以平移矩阵得到的:

投影矩阵

模型是3D的,而最终呈现的画面却是二维的。因此,我们需要将3D的坐标映射到二维坐标系中。这个变换就是投影,对应的矩阵就是投影矩阵(Projection Matrix)。常用的有正交投影和透视投影。接下来的描述中,都假设已经做过模型变换,摄像头的位置放在了原点,目光对准了方向。

正交投影

想象一束和轴平行的光透过模型打到-平面上,在这个平面上留下的画面,就是正交投影(Orthogonal Projection)

这种投影方式,其实就是把坐标直接去掉,从三维坐标得到二维坐标。投影矩阵就是:

它把直接映射到

我们希望能指定一些参数,划定一个范围,将这一个范围内的模型映射到范围内。

在OpenGL中,正交投影需要指定六个参数left, right, top, bottom, near, far

这六个参数确定了六个平面的位置,框起一个长方体,长方体外的部分被忽略。

首先应用一个变换,将这个长方体放映射到一个大小为2,中心在原点的正方体。最后,将得到的坐标取部分,就得到了最终的投影坐标。

透视投影

正交投影虽然简单,却并不能准确模仿人通过眼睛看到的视野。比如,它就无法得到近大远小的效果。更逼真的投影方式是透视投影(Perspective Projection)。为了理解这种投影方式,想象从摄像头的位置向方向发射出一个金字塔形状的方锥。

图片说明

在一个位置用一个平行于-的平面去截这个金字塔,得到的矩形就是投影矩形。。对于方锥内部的点,将其和原点连一条线,和投影目标平面的交点,就是这一点的投影。

OpenGL中的透视投影有如下参数:

  • foy,即方向的视野角度;
  • aspect,即投影矩形的长宽比;
  • near,即投影目标平面的坐标;
  • far,进入视野的最远距离。

OpenGL中,nearfar都是正的,far大于near。但OpenGL的摄像头是往方向看的,所以实际上这两个平面的位置分别是-near和​-far​

我们希望在这个范围内的点刚好投影到这个方块内。首先关注方向。设,我们希望一个点向原点方向投影,在平面上的坐标变为

为了实现这个变换,考虑如下矩阵

这样,对于点同态坐标,变换之后就成了,也就是。所以,只要不超过,也就是在方向上处于这个金字塔之内,坐标就会映射到之内。

接下来调节方向。既然方向已经在范围里了,只需要在方向上缩小aspect倍,那么也就刚好落到上。于是矩阵变为

因为矩阵是同态的,全部乘以一个系数不会改变矩阵的作用效果,所以可以全部乘以,得到

最后,我们用待定系数法调整这个矩阵,使得nearfar平面分别落在上。因为坐标不能影响的映射,所以只能考虑右边两列。因为只考虑坐标的映射结果,所以实际上只能调节第三行右边两个系数。设其分别为。于是我们需要有。最后解出来矩阵为

小结

本文介绍了一些和计算机图形学相关的数学知识。首先我们介绍了外积、变换和变换矩阵,以及同态坐标。然后我们介绍了模型矩阵,用于将摄像头变换到原点位置。最后我们介绍了投影矩阵,用于将3D物体映射到二维平面上,包括正交矩阵和投影矩阵。

全部评论

相关推荐

1 1 评论
分享
牛客网
牛客企业服务