这篇博客介绍了计算机图形学中的Ear Clipping算法,以及我对其的思考。


背景

偶尔翻出来几个以前的老游戏玩了一下,其中包括了孢子。说实话,以前作为玩家的时候感觉这个游戏也就一般。但是现在作为游戏开发者发现这个游戏涉及到一些很酷的技术,包括自定义的肢体(Skin方面)、动画的泛化(Animation Retargeting方面)以及IK结算的泛化。因此查找了一些这方面的资料,尝试了解一些这方面的知识。

搜索了一些资料之后,决定挨个的去补一补对应的知识点。有些知识点在大学也学过但是记忆已经模糊了,有些则是完全没听过的领域,统一记录下来吧,也当作是对以往的知识点的整理。

这篇博客介绍的就是孢子中使用的用于将自定义肢体模型进行细分化的Ear Clipping算法。

在孢子的开发者博客中提到,在项目开发期,Marching Cube算法仍然处于专利保护期(虽然游戏发行的时候专利已经过期了……),因此开发者决定使用Ear Clipping算法将整个网格进行细分处理。

算法介绍

Ear Clipping算法指的是用于将一个普通多边形拆解为一系列的三角形,这些三角形的顶点都来自原来的普通多边形,如下图:

各类定义

普通多边形的定义

上文提到了普通多边形(Simple polygon),普通多边形定义如下:

  1. 普通多边形由n个顶点(V0V_0到Vn−1V_{n-1})组成。
  2. 连续的顶点通过一条边<ViV_i, Vi+1V_{i+1}>组成,0≤i≤n−20 {\le} i {\le n-2},并且由边<Vn−1V_{n-1}, V0V_0>链接首尾两个点。
  3. 每个顶点都有且只有两条边相连,没两条边都只允许相交于顶点。

如下图,最左边的是一个普通多边形,中间的不是普通多边形因为顶点V1V_1连接了多于两条边,右边的不是普通多边形因为1和4的边相交于非顶点。

Ear Tip

针对于三个连续的顶点Vi0,Vi1,Vi2V_{i0}, V_{i1}, V_{i2},如果线段Vi0Vi2V_{i0}V_{i2}是多边形的一根对角线,那么顶点Vi1V_{i1}就是一个Ear tip.

说的更通俗一点,如果线段Vi0Vi2V_{i0}V_{i2}完全位于多边形内部,并且顶点Vi1V_{i1}是一个凸顶点,那么顶点Vi1V_{i1}就是一个Ear tip。

算法过程

算法过程其实相对来讲比较简单:

  1. 首先建立起对应顶点的双向链表VV。
  2. 构建初始的凸顶点集CC和凹顶点集RR,并且构建出初始的Ear Tips集EE。
  3. 每次从Ear Tips集中删除一个元素ViV_i并且在多边形顶点集中也删除之,并且在生成的三角形链表中添加入对应的三角形<Vi−1,Vi,Vi+1V_{i-1}, V_{i}, V_{i+1}>。之后刷新临接的顶点,计算是否生成了新的凸顶点以及Ear Tip。
  4. 重复操作3,直到链表中只剩下三个顶点,此时就是最后的三角形了。

例如下图,在多边形中删除了Ear Tip 3,此时三角形<V2,V3,V4V_2, V_3, V_4>就被放入三角形列表中。

再如下图,在多边形中删除了Ear Tip 4,此时三角形<V2,V4,V5V_2, V_4, V_5>被加入三角形链表中,并且顶点5变成了新的Ear和凸顶点,此时需要更新对应的链表。

完整过程如下:

不难看出,Ear Clipping算法的时间复杂度是O(n2)O(n^2),并且三角化的最终质量很大程度上取决于顶点顺序。在某些情况下很容易生成过于细长的三角形,这样不利于Skinning的进行。

思考

Ear Clipping算法常用于将Polygons进行三角化,但是在孢子中最后的躯干模型往往是基于一个隐式曲面(Implicit Surface),也就是说是连续的,此时需要将隐式曲面转化为多边形之后,再进行操作。

但是看得出来孢子中并没有使用这个算法进行最终的三角化。在最终的隐式曲面方程定型之后,他们使用的是Graphics Gems III的文章Compact Isocontours from Sampled Data,对应的tech report链接。据说是强烈推荐,下一篇文章就写这个吧……

<全文完>

游戏《孢子》的思考 —— Ear Clipping算法相关推荐

  1. Ear Clipping算法简介

    背景 偶尔翻出来几个以前的老游戏玩了一下,其中包括了孢子.说实话,以前作为玩家的时候感觉这个游戏也就一般.但是现在作为游戏开发者发现这个游戏涉及到一些很酷的技术,包括自定义的肢体(Skin方面).动画 ...

  2. 【吐槽脑洞】关于逛B站时偶然体验的弹幕互动游戏魏蜀吴三国争霸游戏的一些思考

    [吐槽&开脑洞]关于逛B站时偶然体验的弹幕互动游戏魏蜀吴三国争霸游戏的一些思考 预警:本贴没有什么技术含量,也没有什么严谨的资料调查,仅仅是自己的一次游戏体验引起的一些思考和个人观点,以及作为 ...

  3. Vatti clipping 算法介绍

    文章目录 一.背景 二.基本概念 1. 点(Vertex) 2. 点的顺序(Vertex order) 3. 边 (Edge) 3.1 左侧边和右侧边(Left-hand Edge and Right ...

  4. 实现游戏后处理6大常用模糊算法

    游戏后处理6大常用模糊算法 模糊算法介绍 BoxBlur均值模糊 多次迭代 降低采样进行采样-优化 9次采样BoxBlur 高斯模糊 双重模糊技术(Dual Blur) Kawase模糊(Kawase ...

  5. Java游戏服务器开发之A星算法

    Java游戏服务器开发之A星算法    学习这个主要是用于寻路算法.    参考资料主要是siki学院的视频,A计划--人工智能--A星算法. 网址http://www.sikiedu.com/cou ...

  6. 你的时间是如何被谋杀的?---由一款塔防游戏引发的思考

    你的时间是如何被谋杀的? ---由一款塔防游戏引发的思考 文/LL 之前一段时间花了很长时间来玩了一个 Mac OS平台下的塔防游戏<iBomber Defense Pacific>,为此 ...

  7. 游戏中常见的洗牌算法

    今天把游戏中用到的洗牌算法好好看了看,把自己感觉最易懂的和最经典的一种分享出来,当然,我这个是看过别人之后自己写的. 我们以扑克牌当做例子,一共有54张,如何一次就把排序全部打乱呢? 1.最笨的洗牌算 ...

  8. 游戏中常用的伪随机算法之PRD暴击算法

    游戏中常用的伪随机算法之PRD暴击算法 PRD伪随机算法常用于游戏中的暴击算法,因此本文的标题将其称为 PRD暴击算法. 诞生与应用 PRD算法诞生与<魔兽争霸3>,可以说其诞生就是为了解 ...

  9. 游戏封包的加密与解密算法的破解

    游戏封包的加密与解密算法的破解 破解封包的加密与解密算法是制作外挂的第一步,是外挂制作中最具技术含量的步骤,同样也是一个十分令人头痛的环节.如果加密与解密算法被成功地破解,那么外挂制作也就完成了一半. ...

最新文章

  1. thinkphp如何跨模块调用方法呢?
  2. Butter fly
  3. JAVA程序设计----IO流(下)
  4. win10电脑黑屏只有鼠标箭头_win7开机黑屏只有鼠标怎么办,我来教你解决
  5. oc基础-self关键字的使用
  6. 【深度优先搜索】一个实例+两张动图彻底理解 DFS | DFS 与 BFS 的区别 | 用 DFS 自动控制我们的小游戏
  7. 牛客 2022年中国高校计算机大赛-团队程序设计天梯赛(GPLT)上海理工大学校内选拔赛 签到题13题
  8. 第8.18节 Python类中内置析构方法__del__
  9. Linux多台机器配置ssh免登录
  10. [设计模式]装饰者模式
  11. 解决UnicodeEncodeError: 'gbk' codec can't encode character '\xe4' in position 319等问题
  12. PID控制器及其参数整定
  13. UESTC 1634 去年春恨却来时,落花人独立,微雨燕双飞
  14. 麻雀优化算法 SSA python实现
  15. ubuntu配置IP地址,网关,DNS和路由
  16. 神仙程序媛小姐姐的一些列Java教程,从小白到进阶,春招和秋招必备的面试题,全站式保姆的Java教程导航帖(未完结)
  17. 修改win7开机登陆界面背景图片
  18. 串行外设接口(Serial Peripheral Interface, SPI)逻辑设计部分 - spi_slave
  19. Mni2440 linux PWM 驱动代码修改支持 频率,占空比修改--XiaoLin.Peng
  20. JMeter之non-GUI 模式执行

热门文章

  1. 华为:求生存是当前主线 下阶段重点 to B数字化
  2. 集成电路开发及应用-版图设计专栏目录
  3. 用java实现文学研究助手_数据结构文学研究助手 C语言代码实现(带源码+解析)...
  4. 如何实现丝滑般的数据库扩容
  5. java笔记之网络知识--—TCP
  6. 2021-08-05
  7. 纳什均衡及经典案例(2)
  8. 【转】看完这篇,请不要再说不懂MOSFET
  9. 【Linux】远程下载 Google Drive 文件方法
  10. 完整学习笔记之Android基础(详版)