巴拉巴

 找回密码
 立即注册

站内搜索

搜索
热搜: 活动 交友 discuz
查看: 10|回复: 1

体素地形(二)

[复制链接]

8

主题

8

帖子

24

积分

新手上路

Rank: 1

积分
24
发表于 2022-11-27 10:36:37 | 显示全部楼层 |阅读模式
好吧,其实冒险早就开始了 XD
相对于高度图的地形实现, 体素地形最大的优点就是容易在运行时修改, 还有就是可以完整的体现空间结构,比如挖洞, 一些镂空的结构等.反应在游戏性上就是可以提供完全的地形交互, 想想可以做到像在mc中一样挖挖挖搭搭搭, 真是有趣呢
缺点其实感觉非常多~
首先是性能问题, 要展现非块状的地形(非MC那种纯方块的), 要用到表面重建算法(或者叫等值面提取),就是从体素数据中重建地形Mesh. 在初始化或者用中间数据还原地形的时候,会有大量的实时计算
然后是地形的表现精度, 内存的开销和体素数据的存储等等一系列取舍问题.
假设1个体素单元格的size是1米, size1 米的体素单元重建的地形精度表现上感觉只是差不多够用, 那么一个长宽高1公里的空间就可能有1000*1000*1000个体素, 于是我曾经很天真的创建了个数组
int arr = new int[1024, 1024, 1024];
运行直接 out of memory, 掐指一算, 一个int 4B, 乘第一个1024 是4KB, 第二个4MB,第三个4GB, 呃...
所以体素数据的保存会是相当头大的问题, 反正数组这种均匀的结构就不大行,要基于坐标来访问数据. 实际操作起来, 内存和储存空间的需求会是惊人的,参考一下现有的游戏是啥情况
Minecraft 可以几乎无限的生成世界(虽然有上限,但是相当大), 所以不可能保存全部的生成结果, 应该是记录修改的部分, 还原的时候, 和即时生成的部分拼合成现有的结果.单人游戏的时候,存档大小增速不明显, 但是活跃的多人服务器上会很快失控...
no man's sky 也是几乎可以无限的生成星系和星球, 处理方法应该和mc类似, 储存修改的部分和即时生成的结果拼合.no man's sky 应该就是典型的体素数据 + dual Contouring 构建地形, 可以自由更改地形,但是总是感觉地形精度不高, 这也是体素地形的问题.因为是从有限的数据中尽可能生成好的结果, 最终还是要在体素密度,计算量和数据量上做取舍
Terraria 就有点不同, 因为是2D游戏,加上有限的世界边界, 创建世界的时候保存了完整的体素数据, 因为并没有数据量压力. 也是因为保存有完整的体素数据所以游戏内的一些机制很好的利用了它.像是神圣和腐化/血腥地块的扩散, 草皮的蔓延等
即时生成+保存变动 和 保存完整的体素数据相比较的话, 前者会消耗一些算力在即时生成上,可以提供更大的可探索空间, 后者的话,虽然空间有限,但是可以提供一些其他可能性.
比如想要做一些精细的生态规则, 和世界的自我演化, 即时生成的方案就比较困难, 一是不容易确定在某个远离当前生成区域的位置的结构以及它周围的状况, 二是演化的结果无处保存 (演化和传播会产生大量需要保存的数据). 保有相对完整的体素数据的话, 生态和演化结果就有了载体. 比如推演植物生长,扩散传播; 水的循环 ;外力对地形造成的影响(水蚀,风蚀,来自生物群落或者npc行为的影响);根据规则迭代出的历史痕迹等等.但是要保存如此大量的结果,可能要绞尽脑汁想办法了.

来源:http://www.yidianzixun.com/article/0kTtkuub
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

5

主题

13

帖子

28

积分

新手上路

Rank: 1

积分
28
发表于 2025-6-10 18:28:28 | 显示全部楼层
众里寻他千百度,蓦然回首在这里!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

  • 返回顶部