计算机中三维物体的表示有线框模型、表面模型和实体模型3种方法。
模型的数据结构
三表结构
立方体的点表
顶点 |
x坐标 |
y坐标 |
z坐标 |
P0 |
X0=1 |
Y0=0 |
Z0=0 |
P1 |
X1=1 |
Y1=0 |
Z1=0 |
P2 |
X2=1 |
Y2=1 |
Z2=0 |
P3 |
X3=0 |
Y3=1 |
Z3=0 |
P4 |
X4=0 |
Y4=0 |
Z4=1 |
P5 |
X5=1 |
Y5=0 |
Z5=1 |
P6 |
X6=1 |
Y6=1 |
Z6=1 |
P7 |
X7=0 |
Y7=1 |
Z7=1 |
立方体的边表
边 |
起点 |
终点 |
E0 |
P0 |
P1 |
E1 |
P1 |
P2 |
E2 |
P2 |
P3 |
E3 |
P3 |
P0 |
E4 |
P4 |
P5 |
E5 |
P5 |
P6 |
E6 |
P6 |
P7 |
E7 |
P7 |
P4 |
E8 |
P0 |
P4 |
E9 |
P1 |
P5 |
E10 |
P2 |
P6 |
E11 |
P3 |
P7 |
立方体的面表
面 |
第1条边 |
第2条边 |
第3条边 |
第4条边 |
说明 |
F0 |
E4 |
E5 |
E6 |
E7 |
前面 |
F1 |
E0 |
E3 |
E2 |
E1 |
后面 |
F2 |
E3 |
E8 |
E7 |
E11 |
左面 |
F3 |
E1 |
E10 |
E5 |
E9 |
右面 |
F4 |
E2 |
E11 |
E6 |
E10 |
顶面 |
F5 |
E0 |
E9 |
E4 |
E8 |
底面 |
消隐算法分类
- 隐藏线消除算法:用于消除物体上不可见的边界线。隐藏线消除算法主要是针对线框模型提出的,只绘制物体的各可见棱边。
- 隐藏面消除算法:用于消除物体上不可见的表面,隐藏面消除算法主要是针对表面模型提出的,使用指定颜色填充物体的各可见面。
凸多面体消隐算法
凸多面体的表面要么完全可见,要么完全不可见。
对于凸多面体的任意一个表面,可以根据其外法向量N与视角向量S(从表面上的一个顶点指向视点)的夹角a来进行可见性检测。
当a大于等于0度,小于90度,cosa大于0:表面可见
当a=90度,cosa=0:表面多边形退化为一条直线
当a大于90度,小于等于180度,cosa小于0:表面不可见
曲面体消隐算法
曲面体实质上是用多面体表示的。曲面体的表面细分为三角形网格或四边形网格,也就是用平面网格来逼近表示。曲面体消隐的主要任务是判断各三角形网格或四边形网格的可见性,可采用与凸多面体消隐类似的算法进行处理,利用小网格的外法向量的数量积来进行可见性检测。
隐藏面消除算法
隐藏面消除算法是指从视点的角度观察物体表面,离视点近的表面遮挡了离视点远的表面,屏幕上绘制的结果为所有可见表面投影的集合。
一种算法与表面的绘制顺序无关,但使用缓冲器记录了物体表面在屏幕上投影所覆盖范围内的全部像素的深度值和颜色值,依次访问屏幕范围内物体表面所覆盖的每一像素,用深度小的像素颜色取代深度大的像素颜色,可以实现消隐。
一种算法是与表面的绘制顺序无关,屏幕上先绘制离视点远的表面,再绘制离视点近的表面,最后绘制的表面遮挡了先绘制的表面,该算法称为深度排序算法(画家算法)
深度缓冲器算法
算法描述
- 设置帧缓冲器(fBuffer)初始值为背景色
- 确定深度缓冲器(zBuffer)的宽度、高度和初始深度。一般将初始深度置为最大深度值
- 对于多边形表面中的每一像素(x,y),计算其深度值z(x,y)
- 将z与存储在深度缓冲器中的(x,y)处的深度值zBuffer(x,y)进行比较
- 如果z(x,y)小于等于zBudder(x,y),则将此像素的颜色写入帧缓冲器fBuffer(x,y),且用z(x,y)重置zBuffer(x,y)
深度排序算法(画家算法)
原理
假定视点位于三维屏幕坐标系z轴负向的某一位置,则离视点远的表面具有较大的深度,离视点近的表面具有较小的深度。这里,三维平面多边形取所有顶点中的最大z坐标,代表该表面的深度。
算法描述
先将物体的各个表面按面的深度排序形成深度优先级表,z大者位于表头,z小者位于表尾。然后按照从表头到表尾的顺序,逐个取出多边形表面投影到屏幕上,后绘制的表面覆盖先绘制的表面,相当于消除了隐藏面
- 按z从大到小的顺序对所有多边形排序
- 解决z方向上出现的多边形深度二义性问题,必要时对多边形进行分割,获得一个确定的深度优先级
- 按z从大到小的顺序,依次光栅化每一个多边形