Upload
others
View
13
Download
0
Embed Size (px)
Citation preview
计算机图形学
童 伟 华 管理科研楼1205室 E-mail: [email protected]
中国科学技术大学 数学科学学院 http://math.ustc.edu.cn/
2018-2019年度第二学期 00106501
3
多边形网格模型 由多边形彼此相接构成的网格
多边形称为网格的面,多边形的顶点也称为网格的顶点
一般要求两张相邻面的公共边完全相同,即不能出现某一面的一个顶点在另一面的边中间
数学的语言:单纯复形( simplicial complex,图论或代数拓扑)
计算机图学事实上的工业标准,几乎所有的图形加速卡都支持网格模型的硬件加速绘制;在计算机辅助设计或实体造型中,可用于实体模型的边界表示
5
OpenGL与多边形网格 多边形网格是OpenGL中基本的图元类型,支持硬件
加速
在几何建模中,还有许多其它的表示方法 参数曲面(Parametric Surface)
隐式曲面(Implicit Surface )
细分曲面(Subdivision Surface)
多边形网格是OpenGL接受其它表示的中转站 利用多边形网格逼近其它表示形式的曲面,然后利用OpenGL绘制曲面
例如:球面
18
Euler公式 对于简单多面体:
V + F – E =2 顶点数:V, 面数: F, 边数: E
例如,立方体:V=8, F=6, E=12
如果多面体不是简单的,在面上有H个洞,通过多面体的洞有G个,那么 V + F – E = 2 + H – 2G
21
网格的性质 给定一个由顶点、法向和面表组成的网格,那么它所
表示的对象是什么呢?下列是感兴趣的性质: 实体:如果网格形成一个封闭的有界区域
连通性:如果任两个顶点间存在着由边构造的连续路径
简单性:表示一个实体,而且没有洞,即可以没有粘贴变形到球面
平面性:如果所有面都是平面多边形
有些算法对平面多边形更有效
因此三角网格非常实用
23
性质的检测与应用 有些性质比较容易检测,即存在简单算法,而有些性
质则比较难以判断 例如判断网格是否表示实体不是一件简单的事情
网格可以具有上述性质中的某几个或全部 关键在于用网格做什么
如果网格用来表示用某些材料构成的物理模型,那么就需要它至少是连通和实体
从艺术角度考虑,网格完全可以表示非物理的实体
26
如何得到网格 直接对网格进行造型是非常困难的
常用的方法: 利用三维扫描设备,获取点云数据,进行曲面重建,获得网格模型
利用几何造型软件设计模型,譬如NURBS,CSG等,然后将曲面转化为为近似的网格表示
任何表面都可以用多边形网格逼近到任意光滑精度,这称为多边形网格的完备性
曲面重建
网格的数据结构 网格的用途
Rendering Triangle trip
Geometry/topological queries What are the vertices of face #k?
Are vertices #i and #j adjacent?
Which faces are adjacent face #k?
Geometry/topological operations Remove/add a vertex/face
Mesh simplification
Vertex split, edge collapse
27
网格的存储 Storage of generic meshes
Hard to implement efficiently
Assume Triangular
Orientable
Manifold
How “good” is a data structure? Space complexity
Time
Time to construct - preprocessing
Time to answer a query
Time to perform an operation (update the data structure)
Trade-off between time and space
Redundancy 28
网格的定义 Position(Geometry information)
Vertex coordinates
Connectivity(Topological information) How do vertices connected?
List of Edge
Vertex-Edge
Vertex-Face
Combined
29
网格的定义 Surface & material properties
Material color
Ambient, hightlight coefficients
Texture coordinates
BRDF, BTF
Rendering properties Lighting
Normals
Rendering modes
30
常用的网格文件类型 General used mesh files
Wavefront OBJ (*.obj)
OFF (*.off)
PLY (*.ply, *.ply2)
STL (*.stl)
3D Max (*.max, *.3ds)
VRML(*.vrl)
Inventor (*.iv)
Storage Text – (Recommended)
Binary
31
Wavefront OBJ File Format Vertices
Start with char ‘v’ (x,y,z) coordinates
Faces Start with char ‘f’ Indices of its vertices in the file
Other properties Normal, texture coordinates, material, etc.
32
v 1.0 0.0 0.0 v 0.0 1.0 0.0 v 0.0 -1.0 0.0 v 0.0 0.0 1.0
f 1 2 3 f 1 4 2 f 3 2 4 f 1 3 4
面列表 List of vertices
Position coordinates
List of faces Triplets of pointers to face vertices (c1,c2,c3)
Queries: What are the vertices of face #3? Answered in O(1) - checking third triplet
Are vertices i and j adjacent? A pass over all faces is necessary – NOT GOOD
33
面列表 Pros:
Convenient and efficient (memory wise)
Can represent non-manifold meshes
Cons: Too simple - not enough information on relations between vertices &
faces
35
邻接矩阵 Adjacency Matrix
View mesh as connected graph
Given n vertices build n*n matrix of adjacency information Entry (i,j) is TRUE value if vertices i and j are adjacent
Geometric info list of vertex coordinates
Add faces list of triplets of vertex indices (v1,v2,v3)
36
邻接矩阵 Adjacency Matrix – Queries
What are the vertices of face #3? O(1) – checking third triplet of faces
Are vertices i and j adjacent? O(1) - checking adjacency matrix at location (i,j).
Which faces are adjacent to vertex j? Full pass on all faces is necessary
38
邻接矩阵 Pros:
Information on vertices adjacency
Stores non-manifold meshes
Cons: Connects faces to their vertices, BUT NO connection between vertex and
its face
39
双向连接边列表 Doubly-Connected Edge List(DCEL)
Record for each face, edge and vertex: Geometric information
Topological information
Attribute information
Half-Edge Structure
40
双向连接边列表 Pros
All queries in O(1) time
All operations are O(1) (usually)
Cons Represents only manifold meshes
45
半边数据结构 Halfedge Based Data Structure
基本思想: splitting each (unoriented) edge into two oriented halfedges
46
常用查看网格的软件 Commercial tools
Maya, 3ds Max et.al.
https://www.autodesk.com/products/maya/
3D Exploration
http://www.xdsoft.com/explorer/
MeshLab
http://www.meshlab.com/
User Written Viewers Too many on the internet
47
49
OpenGL 用每个多边形的各顶点的几何位置定义多边形
由此可有如下的OpenGL代码 glBegin(GL_POLYGON); glVertex3f(x1,y1,z1); glVertex3f(x6,y6,z6); glVertex3f(x8,y8,z8); glVertex3f(x7,y7,z7); glEnd();
无效且无结构 考虑移动一个顶点时会导致何种复杂操作
50
多边形的内外面 对于OpenGL而言,{v1,v6,v8,v7}顺
序的顶点与{v6,v8,v7,v1}顺序的顶点定义等价的多边形,但是{v7,v8,v6,v1}则定义不同的多边形
上述两种方式定义的多边形分别称为多边形的内与外
利用右手法则判别
OpenGL可以把多边形的内外面用完全不同的模式处理
51
顶点表 把几何位置放在一个数组中
用各顶点构造边时,利用指向各顶点的指针
引入多边形表
x1, y1, z1
x2, y2, z2
x3, y3, z3
x4, y4, z4
x5, y5, z5
x6, y6, z6
x7, y7, z7
x8, y8, z8
v1 v6 v8 v7
v6 v5 v8
P1 P2 P3 P4 P5
拓朴
几何
52
边表
v6
e1 v8
v7 v1
v4
v5
v3
v2
e2 e3
e4
e5
e10
e9 e8
e7
e6
e11
e12
x1, y1, z1
x2, y2, z2
x3, y3, z3
x4, y4, z4
x5, y5, z5
x6, y6, z6
x7, y7, z7
x8, y8, z8
e1 e2 e3 e4 e5 e6 e7 e8 e9 e10 e11e12
v1 v6
注意:没有表示出来多边形
53
立方体 为立方体旋转程序建立彩色立方体
定义顶点和颜色的全局数组
GLdouble vertices[][3]=
{{-1.0, -1.0, -1.0},{1.0,-1.0,-1.0},{1.0,1.0,-1.0}, {-1.0,1.0,-1.0},{-1.0,-1.0,1.0}, {1.0,1.0,1.0},{1.0,1.0,1.0}, {-1.0,1.0,1.0}};
GLdouble colors[][3]={{0.0,0.0,0.0},{1.0,0.0,0.0},
{1.0,1.0,0.0},{0.0,1.0,0.0},{0.0,0.0,1.0},{1.0,0.0,1.0}, {1.0,1.0,1.0},{0.0,1.0,1.0}};
0
2
4 3
1
6 5
7
54
根据指标列表绘制多边形 根据在数组vertices中的一组指标绘制一个四边形,
颜色对应于第一个指标 void polygon(int a, int b, int c, int d) { glBegin(GL_POLYGON); glColor3dv(colors[a]); glVertex3dv(vertices[a]); glVertex3dv(vertices[b]); glVertex3dv(vertices[c]); glVertex3dv(vertices[d]); glEnd(); }
55
利用表面绘制立方体 void colorcube() { polygon(0,3,2,1); polygon(2,3,7,6); polygon(0,4,7,3); polygon(1,2,6,5); polygon(4,5,6,7); polygon(0,1,5,4); } 注意顶点的顺序保证表面的法向指向正确的方向,即立方体的外侧
0
2
4
3
1
6 5
7
56
效率 这种方法的缺陷在于为了在应用程序中建立模型,需
要进行很多次函数调用才能绘制立方体
通过表面绘制立方体,最直接的方式需要 6个glBegin和6个glEnd
6个glColor
24个glVertex
如果应用纹理和光照的话还会更多
57
顶点数组 OpenGL提供了一种功能,称为顶点数组(vertex
arrays),利用这种功能可以存贮数组数据
支持六种类型的数组 顶点
RGB颜色
索引颜色
法向
纹理坐标
边标志
我们将只需要RGB颜色与顶点数组
58
初始化 为了利用颜色与顶点数据,首先激活相应功能
glEnableClientState(GL_COLOR_ARRAY); glEnableClientState(GL_VERTEX_ARRAY);
标识数组的位置 glVertexPointer(3, GL_DOUBLE, 0, vertices);
glColorPointer(3, GL_DOUBLE, 0, colors);
三维数组
存贮为双精度数
数据是连接存放的
数据所在的数组
59
根据指标对应到面 构造表面指标的数组 GLubyte cubeIndices[24]={0,3,2,1,2,3,7,6,
0,4,7,3,1,2,6,5,4,5,6,7,0,1,5,4};
每四个相邻的指标描述立方体一个表面 利用glDrawElements取代在显示回调函数中所有的glVertex和glColor进行绘制
60
绘制立方体 方法一 for(i=0; i<6; i++) glDrawElements(GL_POLYGON, 4, GL_UNSIGNED_BYTE,
&cubeIndices[4*i]);
方法二 glDrawElements(GL_QUADS,24, GL_UNSIGNED_BYTE,
cubeIndices);
绘制对象类型
指标的数目 指标数据
的开始
指标数据的格式
只需要一次函数调用就绘制出来立方体!!!
61
顶点法向与面法向 在提供多边形网格的顶点及其相连信息的同时,应当
同时给出每个面的法向
在实际使用时,更有优势的方法是把法向与顶点关联在一起,即点法向 多边形的裁剪算法
明暗处理算法
OpenGL采用的是点法向
63
法向计算 顶点可以由用户输入,但是法向计算不是很直接
有时候法向可以来自于更数学的模型,例如曲面被网格逼近时,可以用原来曲面的法向作为所需要的法向
如果需要把某一面显示为平坦的效果,那么只要得到该面所在平面的法向就可以了
假设某面上连续三点为V1, V2, V3, 那么n = (V1 – V2) × (V3 – V2)就是所需要的法向 必要时进行单位化
如果多边形不是完全共面,那么所采用的法向不具代表性(因此:不建议使用不共面的多边形,OpenGL不验证共面性)
64
Martin Newell方法 假设各顶点依次为(xi, yi, zi), i = 0, 1, …, N – 1. n = (nx,
ny, nz)为所需要确定的法向,则
∑
∑
∑
−
=
−
=
−
=
+−=
+−=
+−=
1
0)(next)(next
1
0)(next)(next
1
0)(next)(next
))((
))((
))((
N
iiiiiz
N
iiiiiy
N
iiiiix
yyxxn
xxzzn
zzyyn
65
多面体 多面体是由简单表面(平面)构造的连通网格,其形
成一个有限体积的封闭实体 多面体的每边都有两个面共享
每个顶点至少有三条边
两个面之间要么无交,要么只在公共边或顶点处相交
四面体为多面体,环面为多面体当且仅当各面为平面
66
正多面体 如果多面体的所有面是全等的,而且每个都是正多边
形,那么称之为正多面体
可以证明只有五种正多面体,称为Plantonic体
由Planto (427—347BC)给出,但在此之前就发现了十二面体玩具