计算机图形学 第9章 自由曲线曲面

第8章不学

目录

# 学习目标

# 消隐

## 定义

1.线框模型

2.表面模型

 3.实体模型

双表结构

定义三维顶点类

 定义表面类

读入立方体的点表

 读入立方体的面表

 1.柏拉图多面体

柏拉图多面体对偶性

 正四面体

 正八面体

正十二面体

黄金数

黄金矩形

黄金三角形

 光滑物体

球面

 圆柱面

圆锥面

 圆环面

隐线算法(考) ⭐⭐⭐

凸多面体消隐算法

 曲面体消隐算法

隐面算法

深度缓冲器算法 / Z-Buffer算法

 深度排序算法/画家算法



# 学习目标

  • - 了解物体的三种模型表示方法
  •  - 掌握柏拉图多面体的建模方法
  • - 掌握常见曲面体的建模方法
  • - 熟练掌握凸多面体的背面剔除算法
  • - 熟练掌握曲面体的背面剔除算法
  • - 熟练掌握深度缓冲算法
  • - 熟练掌握深度排序算法

# 消隐

## 定义


要生成具有真实感的图形,就要在给定视点和视线方向之后,决定场景中物体哪些线段或表面是可见的,哪些线段或表面是不可见的。这一问题习惯上称为消除隐藏线和消除隐藏面,简称为消隐

我们常见的三维物体,这些物体可以采用线框模型描述,也可以采用表面模型实体模型描述。无论使用哪种模型描述,都需要为物体建立顶点表、边表和面表构成的数据结构

建立三维用户坐标系为右手系Oxyzx轴水平向右为正,y轴垂直向上为正,z轴从纸面指向观察者。

几何信息:描述几何元素空间位置的信息。

拓扑信息:描述几何元素之间相互连接关系的信息。

    描述一个物体不仅需要几何信息的描述而且需要拓扑信息的描述。因为只有几何信息的描述,在表示上存在不惟一性

1.线框模型

线框模型(wireframe model)是计算机图形学中表示物体最早使用的模型,而且一直在使用。

线框模型只是用几何体的边线来表示物体的外形,没有表面和体积等概念

线框模型是表面模型和实体模型的基础,只使用顶点表边表两个数据结构就可以描述。图9-5所示为立方体线框模型。

  • 优点:可以产生任意方向视图,视图间保持正确的投影关系,常用于绘制三视图或斜轴测图等。
  • 缺点:所有棱边全部绘制出来,容易产生二义性,如图9-6所示
     

2.表面模型

表面模型(surface model)是利用物体的外表面来构造模型,就如同在线框模型上蒙上了一层外皮,使物体具有了一层外表。

表面模型仍缺乏体积的概念,是一个物体的空壳。与线框模型相比,表面模型增加了一个面表,用以记录边面之间的拓扑关系。

  • 优点:可以对表面进行平面着色或光滑着色、可以为物体添加光照或纹理等。
  • 缺点:无法进行实体之间的并交叉运算。

9-7表示的是双三次Bezier曲面的网格模型。

9-8表示的是双三次Bezier曲面的表面模型。

在图9-8中,Bezier曲面没有围成一个封闭的空间,只是一张很薄的面片,其表面无内外之分,哪面是正面、哪面是反面,没有给出明确的定义。

 

 3.实体模型

实体模型solid model)是在封闭的表面模型内部进行了填充,有了如体积和重量等特性,能反映立体的真实性,立体才具有的概念。它的内部和外部的概念,定义了在表面模型的哪一侧存在实体。它的表面有正面和反面之分。如图9-9所示。

有向棱边隐含地表示表面的外法向量方向。常用右手准则定义,拓扑合法的物体在相邻两个面的公共边界上,棱边的方向正好相反,如图9-10所示。

    与表面模型数据结构的差异。将面表的顶点索引号按照从物体外部观察的逆时针方向的顺序排列,可确切地分清体内体外。

   与线框模型、表面模型的区别。记录了顶点的信息,以及线、面、体的拓扑信息。

   实体模型常采用集合论中的并、交、差等运算来构造复杂实体 。

一般情况下,使用顶点表、边表和面表3张表可以方便地检索到物体的任意一个顶点、任意一条边和任意一个表面,而且数据结构清晰。

    实际建模中,实体模型采用了有向棱边,相邻两个表面上共享的一条棱边的定义方向截然相反,导致无法确定棱边的顶点连接顺序,因而放弃边表,仅使用顶点表和面表来表示物体的几何模型。

且面表中按照表面法矢量向外的方向遍历多边形顶点索引号,表明处理的是物体的正面。仅用顶点表和面表的缺点是物体的每条边被重复绘制2次。

双表结构

 9-4根据立方体的展开图重新设计了面表结构。

定义三维顶点类

如图9-12所示,包括顶点的三维坐标(x,y,z)

 定义表面类

如图9-13,表面类包括表面的顶点数和表面的顶点索引号。

SetNum()用于动态设置表面的顶点数,常用于处理3个顶点的三角形面片或4个顶点的四边形面片。

读入立方体的点表

在程序中定义ReadVertex()函数读入物体的顶点表如图9-14

 读入立方体的面表

在程序中定义ReadFace()函数读入物体的面表,如图9-15

 1.柏拉图多面体

定义:

正多面体是由若干个全等的正多边形围成,并且相交在各个顶点上的棱边数都相等的凸多面体

正多面体只有正四面体、正六面体、正八面体、正十二面体和正二十面体五种,如图9-16 所示。表9-5给出了其几何信息。这五种多面体统称为柏拉图多面体。柏拉图多面体属于凸多面体

在几何学中,若一种多面体的每个顶点均能对应到另一种多面体上的每个面的中心,二者互称为对偶多面体。(相互的关系)

柏拉图多面体对偶性

 

 正四面体

建立正四面体的伴随立方体可以很容易地确定正四面体的顶点表和面表。

 

 

 正八面体

 

 

正十二面体

 

 

 

 

 

 

黄金数

把一条线段分割为两部分,使其中一部分与全长之比等于另一部分与这部分之比。其比值是一个无理数,取其前三位数字的近似值是0.618。由于按此比例设计的造型十分美丽,0.618被称为黄金分割数

黄金矩形

金矩形分割为两块,其中一块为正方形,另一块为黄金为矩形,可以递归划分。

黄金三角形

 

 

 光滑物体

多面体是由平面多边形组成的物体,多面体没有方程表示形式,用顶点表和面表直接给出数据结构定义。

        对于球、圆柱、圆锥、圆环等光滑物体,表面有确定的参数方程表示形式。

绘制光滑物体时,需要进行网格划分,即把光滑曲面离散为平面多边形表示,这些多边形一般为平面四边形或三角形网格。

光滑物体的网格顶点表和面表使用物体的参数方程离散计算后得到。

球面

 

 

 

 

 圆柱面

假定圆柱的中心轴与y轴重合,横截面是半径为r的圆,圆柱的高度沿着y轴方向从0拉伸到h,三维坐标系原点O位于底面中心 ,如图9-35所示。

 

 适当加大周向和纵向划分的网格数,圆柱面网格模型趋向光滑。

圆锥面

假定圆锥的中心轴与y轴重合,横截面的最大半径为r,最小半径为0,圆锥的高度沿着y轴方向从0拉伸到h,三维坐标系原点O位于底面中心 ,如图9-41所示。

 圆锥侧面的离散化表示如图9-42所示,侧面使用三角形网格和四边形网格逼近 。

圆锥底面使用三角形网格逼近,如图9-43所示。

 

 圆环面

 

 

 适当加大周向和纵向划分的网格数,圆环面网格模型趋向光滑。


根据消隐方法的不同,消隐算法可分为两类

(1隐线算法。用于消除物体上不可见的边界线。隐线算法主要是针对线框模型提出的,它只要求画出物体的各可见棱边,如图9-51所示。

2隐面算法。用于消除物体上不可见的表面。隐面算法主要是针对表面模型提出的,一般不绘制物体的可见棱边,只使用指定颜色填充物体的各可见表面,如图9-52所示。

计算机图形学的创始人Sutherland根据消隐空间的不同,将消隐算法分为3类:

1)物体空间法。物体空间消隐算法主要在三维观察空间中完成。根据模型的几何关系来判断哪些表面可见,哪些表面不可见。

2)图像空间法。图像空间消隐算法主要在物体投影后的二维图像空间中利用帧缓冲信息确定哪些表面遮挡了其它表面。图像空间法受限于显示器的分辨率。

3)物像空间法。在描述物体的三维观察空间和二维图像空间中同时进行消隐。

隐线算法(考) ⭐⭐⭐

凸多面体消隐算法

 很好理解。

 

立方体消隐前的透视变换图如图9-54所示,画出了全部6个表面的线框;消隐后的透视变换图如图9-55所示,只画出可见的表面棱边。 

 

 曲面体消隐算法

曲面体可以采用有限单元法划分为若干个小曲面区域。常采用四边形平面片或三角形平面片来逼近曲面体。

      消隐主要是确定各四边形平面片或三角形平面片的可见性,与凸多面体消隐类似,即用外法矢量和视矢量的数量积来进行可见性检测。

 

 

 

隐面算法

从视点的角度观察物体的表面,离视点近的表面的投影遮挡了离视点远的表面的投影,屏幕上的绘制结果为所有可见表面最终投影的集合。

常用的消隐有两种:深度缓冲器算法深度排序算法

深度缓冲器算法 / Z-Buffer算法(考) ⭐⭐⭐

该算法是计算机图形学中最主要的消隐算法。!!!

算法原理

深度缓冲器算法于1974年由Catmull提出,属于图像空间消隐算法。在物空间内不对物体表面的可见性进行检测,在像空间中根据每个像素的深度值确定最终绘制的物体表面上各个像素的颜色。也称为Z-Buffer算法

 算法描述

深度缓存(Z-buffer)消隐算法包括哪些步骤?

深度缓存(Z-buffer)算法是一种典型的、简单的图象空间面消隐算法。

该算法需要一个深度缓存数组ZB,此外还需要一个颜色属性数组CB ,它们的大小与屏幕上像素点的个数相同。

Z-buffer算法的步骤如下

(1)初始化ZB和CB,使得ZB(i,j)=Zmax,CB(i,j)=背景色,i=1,…, m; j=1,…,n;

(2)对多边形P,计算它在点(i,j)处的深度值zi,j,

(3)若zi,j< ZB(i,j),则ZB(i,j)=zi,j,CB(i,j)=多边形P的颜色;

(4)对每个多边形重复(2)、(3)两步,最终在CB中存放的就是消隐后的图形。

这个算法的关键在第(2)步,要尽快判断出哪些点落在一个多边形内,并尽快求出一个点的深度值。这里需要应用多边形点与点之间的相关性,包括水平相关性和垂直相关性。

也可以参考这个文章:Z缓冲区消隐算法——计算机图形学笔记 - 知乎 (zhihu.com)icon-default.png?t=N0U7https://zhuanlan.zhihu.com/p/577912693

计算深度

若多边形的平面方程已知,一般采用增量法计算扫描线上每一像素点的深度值。

当立方体旋转到图9-65所示的位置时,六个表面都不与投影面xOy面平行,这时需要根据每个表面的平面方程计算多边形内各个像素点的深度值。

 

 

 

 用深度d初始化宽度为w、高度为h的深度缓冲器的代码如下。

void CZBuffer::InitDeepBuffer(int w,int h,double d)
//初始化深度缓冲器
{
          zBuffer=new double *[ w];
	for(int i=0;i<w;i++)
		zBuffer[i]=new double[h];
	for(int i=0;i< w;i++)
		for(int j=0;j< h;j++)
			zBuffer[i][j]=double(d); 
}

一般将物体的回转中心放置在自定义的屏幕坐标系原点,也即位于屏幕中心。为了避免深度缓冲区数组zBuffer下标的索引号为负值,二维深度缓冲区数组采用

zBuffer[xs+w/2][ys+h/2]  进行匹配。

 真实感场景中一般绘制的是物体的透视投影,在第6章中公式(6-55)仅计算了屏幕坐标系的二维坐标。

使用深度缓冲器算法绘制物体的透视图时,需要在透视变换后保留物体的深度值。

设视域四棱台的近剪切面Near远剪切面Far

9-68中,观察坐标系中从视点出发的视线会聚于视点。屏幕坐标系中,视线被映射为平行线。

 

 深度排序算法/画家算法

    深度排序算法是同时运用物体空间和图像空间的消隐算法

在物体空间中将表面按深度优先级排序,然后在图像空间中,由深度最大的表面开始,依次绘制各个表面。这种消隐算法通常被称为画家算法

    深度排序算法的原理是:

  • 先把屏幕置成背景色,
  • 再把物体的各个面按其离视点的远近排序形成深度优先级表,离视点远者位于表头,离视点近者位于表尾。
  • 然后按照从表头到表尾的顺序绘制各个表面,后画的表面颜色取代先画的表面颜色,相当于消除了隐藏面。

    在算法上需要构造顶点表、面表来实现。 

  

深度优先级排序算法的难点在于确定物体的深度优先级。

对于图 9-72 所示的 4 个条相互叠压(称为叠压条),每个条有一个独立的深度,而且 4 个条的深度彼此不同,则可以直接建立一个确定的深度优先级表。
对于图 9-73 4 个条相互交叉(称为交叉条),每个条至少有两个深度,不能简单地建立深度优先级表。
  1. 解决方法是

沿着图中虚线循环地分割每个条,直至最终可建立确定的深度优先级表,

  1. 另一种解决方法是

使用深度缓冲器算法直接绘制交叉条。使用深度排序算法绘制的叠压条如图9-74所示。使用深度缓冲算法绘制的交叉条如图9-75所示。

猜你喜欢

转载自blog.csdn.net/CSDN_YJX/article/details/128822452
今日推荐