背景

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

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

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

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

算法介绍

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

各类定义

普通多边形的定义

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

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

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

Ear Tip

针对于三个连续的顶点Vi0,Vi1,Vi2Vi0,Vi1,Vi2,如果线段Vi0Vi2Vi0Vi2是多边形的一根对角线,那么顶点Vi1Vi1就是一个Ear tip.

说的更通俗一点,如果线段Vi0Vi2Vi0Vi2完全位于多边形内部,并且顶点Vi1Vi1是一个凸顶点,那么顶点Vi1Vi1就是一个Ear tip。

算法过程

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

  1. 首先建立起对应顶点的双向链表VV。
  2. 构建初始的凸顶点集CC和凹顶点集RR,并且构建出初始的Ear Tips集EE。
  3. 每次从Ear Tips集中删除一个元素ViVi并且在多边形顶点集中也删除之,并且在生成的三角形链表中添加入对应的三角形<Vi−1,Vi,Vi+1Vi−1,Vi,Vi+1>。之后刷新临接的顶点,计算是否生成了新的凸顶点以及Ear Tip。
  4. 重复操作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算法简介相关推荐

  1. 游戏《孢子》的思考 —— Ear Clipping算法

    这篇博客介绍了计算机图形学中的Ear Clipping算法,以及我对其的思考. 背景 偶尔翻出来几个以前的老游戏玩了一下,其中包括了孢子.说实话,以前作为玩家的时候感觉这个游戏也就一般.但是现在作为游 ...

  2. 数据结构与算法:算法简介

    数据结构与算法:算法简介 雪柯 大工生物信息 提笔为写给奋进之人 已关注 你说呢 . shenwei356 等 70 人赞同了该文章 引用自算法图解,作者[美] Aditya Bhargava 译袁国 ...

  3. hash算法_一致性hash算法简介

    一致性hash算法有什么用?我们为什么需要一致性hash算法?这两个问题的答案可以看这篇文章 分布式系统路由算法简介. 了解了一致性hash算法出现的背景,我们来看看什么是一致性hash算法.一致性h ...

  4. Minimax 和 Alpha-beta 剪枝算法简介,及以此实现的井字棋游戏(Tic-tac-toe)

    前段时间用 React 写了个2048 游戏来练练手,准备用来回顾下 React 相关的各种技术,以及试验一下新技术.在写这个2048的过程中,我考虑是否可以在其中加入一个 AI 算法来自动进行游戏, ...

  5. 推荐系统算法_机器学习和推荐系统(二)推荐算法简介

    推荐算法简介 一. 基于人口统计学的推荐算法 二.基于内容的推荐算法 三. 基于协同过滤的推荐算法 协同过滤(Collaborative Filtering , CF) 基于近邻的系统过滤 基于用户( ...

  6. 图像迁移风格保存模型_CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介、关键步骤配图、案例应用...

    CV之NS:图像风格迁移(Neural Style 图像风格变换)算法简介.过程思路.关键步骤配图.案例应用之详细攻略 目录 图像风格迁移算法简介 图像风格迁移算法过程思路 1.VGG对比NS 图像风 ...

  7. 魔棒工具--RegionGrow算法简介

    from: 魔棒工具--RegionGrow算法简介 ps里面的魔棒工具非常好用,是图像处理中非常常用的一个工具,它现在已经是我的c++工具箱中很重要的一员了,我会在以后的时间里把我的工具箱逐渐介绍给 ...

  8. 【数据挖掘】基于划分的聚类方法 ( K-Means 算法简介 | K-Means 算法步骤 | K-Means 图示 )

    文章目录 一. 基于划分的聚类方法 二. K-Means 算法 简介 三. K-Means 算法 步骤 四. K-Means 方法的评分函数 五. K-Means 算法 图示 一. 基于划分的聚类方法 ...

  9. AI - 常见算法简介(Common Algorithms)

    机器学习常见算法简介 - 原文链接:http://usblogs.pwc.com/emerging-technology/machine-learning-methods-infographic/ 应 ...

最新文章

  1. jenkins邮件配置
  2. Vigenère 密码
  3. 【智力问题】25匹马赛跑,每次只能跑5匹马,最快能赛几次找出跑得最快的3匹马?赛跑不能计时,并假设每匹马的速度是恒定不变的。...
  4. PMP每日三题(2022年2月15日)
  5. jhipster 配置 mysql_java – 将jhipster后端和前端分成两个项目?
  6. GDUFE ACM-1045
  7. 【深圳】.NET 技术分享交流会
  8. 1037C. Equalize
  9. winform防止sqlserver注入_c# 防止sql注入对拼接sql脚本的各个参数处理
  10. 作业 输出演练 1751
  11. 奥鹏计算机基础2021,18春北语《计算机基础》作业3(参考答案)
  12. python 中有x y y x吗_Python: x += y 与 x = x+y 的区别
  13. Java语言词法分析器
  14. 人寿保险分红型的十年能取出来吗?
  15. 光流(三)--LK算法改进(金字塔LK)
  16. 如何解决“这台电脑上已经安装了更高版本的Bonjour”
  17. 深度精简版xp 安装并使用iis
  18. 人口红利消失,电销要怎么做才能立足市场?
  19. mysql_native_password_连接报错'mysql_native_password'
  20. 磁悬浮惯性动量轮技术_第2章_磁悬浮惯性动量轮的总体结构

热门文章

  1. cpu集成显卡性能排行(独立显卡和集成显卡哪个更好)
  2. android 语音发短信,谷歌Android增加语音操作功能 可语音发短信
  3. 【每日一题】宝石与石头
  4. Geohash算法的概括
  5. 三星全球首发量产512GB eUFS3.0闪存芯片 速度达2100MB/s
  6. ALtera DE2开发板学习01
  7. springboot集成redis报错找不到bean
  8. Java--反射(框架设计的灵魂)
  9. 最小公倍数与最大公因数
  10. apk瘦身 提高优化效果