第二讲-几何建模
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
HalfEdge e;
e e->opp()
e->start() = e->opp()->end();
e->start()
class HalfEdge { HalfEdge *opp; Vertex *end; Face *left; HalfEdge *next; };
HalfEdge e;
e->left()
Non-Manifold
Closed Manifold
Open Manifold
拓扑
v = 12 f = 14 e = 25 c=1 g=0 b=1 图的亏格(genus):handle的数目。 在沿其撕裂后,能够使图保持连通 的封闭路径的最大数目的一半
Euler-Poincare 公式 v+f-e = 2(c-g)-b
• • • • 将一个隐式的曲面转换为三角网格 在3D网格(grid)上定义的隐式曲面 在每个立方体(cube)中根据8个顶点的标量值来确定重构曲面 一般用于医学数据
点云
深度图像
网格(Mesh)
– – – – – 图形学中最常用的表达 简单 可表达复杂形状 图形硬件支持 一般为三角网格
为什么是三角网格
网格的数据结构是否优秀
• 构建数据结构的时间复杂度
• 进行一个查询操作的时间复杂度 • 进行一个网格编辑操作的时间复杂度(更 新数据结构) • 空间复杂度
数据结构举例
• 面列表( List of faces)
• 邻接矩阵(Adjacency matrix) • 半边结构(Half-edge)
一个实际的文件例子 .obj文件
All neighboring vertices
edge
EV EE EF
FV FE FF
All neighboring edges All neighboring faces
All neighboring vertices
face
All neighboring edges All neighboring faces
• 可高效地进行拓扑变换 • 高效地进行二元操作:交、并、差等
隐式曲面
• 隐式曲面便于表达复杂的曲面,比如水面
• 三角网格难以表达水的合并、飞溅、波浪等形变
实体建模(CSG)
• 用简单形体的二元操作来构造复杂形体
常用的建模方法
• 扫描 • 基于图像的建模方法 • 过程式建模
扫描
• 构造一个对象的三维模型需要一张或多张深度图像 • 距离扫描仪测量的是物体表面的三维坐标,并以m*n的距离网 格形式返回测量值,这个网格称作深度图像 • 如果有多张深度图像,对每张深度图像需要计算出一个刚性变 换,以与其它深度图像对齐 • 使用改进版本的ICP算法(Iterative Closest Point Alignment)来计 算合适的刚性变换,使得两张深度图像之间点对的最小二乘距 离最小
游戏时间:猜猜亏格数
网格的数据结构表达
• 网格数据的应用:
– 渲染 – 几何查询
• face #3 包括哪些顶点? • 顶点 i 和顶点 j 是否相邻? • face #7与哪些面相邻?
– 几何操作Geometry operations
• 添加或者删除一个顶点/边/面
• 大部分网格难以支持高效的上述操作 • 一般采用三角流形网格
– O(n)-遍历所有的面
邻接矩阵的优劣
• 优点
– 支持顶点之间邻接信息(VV)的高效查询 – 支持非流形网格
• 缺点
– 没有边的显式表达 – 不支持VF, VE, EV, FE, EF 的快速查询
半边结构
• 记录所有的面、边和顶点
– 几何信息 – 拓扑信息 – 附属属性
• 流行于大部分几何建模应用 • Aka DCEL(Doubly-Connected Edge List)
# Object “object01” g mesh01 # NO. points 4: v -21.7978 45.3715 0 v -21.7978 14.0897 22.1196 v -2.64162 14.0897 -11.0598 v -40.9539 14.0897 -11.0598 # NO. normals 16: vn 0.81650 0.3333 0.47140 vn 0 0.3333 -0.94281 … # NO. texute coordinates 4: vt 1 0 … # NO. faces 4: f 1/3/5 2/2/8 3/1/11 f 1/3/7 3/1/13 4/4/14 f 4/4/16 2/2/10 1/3/6 f 4/4/15 3/1/12 2/2/9
3D模型的表达
• 原始数据
– – – – 体素 点云 深度图像 多边形
• 实体模型
– – – – 八叉树 BSP树 CSG Sweep
• 曲面
– – – – 曲面网格 细分曲面 参数曲面 隐式曲面
• 高层次语义结构
– Scene Graph
Marching Cube [Lorensen& Cline ’87+ : 从体素到三角网格
遍历一个顶点的 一环半边
1. e 2. e->next()
4
6 5
7
8
…
3. e->next()->opp()
4. e->next()->opp()->next() 5. e->next()->opp()->next()->opp()
3 2 1
6. e->next()->opp()->next()->opp()->next() 7. e->next()->opp()->next()->opp()->next()->opp()
常用的半边结构实现
• CGAL
– /
• Open Mesh
–
细分曲面
• 虽然理论上可以手动地设定每一个顶点、边、面,但这 是异常繁琐的
– 一个精细的网格往往有上百万个顶点
• 理想的情况: 手工构造一个低分辨率的网格,然后逐渐 地用自动算法光滑化,添加更多细节
8. e->next()->opp()->next()->opp()->next()->opp()->next()
… until e(->next()->opp())n == e
半边结构的优劣
• 优点
– 所有查询操作时间复杂度均为O(1) – 所有的编辑操作时间复杂度均为O(1)
• 缺点
– 只能表达流形网格
细分曲线
细分曲面
NURBS
• NURBS = Non-Uniform Rational B-splines(非 均匀有理B样条)
隐式曲面
• 用定义在三维空间中的函数������(������) = 0来隐式 地表达曲面 • 容易判断一个点是否在曲面内部
– ������(������)<0 内部 – ������(������)>0 外部 – ������(������)=0 在曲面上
真实的照片
重建的模型
过程式建模
• 使用算法创建模型 • 可容易地构造多样化的模型 • 一般用来构造复杂的、规则性强的模型
– 地形 – 植物 – 建筑、城市
过程式建模
• 用一个小的数据集或规则来描述目标模型的高层次语义 信息
邻接矩阵
• 将网格视为邻接图
• 给定一个包含n个顶点的网格,构建一个 n*n 的矩阵来表达邻接关系
– 如果顶点i和顶点j邻接,那么矩阵元素 (i,j) 值为 1,否则为0
邻接矩阵举例
基于邻接矩阵的查询
• face #3包括哪些顶点?
– O(1)
• 顶点i 和 j是否相邻?
– O(1)
• 顶点i与哪些面相邻 ?
• 其它多边形网格可以容易地剖分为三角形
• 三点共面:保证平面性 • 可以容易地定义内外方向、插值操作等
网格小知识
• • 三维形体的分段线性(Piecewise linear)近似 组成成分
– 几何:顶点 – 拓扑: 边和面
• • • • •
边界边: 只与一个面相邻 正则边: 与且仅与两个面相邻 奇异边: 与多于两个面相邻 流形网格: 没有奇异边的网格 封闭网格: 没有边界边的网格
面列表实例
面列表的优劣
• 优点
– 方便而紧凑 – 可表达非流形网格
• 缺点
– 不能有效地支持点、面之间的邻接关系查询
需要查询哪些邻接关系?
Input output All neighboring vertices vertex All neighboring edges All neighboring faces abbr VV VE VF
面列表
• 顶点列表(顶点坐标:coordinates) • 面列表- 面中顶点的三元组 (v1,v2,v3) • 查询操作:
– face #3包括哪些顶点?
• O(1) - 查询第三个面的顶点三元组
– 顶点i 和顶点j是否相邻?
• O(n)-需染要求,对于几何处理还不够高效
第二讲 几何建模
内容提要
• • • • • 计算机中如何表达三维模型? 什么是网格? 网格的典型数据结构是什么? 几何建模有哪些典型方法? 几何建模有哪些典型应用?
几何建模(Geometric Modeling)
• 在计算机中表达一个真实世界的三维对象或 虚拟三维形象,就必须先描述其形状
• 几何建模
– 三维对象的表达、构造和处理的计算机算法和过 程
• 要逼真再现一个场景,需要对场景中的每一个细节进行建模
数字化几何数据
• 离散化
– 易于表达和传输 – 渲染硬件和软件的基础数据 – 大多数获取设备的输出格式 (CT, MRI, laser, …) – 大多数模拟/分析工具需要的输入
离散化的圆
e->right()
e e->opp()
e->right() = e->opp()->left();
class HalfEdge { HalfEdge *opp; Vertex *end; Face *left; HalfEdge *next; };
HalfEdge e;
e e->opp()
环左边的面遍历直到 e(->next)n = e
半边结构实例
• 一条半边指向
– 起始点 – 所属面 – Next half edge and opposite half edge – (可选) previous edge
• 一个顶点指向
– 它的某条出射半边
Halfedge
Origin
Twi n
IncidentFace
Next
Prev
e3,1
v2
移动设备上的 3D Scanning
Structure Sensor for iPad
Autodesk 123D Catch
基于图像的建模
•• •
使用计算机视觉的方法来估计每张照片的相对摄像机位置与朝向,同时得到 对象的稀疏点云表达
基本的思想:一个点的位置可以通过多张不同位置拍摄的照片确定 (/~snavely/bundler/) 给定了这些相机参数和稀疏的点云,有许多致密的的重建算法可以用来重建 致密的模型(http://www.di.ens.fr/cmvs/)。
HalfEdge e;
class HalfEdge { HalfEdge *opp; Vertex *end; Face *left; HalfEdge *next; };
HalfEdge e;
e e->opp()
e->end()
class HalfEdge { HalfEdge *opp; Vertex *end; Face *left; HalfEdge *next; };
• 理想的圆
– 如果圆心在(0,0)处,r2 = x2 + y2
(x, y)
(0, y) r (0, 0)
离散化的圆(二)
• 多边形逼近(分段线性近似)
离散化显示:光栅图形反走样
OpenGL反走样
• glEnable(GL_BLEND)//启用混合 • glEnable(GL_LINE_SMOOTH)//启用线段反走 样
v3 v4 v3
e3,2
e3,1 e4,2 e4,1
f1
f2 f2 f3
e1,1
e5,1 e3,2 e7,1
e2,1
e4,1 e5,1 e6,1
• 一个面指向
– 属于它的某条半边
e3,2 e4,1 e4,2
class HalfEdge { HalfEdge *opp; Vertex *end; Face *left; HalfEdge *next; };
e e->opp()
e->start() = e->opp()->end();
e->start()
class HalfEdge { HalfEdge *opp; Vertex *end; Face *left; HalfEdge *next; };
HalfEdge e;
e->left()
Non-Manifold
Closed Manifold
Open Manifold
拓扑
v = 12 f = 14 e = 25 c=1 g=0 b=1 图的亏格(genus):handle的数目。 在沿其撕裂后,能够使图保持连通 的封闭路径的最大数目的一半
Euler-Poincare 公式 v+f-e = 2(c-g)-b
• • • • 将一个隐式的曲面转换为三角网格 在3D网格(grid)上定义的隐式曲面 在每个立方体(cube)中根据8个顶点的标量值来确定重构曲面 一般用于医学数据
点云
深度图像
网格(Mesh)
– – – – – 图形学中最常用的表达 简单 可表达复杂形状 图形硬件支持 一般为三角网格
为什么是三角网格
网格的数据结构是否优秀
• 构建数据结构的时间复杂度
• 进行一个查询操作的时间复杂度 • 进行一个网格编辑操作的时间复杂度(更 新数据结构) • 空间复杂度
数据结构举例
• 面列表( List of faces)
• 邻接矩阵(Adjacency matrix) • 半边结构(Half-edge)
一个实际的文件例子 .obj文件
All neighboring vertices
edge
EV EE EF
FV FE FF
All neighboring edges All neighboring faces
All neighboring vertices
face
All neighboring edges All neighboring faces
• 可高效地进行拓扑变换 • 高效地进行二元操作:交、并、差等
隐式曲面
• 隐式曲面便于表达复杂的曲面,比如水面
• 三角网格难以表达水的合并、飞溅、波浪等形变
实体建模(CSG)
• 用简单形体的二元操作来构造复杂形体
常用的建模方法
• 扫描 • 基于图像的建模方法 • 过程式建模
扫描
• 构造一个对象的三维模型需要一张或多张深度图像 • 距离扫描仪测量的是物体表面的三维坐标,并以m*n的距离网 格形式返回测量值,这个网格称作深度图像 • 如果有多张深度图像,对每张深度图像需要计算出一个刚性变 换,以与其它深度图像对齐 • 使用改进版本的ICP算法(Iterative Closest Point Alignment)来计 算合适的刚性变换,使得两张深度图像之间点对的最小二乘距 离最小
游戏时间:猜猜亏格数
网格的数据结构表达
• 网格数据的应用:
– 渲染 – 几何查询
• face #3 包括哪些顶点? • 顶点 i 和顶点 j 是否相邻? • face #7与哪些面相邻?
– 几何操作Geometry operations
• 添加或者删除一个顶点/边/面
• 大部分网格难以支持高效的上述操作 • 一般采用三角流形网格
– O(n)-遍历所有的面
邻接矩阵的优劣
• 优点
– 支持顶点之间邻接信息(VV)的高效查询 – 支持非流形网格
• 缺点
– 没有边的显式表达 – 不支持VF, VE, EV, FE, EF 的快速查询
半边结构
• 记录所有的面、边和顶点
– 几何信息 – 拓扑信息 – 附属属性
• 流行于大部分几何建模应用 • Aka DCEL(Doubly-Connected Edge List)
# Object “object01” g mesh01 # NO. points 4: v -21.7978 45.3715 0 v -21.7978 14.0897 22.1196 v -2.64162 14.0897 -11.0598 v -40.9539 14.0897 -11.0598 # NO. normals 16: vn 0.81650 0.3333 0.47140 vn 0 0.3333 -0.94281 … # NO. texute coordinates 4: vt 1 0 … # NO. faces 4: f 1/3/5 2/2/8 3/1/11 f 1/3/7 3/1/13 4/4/14 f 4/4/16 2/2/10 1/3/6 f 4/4/15 3/1/12 2/2/9
3D模型的表达
• 原始数据
– – – – 体素 点云 深度图像 多边形
• 实体模型
– – – – 八叉树 BSP树 CSG Sweep
• 曲面
– – – – 曲面网格 细分曲面 参数曲面 隐式曲面
• 高层次语义结构
– Scene Graph
Marching Cube [Lorensen& Cline ’87+ : 从体素到三角网格
遍历一个顶点的 一环半边
1. e 2. e->next()
4
6 5
7
8
…
3. e->next()->opp()
4. e->next()->opp()->next() 5. e->next()->opp()->next()->opp()
3 2 1
6. e->next()->opp()->next()->opp()->next() 7. e->next()->opp()->next()->opp()->next()->opp()
常用的半边结构实现
• CGAL
– /
• Open Mesh
–
细分曲面
• 虽然理论上可以手动地设定每一个顶点、边、面,但这 是异常繁琐的
– 一个精细的网格往往有上百万个顶点
• 理想的情况: 手工构造一个低分辨率的网格,然后逐渐 地用自动算法光滑化,添加更多细节
8. e->next()->opp()->next()->opp()->next()->opp()->next()
… until e(->next()->opp())n == e
半边结构的优劣
• 优点
– 所有查询操作时间复杂度均为O(1) – 所有的编辑操作时间复杂度均为O(1)
• 缺点
– 只能表达流形网格
细分曲线
细分曲面
NURBS
• NURBS = Non-Uniform Rational B-splines(非 均匀有理B样条)
隐式曲面
• 用定义在三维空间中的函数������(������) = 0来隐式 地表达曲面 • 容易判断一个点是否在曲面内部
– ������(������)<0 内部 – ������(������)>0 外部 – ������(������)=0 在曲面上
真实的照片
重建的模型
过程式建模
• 使用算法创建模型 • 可容易地构造多样化的模型 • 一般用来构造复杂的、规则性强的模型
– 地形 – 植物 – 建筑、城市
过程式建模
• 用一个小的数据集或规则来描述目标模型的高层次语义 信息
邻接矩阵
• 将网格视为邻接图
• 给定一个包含n个顶点的网格,构建一个 n*n 的矩阵来表达邻接关系
– 如果顶点i和顶点j邻接,那么矩阵元素 (i,j) 值为 1,否则为0
邻接矩阵举例
基于邻接矩阵的查询
• face #3包括哪些顶点?
– O(1)
• 顶点i 和 j是否相邻?
– O(1)
• 顶点i与哪些面相邻 ?
• 其它多边形网格可以容易地剖分为三角形
• 三点共面:保证平面性 • 可以容易地定义内外方向、插值操作等
网格小知识
• • 三维形体的分段线性(Piecewise linear)近似 组成成分
– 几何:顶点 – 拓扑: 边和面
• • • • •
边界边: 只与一个面相邻 正则边: 与且仅与两个面相邻 奇异边: 与多于两个面相邻 流形网格: 没有奇异边的网格 封闭网格: 没有边界边的网格
面列表实例
面列表的优劣
• 优点
– 方便而紧凑 – 可表达非流形网格
• 缺点
– 不能有效地支持点、面之间的邻接关系查询
需要查询哪些邻接关系?
Input output All neighboring vertices vertex All neighboring edges All neighboring faces abbr VV VE VF
面列表
• 顶点列表(顶点坐标:coordinates) • 面列表- 面中顶点的三元组 (v1,v2,v3) • 查询操作:
– face #3包括哪些顶点?
• O(1) - 查询第三个面的顶点三元组
– 顶点i 和顶点j是否相邻?
• O(n)-需染要求,对于几何处理还不够高效
第二讲 几何建模
内容提要
• • • • • 计算机中如何表达三维模型? 什么是网格? 网格的典型数据结构是什么? 几何建模有哪些典型方法? 几何建模有哪些典型应用?
几何建模(Geometric Modeling)
• 在计算机中表达一个真实世界的三维对象或 虚拟三维形象,就必须先描述其形状
• 几何建模
– 三维对象的表达、构造和处理的计算机算法和过 程
• 要逼真再现一个场景,需要对场景中的每一个细节进行建模
数字化几何数据
• 离散化
– 易于表达和传输 – 渲染硬件和软件的基础数据 – 大多数获取设备的输出格式 (CT, MRI, laser, …) – 大多数模拟/分析工具需要的输入
离散化的圆
e->right()
e e->opp()
e->right() = e->opp()->left();
class HalfEdge { HalfEdge *opp; Vertex *end; Face *left; HalfEdge *next; };
HalfEdge e;
e e->opp()
环左边的面遍历直到 e(->next)n = e
半边结构实例
• 一条半边指向
– 起始点 – 所属面 – Next half edge and opposite half edge – (可选) previous edge
• 一个顶点指向
– 它的某条出射半边
Halfedge
Origin
Twi n
IncidentFace
Next
Prev
e3,1
v2
移动设备上的 3D Scanning
Structure Sensor for iPad
Autodesk 123D Catch
基于图像的建模
•• •
使用计算机视觉的方法来估计每张照片的相对摄像机位置与朝向,同时得到 对象的稀疏点云表达
基本的思想:一个点的位置可以通过多张不同位置拍摄的照片确定 (/~snavely/bundler/) 给定了这些相机参数和稀疏的点云,有许多致密的的重建算法可以用来重建 致密的模型(http://www.di.ens.fr/cmvs/)。
HalfEdge e;
class HalfEdge { HalfEdge *opp; Vertex *end; Face *left; HalfEdge *next; };
HalfEdge e;
e e->opp()
e->end()
class HalfEdge { HalfEdge *opp; Vertex *end; Face *left; HalfEdge *next; };
• 理想的圆
– 如果圆心在(0,0)处,r2 = x2 + y2
(x, y)
(0, y) r (0, 0)
离散化的圆(二)
• 多边形逼近(分段线性近似)
离散化显示:光栅图形反走样
OpenGL反走样
• glEnable(GL_BLEND)//启用混合 • glEnable(GL_LINE_SMOOTH)//启用线段反走 样
v3 v4 v3
e3,2
e3,1 e4,2 e4,1
f1
f2 f2 f3
e1,1
e5,1 e3,2 e7,1
e2,1
e4,1 e5,1 e6,1
• 一个面指向
– 属于它的某条半边
e3,2 e4,1 e4,2
class HalfEdge { HalfEdge *opp; Vertex *end; Face *left; HalfEdge *next; };