【UE4】PMC程序化生成戈德堡多面体详解(六边形星球)
游戏实机录屏
【魔方超新星】30天独立开发PCG Minigame《盖亚计划》作品展示,尚有不足,大佬轻喷
目录
游戏实机录屏
一、简介
二、设计思路
2.1 Disco Ball
2.2 Fibonacci Sphere
2.3 Goldberg Polyhedron
2.3.1 细分+对偶(最终方案)
2.3.2 对偶+截角(更优)
三、参考文献
一、简介
在制作Minigame初期,游戏风格想模仿《文明6》与《Polygonal Planet Project》by Oskar Stålberg(PCG巨佬,一人做出震惊业界的《Townscaper》),结合WFC算法程序化生成一些风格不同的星球。
二、设计思路
球形建模主要包含Disco Ball、Fibonacci Sphere与Goldberg Polyhedron三种,速览移步最终方案2.3.1。
2.1 Disco Ball
面片分布不均匀,南北两极过密,放弃该方案。
2.2 Fibonacci Sphere
立方体投影在球面形成的“斐波那契球体”表面网格分布较为规则,但立方体顶点处面结构也比较特殊,不易存储面片邻接关系,放弃该方案。
2.3 Goldberg Polyhedron
相比之下,戈德堡多面体面片分布显得十分均匀,但由于六边形无法平铺在球体表面,会出现少量的五边形,类比足球。下面借助Procedural Mesh Component管理Vertice与Triangles数据,进行绘制。
2.3.1 细分+对偶(最终方案)
1.首先根据二十面体的点面信息,将其绘制出来;
2.在每条边的中点添加顶点,更新面片信息重新绘制,达成细分的目的;
3.细分后计算球体半径,将所有顶点位置移动到球面上;
//Icosahedron Info
const float phi = (1 + sqrt(5)) / 2.0;
const float radius = sqrt(1 * 1 + phi * phi);const float X = 1.f;
const float Z = phi;
const float N = 0.f;static const TArray<FVector> constVertices =
{{-X,N,Z}, {X,N,Z}, {-X,N,-Z}, {X,N,-Z},{N,Z,X}, {N,Z,-X}, {N,-Z,X}, {N,-Z,-X},{Z,X,N}, {-Z,X, N}, {Z,-X,N}, {-Z,-X, N}
};static const TArray<FVector> constTriangles =
{{0,4,1},{0,9,4},{9,5,4},{4,5,8},{4,8,1},{8,10,1},{8,3,10},{5,3,8},{5,2,3},{2,7,3},{7,10,3},{7,6,10},{7,11,6},{11,0,6},{0,1,6},{6,1,10},{9,0,11},{9,11,2},{9,2,5},{7,2,11}
};
4.构建细分多面体相对应的对偶多面体(一种多面体的每个顶点均能对应到另一种多面体上的每个面的中心),即可得到戈德堡多面体。求对偶的思路是将细分多面体上每个面的中心点作为对偶多面体上的顶点,细分多面体上与顶点相连的边确定对偶后每个面上的5/6个顶点,通过数学方法对这5/6个顶点的编号进行排序,再确定新的面片关系进行绘制(一个六边形/五边形可以拆分成三个面片)。
5.最后只需调整半径大小、细分级别,即可获得不同的戈德堡多面体。
2.3.2 对偶+截角(更优)
上面的方法精确度不够高,在后期制作时发现面片大小轻微有所不同。由于时间问题,最后也没找到改进的办法。理论上来讲,下述方式会明显提高精确度,但点面关系的维护也会增加难度,感兴趣的小伙伴可以试试,欢迎交流。
三、参考文献
- Procedural Planet Generation 2014/09/30 by Andy Gainey —— experilous
- Mathematically producing sphere-shaped hexagonal grid —— stackoverflow
- Coding Adventure: Procedural Moons and Planets —— Youtube
- 开源Polyhedrons —— OpenProcessing
- 开源Geodesic Dome —— OpenProcessing
- 对偶Dual polyhedron —— Wikipedia
- 戈德堡多面体Goldberg polyhedron —— Wikipedia
- 截角Truncation (geometry) —— Wikipia
【UE4】PMC程序化生成戈德堡多面体详解(六边形星球)相关推荐
- pandas新字段(数据列)生成、使用np.where或者apply lambda函数结合if else生成新的字段,详解及实战
pandas新字段(数据列)生成.使用np.where或者apply lambda函数结合if else生成新的字段,详解及实战 pandas apply用法: pandas apply方法的作用原理 ...
- java 生成dump_java dump文件怎么生成和分析-JMAP用法详解
jmap是java自带的工具 1. 查看整个JVM内存状态 jmap -heap [pid] 2. 查看JVM堆中对象详细占用情况 jmap -histo [pid] 3. 导出整个JVM 中内存信息 ...
- Php公钥加密data是空,php 生成加密公钥加密私钥实例详解
php 生成加密公钥加密私钥实例详解 生成公钥私钥 win下必须要openssl.cof支持 liunx一般已自带安装 $config = array( //"digest_alg" ...
- python自动寻路算法_PHP生成迷宫及自动寻路算法详解
如何使用PHP生成迷宫以及寻路求解?本文主要介绍了PHP生成迷宫及自动寻路算法,并对PHP生成迷宫及自动寻路算法详解.希望对大家有所帮助. 本文实例讲述了PHP树的深度编历生成迷宫及A*自动寻路算法. ...
- ue4移动到一定距离_UE4移动组件详解(一)——移动框架与实现原理
原文链接(转载请标明):UE4移动组件详解(一)--移动框架与实现原理_Jerish的博客-CSDN博客blog.csdn.net 前言 关于UE4的移动组件,我写了一篇非常详细的分析文档.由于篇幅 ...
- vue-cli生成的模板各个文件详解(转)
vue-cli脚手架中webpack配置基础文件详解 一.前言 原文:https://segmentfault.com/a/1190000014804826 vue-cli是构建vue单页应用的脚手架 ...
- C语言随机数的生成及三个具体案例详解
随机数的生成及三个具体案例 rand函数 srand函数 实例一:生成10个随机数(不限制大小) 实例二:生成10个随机数并排序 实例三:猜数字游戏 rand函数 首先,我截取了关于rand函数的文档 ...
- PHP计算德摩根定律,德·摩根定律详解
一. 德·摩根定律 非(A且B) = (非A) 或(非B) 非(A 或B) = (非A) 且(非B) 1.德·摩根定律确实让人头疼,下面为大家具体详解 由图片可知 A=1+2 ;B=2+3 ;c=4 ...
- UE4制作多语言游戏(本地化功能详解)
本文参考: http://blog.csdn.net/lzt20007/article/details/51308702 https://www.indienova.com/u/trombe/blog ...
最新文章
- POJ-1041 John's trip
- 入选CVPR 2022!一举打败16个同类模型,视频超分比赛冠军算法!
- 把二元查找树转变成排序的双向链表
- tf.where 用法
- 深入理解pts,dts,time_base
- WIFI配置专项测试
- Qt::WA_QuitOnClose用法
- leetcode 659. 分割数组为连续子序列(贪心算法)
- 田渊栋教你读paper的正确姿势
- 稀疏表示(Sparse representation)原理理解
- 电脑怎么把大量音频合并
- 解决checkbox复选框未选中时不传值的问题 / 判读复选框是否选中
- 如何积累人生的第一桶金
- 【2021版】吐血整理_专升本计算机文化基础—Excel2010
- Unity学习笔记 - API
- Android开发随手记录
- cocos2d 传送门
- 2020年起重机司机(限桥式起重机)考试题及起重机司机(限桥式起重机)考试技巧
- 【python学习】-matplotlib绘图如何将坐标轴刻度值设置为科学计数法形式
- 文件10:文件路径-信息查询方法
热门文章
- 服务器硬盘灯不亮 阵列是正常的,服务器磁盘阵列出现故障有哪些解决办法?...
- 苹果恢复出厂设置系统也会还原吗_手机恢复出厂设置会影响使用吗?听听专业人士看法,减少后顾之忧...
- Flutter App 软件测试指南
- 解决Apache提示“You don‘t have permission to access...“错误
- Ubuntu下mingw和aarch64交叉编译x264/x265/openssl/freetype2的ffmpeg
- 智能时代为什么需要区块链技术?
- 数据库题:查出来既学了课程号1又学了课程号2的学生学号
- 规划xr871实现儿童故事机的基本功能
- firewall添加白名单_详解firewall的规则设置与命令(白名单设置)
- 一篇爽文带你全面了解mysql的索引