第1章 3D图形学的基本原理
一、简介
OpenGL是一种用于创建实时3D图形的编程接口。学习OpenGL前应该对3D图形学原理有一定程度的理解。第1章主要介绍3D图形学的一些基本原理和概念。
二、计算机图形学简史
1、最开始是编写程序控制面板上照明灯组成的图案;然后在打印出现后,程序员用字符来创造图形。
2、在CRT显示器上,最初是显示直线、圆和多边形等2D图形。出现了“实时”图形的概念,意味着计算机可响应某些输入而直接生成动画或图像序列,可动态显示。
3、3D概念
3D是指被描述或显示的对象具有三个测量维度:宽度、高度和深度。计算机3D图形在本质上还是二维图像,不过是这些图形给人提供了深度的错觉,即第三个维度。
提供深度错觉的方法:2D+透视法=3D。如一个立方体,线段之间的角度提供了深度的错觉。同样,人的每个眼睛内的视网膜上形成的只是平面图像,之所以能提供三维的错觉,是因为两个眼睛看到的图像间有角度,这样,在人脑中就可合成一个三维的感觉。所以,大多数3D计算机图形实际上是近似3D。
但仅仅使用透视法是不够的,再加上颜色改变、纹理、光照、明暗和色彩强度的差异(光照的缘故),一起才合成了人对三维图像的感觉。
三、3D效果研究
渲染:是获得对三维对象(现实中的物体)的几何描述,并把这种描述变成屏幕上这个对象的图像的一种行为,在渲染过程中,要使用下面的3D效果。
1、透视法:指线段之间的角度引起三维错觉。虽然能提供一些三维错觉,但会导致感知问题,如正面和后面的部分会前后振荡。
2、色彩和明暗:添加颜色会有实心的感觉,但需要在不同面上添加不同的颜色或明暗不同的相同颜色才会增加三维的错觉,有助于眼睛辨别出对象的不同侧面。
3、光照和明暗处理:对各个侧面进行适当的明暗处理,可以赋予对象仅有一种颜色(材质)的感觉,而光照则可提供阴影。
4、纹理贴图:利用一幅图像,如真实表面的照片或细节,把这幅图像应用到多边形的表面,这样就可用比较简单的几何图形达到较高的真实感,渲染所花的时间也会短,增加了细节但不会增加额外的几何图形。
5、雾化:是一种大气效果,给场景中的对象增加了朦胧感,这种朦胧感通常与场景中的对象与观察者的距离相关,非常远的对象(或雾很浓),则看不清。多用于广阔的空间。
6、混合和透明度:混合指场景中颜色或对象的混合。使用混合可实现对象透明和反射的错觉。
7、消除锯齿:锯齿的产生是因为一幅图像由分离的像素组成。可以将线段与背景颜色混合之后,可以消除锯齿状边缘,使线段看起来很光滑,这种混合技巧称为“消除锯齿”。
四、3D图形常见用途
1、实时3D:如交互式游戏、仿真、医疗或商业用途的数据虚拟。实时3D最早用途是军用飞行模拟器。
2、非实时3D:如电影业。这可产生高质量的动画。一般是艺术家使用建模应用程序使用实时的3D图形来创建内容,形成帧;然后把制成的帧发送给另一个应用程序完成渲染。这是相当费时的。
五、3D编程基本原理
1、直接模式和保留模式(场景图)
编写实时3D图形的API有两种方法:保留模式和直接模式。
保留模式:这种模式下,需给API或工具包提供对象和场景的描述,然后由图形软件包(与前面的API或工具包相同吗?)在屏幕上创建图像。你(指开发人员?)可能采取的唯一额外操作是发出命令,修改用户(也称为摄像机)或场景中其他对象的位置和观察方向。这类方法多用于光绘笔、飞行模拟器和图像生成器。从编号的角度看,这样建立的结构称为场景图,这是一种数据结构(DAG:Directed Acyclic Graph,有向循环图),保存场景中所有物体及其相互关系。一般来说,这种模式的API是使用其它更底层的API,如OpenGL,进行渲染。
直接模式:实际上大多数保留模式API或场景图都在内部使用直接模式的API进行渲染。在这种模式下,不必从高层次上描述模型和环境,而是直接对图形处理器发出命令,这些命令会直接影响其(指图形处理器?)状态和所有后继命令的状态,就是说后面所渲染的所有几何图形都将受到前面指定的渲染参数的影响。
2、坐标系
坐标系用于设定一个参考框架来进行测量和定位对象。在屏幕上使用的是像素位置,所以在OpenGL中,要创建一个窗口并在其中绘图,必须指定要使用的坐标系,然后要把指定坐标映射为物理屏幕上的像素。
2D笛卡尔坐标:(x, y),以(0, 0 )为原点,x为水平轴,y为垂直轴,共同定义了一个平面。在3D绘图中,需要把这个真实的坐标空间以不同的方式映射为窗口坐标。
坐标修剪:窗口在物理上以像素测量(屏幕坐标?)。在用OpenGL画图前,需告诉OpenGL如何把指定的坐标对转换为屏幕坐标。为做到这点,需先指定窗口在笛卡尔空间中占据的区域,这就是坐标修剪,所占据的区域称为“修剪区”(窗口客户区的显示的部分?)。在二维空间中,指定修剪区的一种方法是指定窗口内最小和最大的x值和y值。另一种指定修剪区的方法是指定原点相对于窗口的位置。在编程中,可用OpenGL函数或Windows的GDI函数来向上、向下、向左或向右移动坐标系,实现修剪区的改变。实际上,Windows窗口的默认映射是从窗口顶部向底部y值增加,这对从上往下绘制文本很有用,但对绘制图形不方便。
视见(视口?)区:将绘图坐标映射为窗口坐标。视见区是窗口的客户区内用于绘制修剪区的区域(客户区里面的一部分可能就显示了视见区,但可能视见区也可设置得比窗口的客户区还大)。
空间中A顶点的位置:在绘制对象时,是用若干较小的“图元”的图形来组成对象。图元是一维或二维的实体或曲面,在3D空间中组合成3D对象。对象的每个角称为“顶点”。在3D空间中,用坐标来表示顶点。
3D笛卡尔坐标:(x, y, z),以(0, 0, 0)为原点,x为水平轴,y为垂直轴,z为深度分量,共同定义了一个三维空间。
3、投影:把3D变为2D,把3D坐标投影到2D平面,通过指定投影,可指定窗口中要显示的修剪空间(修剪区),然后对其变换。
正射投影(平行投影):其修剪空间是一个正方形或矩形。这个修剪区域外的任何物体都不会被绘制。此外,所有尺寸相同的物体看起来都一样大,无论是离得远还是近。这种投影方式常用于建筑设计,CAD等。
透视投影:增加了远处的对象比近处的对象显得小的效果,视见空间像一个削去顶部的棱锥,称为“平截头体”。越靠近视见空间前部的对象看起来越接近于其原始尺寸,而靠近此空间后部的对象在投影到空间前部时缩小了。这种投影类型常用于仿真和3D动画。