各种物体模型或虚拟环境的设计都是基于实体和曲线/曲面等造型技术。

若仅从计算机图形显示技术的角度来看,首先要按照物体的几何数据关系所对应的数学函数来选择造型模型的数据结构,然后将造型模型中的参数通过投影变换、裁剪、消隐、光照等过程显示出来。

线框模型

只用顶点和棱边表示物体,它没有面的信息,不能表述内部和外部,拓扑关系不明,也无法进行剖切、消隐、光照等。

表面模型

包括两种,一种是自由曲线/曲面造型,是由模拟物体或现象形状的数学模型插值生成的模型(如汽车、飞机的外形) ;另一种是多边形网格模型,由物体表面的采样点连接成多边形面片模型,通常用于表达复制场景对象表面(如地形起伏)

实体模型

最完善的模型定义,它能够表达全部的形状信息,如物体位置、面积、长度、体积、拓扑关联等,同时也定义了物体的并、交、差集合运算和欧拉运算等。

造型方法概述

有效实体的必备性质如下:
(1)刚性(形状不变性)。
(2)具有封闭的边界,将空间划分为内部和外部两部分。
(3)内部连通。
(4)占据有效的空间。
(5)经过集合运算后,仍然是有效的实体。
实际应用中,综合运用各类造型方法生成复杂的三维场景表达。

实体造型方法

边界表示-多边形网格表示

边界表示思想:
用许多简单的元素如三角形表示形状,而不是用少得多的但是更复杂\更精确的元素来表示形状。

边界表示模型是一种采用描述形体表面方法的几何表示模型, Boundary representations (B-reps)
一个形体一般可以通过其边界拆成一些有界的“面”或“小片”的子集来表示,而每一个面又可以通过其边界的边和顶点来表示

拆分+组装是描述实体最常用的方法

实体的边界需要满足以下条件:
(1)每条邻边必须要有两个已知坐标的端点
(2)每条边只能被两个面共享。
(3)每个顶点至少被三个面或三个边所共享。

边界表示的优点:
能够显式表示形体边界,绘制时能快速计算法向和光照效果,算法简单;在不改变拓扑关系的前提下便于局部几何变换;便于多个形体做并、交、差等集合运算;可用欧拉公式判断实体的有效正则性。

欧拉公式:顶点数-棱长数+表面数=2

多边形网格表示法

多边形网格表示法是目前最主流的三维模型表示方法,其基本思想是通过许多简单的多边形面片来表示三维模型

由多边形彼此相接构成的网格:
多边形称为网格的面,多边形顶点也称为网格的顶点
一般要求两张相邻面的公共边完全相同,即不能出现某一面的一个顶点在另一面的边中间

图形学表示一大类实体模型的标准方法
实体模型:立方体、四面体、球面、锥面

多边形网格的类型

实体:多边形网格形成一个封闭的空间区域
表面:不形成空间封闭区域,表示一个无限薄的曲面
两者都称为多边形网格(polygonalmesh),有时简称为网格

网格的性质

实体:如果网格形成一个封闭的有界区域
连通性:如果任两个顶点间存在由边构成的连续路径
简单性:表示一个实体,且没有孔洞,即可通过连续几何形变到球面
平面性:如果所有面都是平面多边形
●有些算法对平面多边形更有效
●因此三角网格的实用性更加凸显

边界表示

按照体一面一环一边一点的层次,详细记录了构成形体所有几何元素的几何信息及其相互连接的拓扑关系
边界表示的一个重要特点是在该表示法中,描述形体的信息包括几何信息(Geometry) 和拓扑信息(Topology)两个方面
-几何信息:指形体在欧氏空间中的位置和大小
-拓扑信息:是形体各分量的数目及其相互之间的连接关系

9种拓扑关系

android opengl 正方体 opengl画实体_数据结构

几何与拓扑

几何:顶点的位置
拓扑:顶点和边的连接关系
例如:多边形就是顶点的有序列表,其中每条边以相邻的顶点为端点,同时最后一个顶点与第一个顶点连接
即使几何信息改变了,拓扑信息可以保持不变.

边界表示的数据结构

边界表示法的数据结构有四种方法:直接表示、顶点表指针表示、边表指针表示、翼边表示、半边表示

直接表示

以面为基础,按照体、面、顶点坐标的树结构层次组织元素数据

android opengl 正方体 opengl画实体_边界表示_02


android opengl 正方体 opengl画实体_边界表示_03

顶点表指针表示

以顶点/坐标和面/顶点序列两张关系表表示
把几何位置放在一个数组中
构造面时,利用指向各顶点的索引

android opengl 正方体 opengl画实体_集合运算_04


{0, 1, 2}顺序的顶点与{1,2, 0}顺序的顶点定义等价{2, 1, 0}则不同

两种方式定义的多边形分别称为多边形的内与外

利用右手法则判别

OpenGL可把多边形的内外面用完全不同的模式处理

边表指针表示

以边/顶点,顶点/坐标,面/边三张关系表表示;

android opengl 正方体 opengl画实体_集合运算_05

如何得到网格

直接对网格进行造型是非常困难的
存在实体的扫描
-得到实体上的点,然后采用一定的算法形成网格
几何造型软件可以把曲面转化为近似的网格表示
任何表面都可以用多边形网格逼近到任意光滑精度,这称为多边形网格的完备性

构建方法:
通过编写程序来生成模型
使用建模程序
使用三维激光扫描仪对真实模型进行不同点采样
根据同一个物体的一幅或多幅图像进行重建

多边形网格的优势

容易表示
-数据结构简单
容易变换
性质简单
-每个面只有一个法向量
-容易确定内外侧
容易绘制
-多边形填充
-纹理映射

多边形网格的缺点

1.难以编辑:不能同时移动多个顶点
2.并非总是非常紧凑的描述:需要很多平面元素才能使表面光滑
3-构造缓慢:需要很长时间进行构建

多边形网格是OpenGL接受其它表示的中转站
利用曲面造型,曲面需要被多边形网格逼近,OpenGL才能显示曲面

构造表示(CSG)

实体是内部属性单一的三维物体。实体造型就是通过各种方法与运算生成一个封闭实体的过程。

构造实体几何法

构造实体几何法(Constructed Solid Geometry,简称CSG)是一种十分常用的实体构造方法。其基本思想是将简单实体(又称体素)通过集合运算组合成所需要的物体。

通过对体素定义运算而得到新的形体的一种表示方法。
体素也可以由多个半空间的集合运算来表示,半空间指一个无限大平面将三维空间分成两个无限的区域。
由多个基本体素通过集合运算得到的实体也可以作为构造更复杂形体的体素。

体素可以是立方体、圆柱、圆锥等,也可以是半空间,其运算为变换或正则集合运算并、交、差。

CSG表示可以看成是一棵有序的二叉树。
-其终端节点或是体素、或是形体变换参数。
-非终端结点或是正则的集合运算,或是变换(平移和/或旋转)操作,这种运算或变换只对其紧接着的子结点(子形体)起作用。

优点

-数据结构比较简单,内部数据的管理比较容易;
-控制性好:形状比较容易修改。

缺点

-对形体的表示受体素的种类和对体素操作的种类的限制(CSG方法表示形体的覆盖域有较大的局限性)。
-形体的边界几何元素(点、边、面)是隐含地表示在CSG中,故显示与绘制CsG表示的形体需要较长的时间。
-表示不唯一

推移扫描表示法

将物体A沿着轨迹P推移得到物体B,称B为sweep体。
平移sweep--将一个二维区域沿着一个矢量方向推移
旋转sweep--将一个二维区域绕旋转轴旋转一周
广义sweep
-任意物体沿着任意轨迹推移
-推移过程中物体可以变形

优点

-容易构建,适合做图形输入手段

缺点

-绘制需要前处理:不能直接获取形体的边界信息
-表示形体的覆盖域有限

细分表示

细分表示(Space-partitioning) :将形体按某种规则分解为小的更易于描述的部分,每一小部分又可分为更小的部分,这种分解过程直至每一小部分都能够直接描述为止。

人们使用它或许是因为原始数据已是以这种形式存储或原始数据容易转换成这种表示。
在绘制CsG模型时,可以把CSG表示转换成一个中间的含有体素的数据结构,然后从这个数据结构进行光线跟踪绘制。

枚举

形体空间细分为小的均匀的立方体单元

用三维数组C[I][J][K]表示物体,数组中的元素与单位小立方体一一对应

-当C[I][J][K] = 1时,表示对应的小立方体被物体占据

-当C[I][J][K] = 0时,表示对应的小立方体没有被物体占据

android opengl 正方体 opengl画实体_集合运算_06

八叉树

八叉树的表示应用三维形体的分解,它对一个外接立方体的形体进行前后、左右、上下等部分八个小立方体,如果小立方体单元为满或为空,表示该立方体完全在形体中或完全不在形体中,则其停止分解;对部分形体占有的小立方体需进一步分解为八个子立方体,直至所有小立方体单元要么全部满,要么全部空,或已分解到规定的分解精度为止。

android opengl 正方体 opengl画实体_opengl_07

八叉树表示:
-对空间位置枚举表示的空间分割方法作了改进:均匀分割 一> 自适应分割

八叉树建立过程
-八叉树的根节点对应整个物体空间
-如果它完全被物体占据,将该节点标记为F(Full),算法结束;
-如果它内部没有物体,将该节点标记为E(Empty),算法结束;
-如果它被物体部分占据,将该节点标记为P(Partial),并将它分割成8个子立方体,对每一个子立方体进行同样的处理

单元细分表示

对空间位置枚举表示的空间分割方法作了改进:单一体素 一>多种体素

-三种空间分割方法的比较.

方法

特点

空间位置枚举表示

同样大小立方体粘合在一起表示物体

八叉树表示

不同大小的立方体粘合在一起表示物体

单元细分表示

多种体素粘合在一起表示物体

细分表示优点

数据结构简单,表示范围较广,可以表示任何物体
较好的控制性:容易实现物体间的交、并、差集合运算
消隐:八叉树表示可简化隐藏线(或面)的消除,因为其中形体上各元素已按空间位置排成了一定的顺序

细分表示缺点

占用大量的存储空间
没有边界信息,不适于图形显示

建模路线

两条路线:
基于体的方法-构造表示
基于面的方法-曲线曲面-边界表示

基于体的路线在CAD领域常用到,强调的是一种与实际加工过程相似的方法,如切\钻等-实体造型研究如何在计算机内定义\表示一个三维物体

基于面的路线没有体的概念,它认为所有物体都是由表面组成。它允许对物体表面直接操纵一曲面造型研究在计算机内如何描述一张曲面,如何对其形状进行交互式显示与控制。

曲面造型与实体造型相互支持相互补充。
光有曲面造型,无法计算和分析物体的许多整体性质如体积\重心;光有实体造型,无法准确地描述和控制物体的外部形状。