计算几何实践3:三角化

81 篇文章 2 订阅
33 篇文章 1 订阅
2017-12-10

  想写一篇三角化的总结,竟然拖了三年时间。这是我拖的最久的一篇总结了。再不写,没准以后不做这方面内容了,就没有机会了。刚开始进入项目组的时候,项目刚进入初始阶段,我们人手不够,紧迫性也不是那么高,所以,我也被允许有一些时间来阅读网格化相关的材料,一份70页的paper,一个小册子Polygon Mesh Processing。那时候还是很痛苦的,完全没有这方面的经验。
  在CAD程序中,一个很基础、重要的功能就是对Planar Graphic进行网格化。而各种网格之中,三角形网格尤为重要。所以,三角化是必须要掌握的算法。而在游戏中,程序员一般只需要把美术制作的3D模型(基本上三角形mesh)导入场景即可,也有一些情况下需要在游戏引擎中对网格做再次处理。所以,最好是对于三角化过程熟悉一些。想要把一个Planar Graphic拆分为多个三角形,拆分的方式非常多。更不用说新增定点或其他参数的情况,那拆分的方式就更多了。我们最常使用的是Delaunay三角化算法。C/C++的算法lib有很多。若使用Python,scipy包就提供了Delaunay 三角化算法,这是使用最广的一种三角化算法,所以scipy也只提供了这一种。使用起来很简单,但是,如果要自己来第一次实现这个算法,估计没有一周时间完成不了。
  使用算法库,我们倒是可以很快的实现功能,但是业务层对于数据结构肯定是有独特要求的。我们在项目中大部分时间估计就是处理和业务相关的部分了。至于算法,我现在是没有时间去实现了。只能了解个大概,学会使用。scipy.spatial.Delaunay只提供了最简单的功能,没有见到控制三角行角度、边长度、整体均匀程度、是否新增控制点等等功能,但是C/C++ lib,如CGAL、triangle等都有实现。triangle 当然也有 Python Wrapper,可在此处下载。接下来的程序使用这个lib。参考chapt3/triangulation.py程序,就可以很快的实现三角化程序。

    

    三角化过程中,我们一般有几个常见的需求:

  1. 图形中有洞
  2. 图形中有一条线段或者曲线,生成的三角形顶点必须要落在此线段上。
  3. 图形中某些区域要求三角形密度高一些,有些区域要求密度低一些。
  4. 对生成的三角形的角度,边长度,均匀程度、是否新增控制点等有要求。

  当然,真实的需求可能比这个复杂多了。在planar grpahic 中间扣几个洞 这个需求实在太常见了,如一面墙上有窗户、门,衣服上有镂空。既然是洞,那肯定是不能参与三角化的。三角化的算法接受的最重要的参数就是一系列的离散的顶点。如果想要在图形中扣一个洞,这个洞也只能用顶点信息来描述。

  例如上图,中间镂空的四边形,需要使用四条边及四边形内部任意点来指定,而四条边可以通过顶点对来描述。下面示例的红叉就是镂空部分内某一点。其实这个过程也很简单,算法首先对整个图形进行三角化,然后把镂空的部分吃掉就可以了。python版本的triangle lib输入的数据结构在文档中讲解太少了,让人不知所云。只要输出一下 triangle.get_data('face.1') ,就能照着例子来做了。triangle lib的算法控制主要依靠传入函数的一个字符串, 如 B = triangle.triangulate(A, 'pqa0.015c'),这个字符串的各个字符的意义,只能参看文档了,只要看懂了,还是非常好使用的。 如下是一个计算带孔的图形的三角化例子。请参考chapt3/complicateTriangulation.py 

  三角形顶点比三角形面片上的位置更容易确定,更好用。比如我们希望在布料上一条直线段上排布纽扣。又如如布料上一条直线段与另一布料缝合并参加物理模拟,只有缝合处的线段上都是三角形的边才能保证模拟后比较平整。同样,线段也只能通过两个顶点表示,如果限制了三角形最大面积和最小锐角,那么也可以限制三角形的边长,那么线段就会按照这个限制来分割。如下图

  对于渲染和模拟来说,我们都希望mesh有的地方密集一些,有的地方稀疏一些,主要是为减少计算量和资源使用量。处理得当,减少一两个数量级不是难事。所以,必要性显而易见。一种方法直接增加输入的顶点,第二种方法是在给出区域的条件约束,在算法内部实现。很显然,第一种简单多了。

  我们现在研发的程序的技术重点是布料模拟,其实布料模拟可以算作有限元分析的一种。我们对于网格有一些要求:如不能有很小的锐角(要尽量像正三角形),要均匀大小。估计其他的有限元分析对于网格可能有更严格的限制。或者需要三维空间的网格,那问题的难度就上升一个级别了。一般的开发工作中也接触不到的。
  我们的项目一直在使用C语言版本的triangle 这个lib来做三角化。非常小巧,简单,只有一个入口函数,一个函数就可以完成三角化的工作。
void triangulate(char *, struct triangulateio *, struct triangulateio *, struct triangulateio *);
  算法本身可能很复杂,但是lib的使用还算比较简单。第一个参数是字符串,控制了“三角形内角大小,边长,均匀程度”等参数,第二个参数是输入,第三个参数是三角化输出,第四个参数是voronoi输出,一般置为NULL即可。这里要提一下,为什么有voronoi这个参数呢?是因为voronoi tessellation和 delaunay triangulation是对偶的,相当于同一个计算结果换了一种描述而已。但是,每一个参数本身是非常复杂的,定义如下:

struct triangulateio {
  REAL *pointlist;                                               /* In / out */
  REAL *pointattributelist;                                      /* In / out */
  int *pointmarkerlist;                                          /* In / out */
  int numberofpoints;                                            /* In / out */
  int numberofpointattributes;                                   /* In / out */

  int *trianglelist;                                             /* In / out */
  REAL *triangleattributelist;                                   /* In / out */
  REAL *trianglearealist;                                         /* In only */
  int *neighborlist;                                             /* Out only */
  int numberoftriangles;                                         /* In / out */
  int numberofcorners;                                           /* In / out */
  int numberoftriangleattributes;                                /* In / out */

  int *segmentlist;                                              /* In / out */
  int *segmentmarkerlist;                                        /* In / out */
  int numberofsegments;                                          /* In / out */

  REAL *holelist;                        /* In / pointer to array copied out */
  int numberofholes;                                      /* In / copied out */

  REAL *regionlist;                      /* In / pointer to array copied out */
  int numberofregions;                                    /* In / copied out */

  int *edgelist;                                                 /* Out only */
  int *edgemarkerlist;            /* Not used with Voronoi diagram; out only */
  REAL *normlist;                /* Used only with Voronoi diagram; out only */
  int numberofedges;                                             /* Out only */
};


  其实,总结一下,也只有:三角化的顶点(及个数),顶点属性,三角形(输出),线段,洞,区域属性,三角形边(输出),只有四五个是有效的。其中,只有pointlist才是必需的,不用担心很复杂。上面几个图例对应的python调用函数的参数为:A = dict(vertices=vertices, segments=segments, holes=holeMarkerPos),三个二维数组罢了。  
  Youtube上有视频对算法的过程做了动画讲解,看起来就直观多了。

  1. http://dzhelil.info/triangle/index.html  triangle python wrapper 
  2. https://people.eecs.berkeley.edu/~jrs/papers/imrtalk.pdf
  3. https://people.eecs.berkeley.edu/~jrs/papers/triangle.pdf

2017-12-22  P.S. 这两周忙起来了,这篇文章拖了很久了,也不在乎这两周了,不过,终于算是完成。。

 

 

 

如果有任何意见,欢迎留言讨论。 


[ 主页 ]
  • 5
    点赞
  • 32
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
凤翔县职业教育中心 计算机及应用专业教学计划 一、招生对象与学制 本专业招收初中毕业生或具有同等学历者,学制3年,实行"2+1"培养模式。 二、培养目标与业务范围 (一) 培养目标 学生通过文基础知识、专业基础知识、专业理论知识等方面的学习和专业技能的 训练,培养具有较强的职业道德和具备一定的综合素质、有技术、懂管理,能从事计算 机管理、维护、操作等方面的中等专业技术人员。 (二) 业务范围 计算机公司职员 计算机及相关软硬件产品公司的销售、储运工作;系统集成工程项目市场人员、技 术支 持人员、工程实施人员;软硬件产品的售前、售后客户服务工作;软硬件产品技术咨询 工作;用户初级技术培训、操作培训工作。 制造业技术工人 计算机及其相关产品制造企业中的销售人员; 国家机关、企事业单位工作人员 计算机机房和微机室的操作、管理与维护等工作;办公室计算机操作岗位,如:报表处 理、打字、文印等工作;娱乐服务场所的计算机管理与维护工作;计算机设备及外部设 备维修工作;计算机网络系统维护工作。 三、知识结构、能力结构及要求 (一)知识结构 1. 具备必需的文基础知识和基本素养。 2. 具有基础外语和专业外语的良好基础。 3. 掌握计算机的基本知识,具备计算机应用的基本技能。 4. 掌握计算机平面设计和网络的基础知识和基本操作技能。 (二)能力结构 1. 具有熟练地进行中、英文打字的能力;熟练的办公软件应用能力,较强的办公自动设 备管理能力。 2. 具有相关软件中级技术等级的应用能力,文件的排版、广告的设计、动画制作、网站的 制作等; 3. 能够进行计算机安装、维护,具有网络组建和管理的基本能力; 4. 具有继续学习和适应职业变的能力。 四、课程设置及教学要求 (一) 必修课程 (一)文基础模块 1.德育 (1) 职业生涯规划 职业生涯规划主要讲授职业生涯规划与职业理想、职业生涯发展条件与机遇、职业 生涯发展目标与措施、职业生涯发展与就业、创业以及职业生涯规划管理、调整与评价 ,为学生正确就业与择业奠定坚实的基础。 (2) 职业道德与法律 职业道德与法律以激励学生学习兴趣为起点,基于生活自身和不同学科的内在联系 ,引导学生学会思考、学会学习,培养学生的创新精神,把显性的知识学习与隐性的思 维能力培育有机统一起来,为学生的终身学习奠定基础。 (3) 经济政治与社会 经济政治与社会将马克思主义基本观点和我国社会主义经济、政治、文、社会 建设常识与学生的生活体验密切结合,遵循学生认知规律,引导学生在学习过程中感 悟、体验和思辨人生。 (4 ) 哲学与人生 哲学与人生坚持从客观实际出发,脚踏实地走好人生路,"用辩证的观点看问题,树 立积极的人生态度,"坚持实践与认识的统一,提高人生发展的能力,把哲学理论与中职 生的实际生活密切结合,力求以哲学理论知识指导学生的人生成长。 (5) 心理健康 心理健康以权威的心理学理论为依据,以中职学生的实际需要为出发点,适合中职 学生心理发展特点,向学生介绍较为有效的、切实可行的自我心理调适方法和技巧。 2语文 在初中语文的基础上,进一步加强现代文、文学作品阅读训练,初步介绍文言文阅 读训练,提高学生阅读现代文和浅易文言文的能力;加强文学作品阅读教学,培养学生 欣赏文学作品的能力;提高学生应用文写作能力和日常口语交际水平。通过课内外的教 学活动,使学生进一步巩固和扩展必需的语文基础知识,养成自学和运用语文的良好习 惯,接受优秀文熏陶,形成高尚的审美情趣。 3. 数学 在初中数学的基础上,进一步学习数学的基础知识。必学内容:集合与逻辑用语、 不等式、函数、指数函数与对数函数、任意角的三角函数、数列与数列极限、向量、复 数、解析几何、立体几何、排列与组合、概率与统计初步。选学内容:实用微积分。通 过教学,提高学生的数学素养,培养学生的基本运算、基本计算工具使用、空间想像、 数形结合、思维和简单实际应用等能力,为学习专业课程打下基础。 4、英语 在初中英语的基础上,巩固、扩展学生的基础词汇和基础语法;培养学生听、说、 读、写的基本技能和运用英语进行交际的能力;使学生能听 5、体育与健康 在初中相关课程的基础上,进一步学习体育与卫生保健的基础知识和运动技能,掌 握科学锻炼和娱乐休闲的基本方法,养成自觉锻炼的习惯;培养自主锻炼、自我保健、 自我评价和自我调控的意识,全面提高身心素质和社会适应能力,为终身锻炼、继续学 习与创业立业奠定基础。 专业基础及专业主干课程 6、中英文录入 本课程主要内容包括英文打字技术与五笔字型汉字录入方法。通过学习,能够熟练 掌握英文键盘打字技能和中文录入技能,并达到市职业教育教学研究室规定的技能标准 。 7、计算机应用基础 (1)Windows操作系统:讲授五笔字型的应用,计算机数据的处理
内容简介   本书从实践的角度出发,详细介绍3D游戏开发的高级技术,并具体描述了一个游戏引擎的构建过程。全书着重讨论三个主题:游戏开发的一般过程;实时渲染过程;角色动画。所有主题均围绕一个具体的游戏开发系统Fly3D SDK2.0加以介绍。   本书旨在为当今的三维游戏引擎技术提供一个综合的解决方案,使读者尽快地进入开发者角色,了解整个游戏的开发过程并初步具备游戏引擎开发能力。   本书适合作为高等院校相关专业的教学参考书,同时可供相关技术人员和游戏开发人员阅读。 编辑推荐   本书从实践的角度出发,详细介绍3D游戏开发的高级技术,并具体描述了一个游戏引擎的构建过程。全书着重讨论三个主题:游戏开发的一般过程;实时渲染过程;角色动画。所有主题均围绕一个具体的游戏开发系统Fly3D SDK2.0加以介绍。   本书旨在为当今的三维游戏引擎技术提供一个综合的解决方案,使读者尽快地进入开发者角色,了解整个游戏的开发过程并初步具备游戏引擎开发能力。   本书适合作为高等院校相关专业的教学参考书,同时可供相关技术人员和游戏开发人员阅读。 作者简介   Alan Watt 英国谢菲尔德大学计算机科学系讲师,是该校计算机图表学研究室主任,曾经编写过多本优秀著作,包括《3D计算机图形学》和《The Computer Lmage》。 Fabio Policarpo 工作在里约热内卢的软件开发者,他是Paralelo计算机公司的创始人,目前正致力于三维动作多玩家游戏的研究。 目录 出版者的话 专家指导委员会 译者序 前言 第一部分 高级游戏系统剖析 第1章 高级游戏系统剖析I:构造过程和静态光照 1.1 数据结构 1.1.1 顶点 1.1.2 面 1.1.3 包围盒 1.2 构造过程 1.2.1 从场景几何中创建BSP树 1.2.2 路径规划的凸体和PVS计算 1.2.3 处理复杂的地形 1.2.4 BSP叶节点中的面 1.2.5 寻找叶凸体 1.2.6 凸体和伪人口 1.2.7 潜在可视集 1.3 光照贴图的构造 1.3.1 生成光照贴图的坐标 1.3.2 光照贴图的打包 1.3.3 对光照贴图的解释 1.4 BSP管理 1.5 高级静态光照——辐射度 附录1.1 构造实践 附录1.2 辐射度理论基础 第2章 高级游戏系统剖析Ⅱ:实时处理 2.1 视见和BSP 2.1.1 生成视见约束体的面 2.1.2 远近裁剪面和视见约束体 2.2 照相机控制 2.3 使用BSP的基本碰撞检测和反弹 2.3.1 碰撞和BSP遍历 2.3.2 粒子,场景检测和反弹 2.4 特殊的碰撞检测和反弹 2.4.1 AABB的定义 2.4.2 AABB类的定义和静态成员的定义 2.4.3 碰撞检测和碰撞反弹 2.4.4 使用AABB的伪碰撞反弹 2.4.5 使用AABB的碰撞检测 2.4.6 AABB顶点与场景面相交 2.4.7 场景顶点与AABB面相交 2。4.8 AABB边与场景边相交 2.4.9 更精确的碰撞检测 2.4.10 使用碰撞阈值 2.5 基本的路径规划 附录2.1 实时处理的演示 第3章 高级游戏系统剖析Ⅲ:软件设计与应用编程 3.1 应用的种类 3.1.1 插件 3.1.2 前端 3.1.3 工具 3.2 Fly3D引擎体系结构 3.2.1 FlyMath 3.2.2 FlyDirectX 3.2.3 FlyRender 3.2.4 FlyEngine 附录3.1 编写一个插件 第二部分 实时渲染 第4章 实时渲染 4.1 简介 4.2 顶点、像素和贴图 4.2.1 基本的逐像素着色 4.2.2 着色和坐标空间 4.2.3 25年来主流的插值着色方法和颜色贴图 4.2.4 标量表示 4.3 因式分解法 4.3.1 使用因式分解着色模型的逐像素着色——各向同性模型 4.3.2 使用因式分解着色模型的逐像素着色——各向异性模型 4.4 BRDF和真实材质 4.5 使用BRDF进行逐像素着色 4.6 环境贴图参数 4.6.1 环境贴图参数:立方映射 4.6.2 环境贴图参数:球面映射 4.6.3 环境贴图参数:对偶抛物面贴图 4.6.4 环境贴图——可比点 4.6.5 立方贴图和向量规范 4.7 实现BRDF:可分离的近似 4.8 着色语言和着色器 4.8.1 着色语言:简单的历史回顾 4.8.2 RenderMan着色语言 4.8.3 实时渲染的着色语言 第5章 实时渲染:实践 5.1 基本着色器 5.1.1 渲染状态 5.1.2 着色器排序 5.1.3 着色器类的实现 5.2 渲染状态 5.2.1 全局设定 5.2.2 局部设定 5.3 着色器实例 5.3.1 环境映射和铬映射效果——玻璃、金属和铬 5.3.2 移动发光告示牌
计算几何 算法与应用》(Computational Geometry: Algorithms and Applications) 是由Mark de Berg, Otfried Cheong, Marc van Kreveld和Mark Overmars等人合著的一本计算几何领域的经典教材。该书是关于计算几何算法和应用的权威指南,深入介绍了计算几何的基本概念、算法和应用。这本书被广泛应用于计算机科学、地理信息系统、计算机视觉和人工智能等领域。 这本书主要涵盖了计算几何的许多重要主题,包括平面和空间几何、线段、多边形、凸包、三角剖分、区域和方框树、点定位和射线距离、几何搜索问题、平面点排序、和可见性图等。它详细介绍了这些主题的算法和数据结构,并提供了大量的示例和应用场景。读者可以通过学习这些算法和数据结构,理解和解决各种实际计算几何问题。 这本书的特点之一是它提供了丰富的图形示例和可视。读者可以通过这些示例更好地理解和应用计算几何算法。此外,该书还提供了习题和练习题,帮助读者巩固所学知识,并对各种算法进行实践。 《计算几何 算法与应用》是计算几何领域的经典教材,它详细介绍了计算几何的基本概念、算法和应用。它适用于计算机科学、地理信息系统、计算机视觉和人工智能等领域的学生、研究人员和专业人士。无论是初学者还是专家,都可以从这本书中获得有关计算几何的全面知识和实用技能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值