Ear Clipping算法简介
背景
偶尔翻出来几个以前的老游戏玩了一下,其中包括了孢子。说实话,以前作为玩家的时候感觉这个游戏也就一般。但是现在作为游戏开发者发现这个游戏涉及到一些很酷的技术,包括自定义的肢体(Skin方面)、动画的泛化(Animation Retargeting方面)以及IK结算的泛化。因此查找了一些这方面的资料,尝试了解一些这方面的知识。
搜索了一些资料之后,决定挨个的去补一补对应的知识点。有些知识点在大学也学过但是记忆已经模糊了,有些则是完全没听过的领域,统一记录下来吧,也当作是对以往的知识点的整理。
这篇博客介绍的就是孢子中使用的用于将自定义肢体模型进行细分化的Ear Clipping算法。
在孢子的开发者博客中提到,在项目开发期,Marching Cube算法仍然处于专利保护期(虽然游戏发行的时候专利已经过期了……),因此开发者决定使用Ear Clipping算法将整个网格进行细分处理。
算法介绍
Ear Clipping算法指的是用于将一个普通多边形拆解为一系列的三角形,这些三角形的顶点都来自原来的普通多边形,如下图:
各类定义
普通多边形的定义
上文提到了普通多边形(Simple polygon),普通多边形定义如下:
- 普通多边形由n个顶点(V0V0到Vn−1Vn−1)组成。
- 连续的顶点通过一条边<ViVi, Vi+1Vi+1>组成,0≤i≤n−20≤i≤n−2,并且由边<Vn−1Vn−1, V0V0>链接首尾两个点。
- 每个顶点都有且只有两条边相连,没两条边都只允许相交于顶点。
如下图,最左边的是一个普通多边形,中间的不是普通多边形因为顶点V1V1连接了多于两条边,右边的不是普通多边形因为1和4的边相交于非顶点。
Ear Tip
针对于三个连续的顶点Vi0,Vi1,Vi2Vi0,Vi1,Vi2,如果线段Vi0Vi2Vi0Vi2是多边形的一根对角线,那么顶点Vi1Vi1就是一个Ear tip.
说的更通俗一点,如果线段Vi0Vi2Vi0Vi2完全位于多边形内部,并且顶点Vi1Vi1是一个凸顶点,那么顶点Vi1Vi1就是一个Ear tip。
算法过程
算法过程其实相对来讲比较简单:
- 首先建立起对应顶点的双向链表VV。
- 构建初始的凸顶点集CC和凹顶点集RR,并且构建出初始的Ear Tips集EE。
- 每次从Ear Tips集中删除一个元素ViVi并且在多边形顶点集中也删除之,并且在生成的三角形链表中添加入对应的三角形<Vi−1,Vi,Vi+1Vi−1,Vi,Vi+1>。之后刷新临接的顶点,计算是否生成了新的凸顶点以及Ear Tip。
- 重复操作3,直到链表中只剩下三个顶点,此时就是最后的三角形了。
例如下图,在多边形中删除了Ear Tip 3,此时三角形<V2,V3,V4V2,V3,V4>就被放入三角形列表中。
再如下图,在多边形中删除了Ear Tip 4,此时三角形<V2,V4,V5V2,V4,V5>被加入三角形链表中,并且顶点5变成了新的Ear和凸顶点,此时需要更新对应的链表。
完整过程如下:
不难看出,Ear Clipping算法的时间复杂度是O(n2)O(n2),并且三角化的最终质量很大程度上取决于顶点顺序。在某些情况下很容易生成过于细长的三角形,这样不利于Skinning的进行。
思考
Ear Clipping算法常用于将Polygons进行三角化,但是在孢子中最后的躯干模型往往是基于一个隐式曲面(Implicit Surface),也就是说是连续的,此时需要将隐式曲面转化为多边形之后,再进行操作。
但是看得出来孢子中并没有使用这个算法进行最终的三角化。在最终的隐式曲面方程定型之后,他们使用的是Graphics Gems III的文章Compact Isocontours from Sampled Data,对应的tech report链接。据说是强烈推荐,下一篇文章就写这个吧……
Ear Clipping算法简介相关推荐
- 游戏《孢子》的思考 —— Ear Clipping算法
这篇博客介绍了计算机图形学中的Ear Clipping算法,以及我对其的思考. 背景 偶尔翻出来几个以前的老游戏玩了一下,其中包括了孢子.说实话,以前作为玩家的时候感觉这个游戏也就一般.但是现在作为游 ...
- 数据结构与算法:算法简介
数据结构与算法:算法简介 雪柯 大工生物信息 提笔为写给奋进之人 已关注 你说呢 . shenwei356 等 70 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国 ...
- hash算法_一致性hash算法简介
一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...
- Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)
前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...
- 推荐系统算法_机器学习和推荐系统(二)推荐算法简介
推荐算法简介 一. 基于人口统计学的推荐算法 二.基于内容的推荐算法 三. 基于协同过滤的推荐算法 协同过滤(Collaborative Filtering , CF) 基于近邻的系统过滤 基于用户( ...
- 图像迁移风格保存模型_CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介、关键步骤配图、案例应用...
CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介.过程思路.关键步骤配图.案例应用之详细攻略 目录 图像风格迁移算法简介 图像风格迁移算法过程思路 1.VGG对比NS 图像风 ...
- 魔棒工具--RegionGrow算法简介
from: 魔棒工具--RegionGrow算法简介 ps里面的魔棒工具非常好用,是图像处理中非常常用的一个工具,它现在已经是我的c++工具箱中很重要的一员了,我会在以后的时间里把我的工具箱逐渐介绍给 ...
- 【数据挖掘】基于划分的聚类方法 ( K-Means 算法简介 | K-Means 算法步骤 | K-Means 图示 )
文章目录 一. 基于划分的聚类方法 二. K-Means 算法 简介 三. K-Means 算法 步骤 四. K-Means 方法的评分函数 五. K-Means 算法 图示 一. 基于划分的聚类方法 ...
- AI - 常见算法简介(Common Algorithms)
机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...
最新文章
- easyexcel导入时读不到数据_EasyExcel简单使用--导入excel数据
- [Contest20180316]Mythological IV
- MATLAB求解常微分方程
- 安顺那里有学计算机,安顺计算机专业学费
- Python机器学习:梯度下降法005梯度下降法和数据标准化
- mysql导入1366_mysql source导入报错ERROR 1366的解决方法
- WCF REST (一)
- 最新抖音视频无水印解析接口及原理
- 利用EXCEL进行数据爬虫
- IPwe区块链智能池利用AI来处理专利分析
- 2022年熔化焊接与热切割题库
- 你所不知道的Win键
- java后台定时弹框提醒活动脖子(myeclipse)
- 疯狂java讲义第七章补充习题第12题答案
- 产品经理如何提升自己的知识
- ava中volatile关键字
- STM32学习笔记:FLASH读写之二
- 币圈名词解释之对冲搬砖
- easypoi教程_Easypoi的使用
- 杰理AC690X系列---EQ工具的使用(8)