计算机图形学入门

来源:互联网 发布:淘宝客贷入口 编辑:程序博客网 时间:2024/06/05 10:11

这几天需要用OpenGL做一个小程序,之前没有计算机图形学和OpenGL的基础,以为很简单(事实上确实不难),但是在自己摸索的过程中却走了一些弯路。现在稍微总结一下。

1 坐标系统

从定义一个零件的几何外形到图形设备上生成相应的图形,需要建立相应的坐标系统来描述,并通过坐标变换来实现图形的表达。有几个坐标系需要了解一下。

1. 1 世界坐标系(world coordinate system)

又称为用户坐标系,是一个三维坐标系,多用右手直角坐标系,用来描述实物物体所处的空间。例如,stl文件中包含了构成实体模型的三角面片的法向量坐标和顶点坐标,这里的法向量和顶点坐标值就是在世界坐标系下的坐标值。
世界坐标系

1.2 设备坐标系(device coordinate system)

也称为物理坐标系,是一个二维坐标系,与图形输出设备相关联,用来表示三维模型投影后生成的二维图形显示在图形输出器(例如显示器)的坐标系。单位是象素(对于显示器来说)。

1.3 规格化设备坐标系(normalized device coordinate system)

这是一个人为规定的假象设备坐标系,与设备无关,目的是为了方便将图形软件应用到不同分辨率的设备。该坐标系的坐标轴方向以及原点与设备坐标系相同,但是它最大的坐标范围是1.
首先将输出图形转换为规格化设备坐标系,当转换到具体的不同输出设备时,只需要将图形的规格化坐标系再乘以相应设备分辨率即可,这样使图形软件与图形设备分离开来,增加了图形软件的可移植性。

2 投影(projection)和视景体(viewing volume)

我们在3D坐标系统定义模型,但是我们在屏幕上显示模型时只能使用二维坐标系,从三维坐标转换到二维坐标,这里就需要用到投影。我们可以用正投影(orthographic projection)或者透视投影(perspective projection)。关于这两个投影的性质就不讲了,网上很多。

2.1 视景体

我个人觉得这是很重要的一个概念,简单地来说,视景体就是三维空间中的一个封闭区域。在这个区域内的模型才能被显示在屏幕上,在这个区域外的部分会被裁剪掉,不会显示在屏幕上。视景体的大小范围是可以设置的,具体方法就是用上面的两种投影。

2.2 通过正投影设置的视景体

正投影设置的视景体是一个长方体,我们通过设置视景体xyz轴最大最小坐标来定义它。在OpenGL中可以用
GLFrustum::SetOrthographic(GLfloat xMin,GLfloat xMax,GLfloat yMin,GLfloat yMax,GLfloat zMin,GLfloat zMax)来定义,也可以用glOrtho(left, right, bottom, top, near, far)来定义。
在正投影中,观察者的位置假定在z轴正无穷处。

正投影实景体的形状
图片来源于网络,原网址是http://jerome.jouvie.free.fr/opengl-tutorials/Lesson1.php#ClippingPlane

2.3 通过透视投影设置的视景体

透视投影设置的视景体是一个平截头体(frustum),它的形状是一个金字塔被截去塔尖之后的形状。

frustum的形状及参数
frustum在坐标系中的位置

图片来源于网络,原网址是http://jerome.jouvie.free.fr/opengl-tutorials/Lesson1.php#ClippingPlane
在OpenGL中我们可以用GLFrustum::setPerspective(float fFov,float fAspect, float fNear,float fFar)或者gluPerspective(fovy, aspect, near, far)来定义。
在透视投影中,观察者的位置默认在坐标原点(0,0,0),从z轴正向看向z轴负向。为了我们的模型落在视景体内,我们还需要经过一些变换。

3 变换

3.1 点的齐次坐标表示

齐次坐标是将一个n维空间的点用n+1维的向量来表示,即附加了一个坐标。也就是说,我们使用一个四维行向量(或者说1X4的矩阵)[x,y,z,w]来表示三维空间中的一个点(x,y,z)。采用齐次坐标系的优点:(1)为几何图形的二维、三维甚至更高维空间的坐标变换提供统一的矩阵运算方法。(2)处理无穷远点比较方便。

3.2 图形变换

变换矩阵
上面我们说到,用四维行向量表示一个三维空间中的点,我们对他进行变换的方法就是用这个行向量A乘以一个4X4阶矩阵T:A·T.
这里写图片描述
上图以二维图形为例总结了一些变换矩阵,三维图形的变换是相同的,只是变换矩阵由3X3变成4X4。从这儿我们可以看出来使用齐次坐标来表示图形真的很方便,将这些变换组合起来只需要按照顺序乘以相应的矩阵。

原创粉丝点击