矿物棉厂家
免费服务热线

Free service

hotline

010-00000000
矿物棉厂家
热门搜索:
技术资讯
当前位置:首页 > 技术资讯

阐述使用circlepacking运算法则集中对象的方法

发布时间:2021-01-22 05:18:14 阅读: 来源:矿物棉厂家

目前我正在处理的问题是3D游戏世界中的对象分布和产生。从理论上来说,我正在构建的游戏世界的每个主方向都是无限的。随着玩家在世界中移动,游戏不断构建地形patch。地形上呈现的对象主要是发挥装饰作用,其存在的目标是使世界看起来更加具体而充实。

那么,要如何决定这些对象在地形中的位置呢?

Halton Sequence(from stuartdenman)

我首先尝试的是使用两个Halton序列生成坐标的伪随机分布方法。听起来感觉很怪异,但这确实是“类随机”值生成的过程,数值在0到1的范围内变动,这取决于你选择的数值基础。我使用2作为X的数值基础,3作为Y的数值基础。这种运算法则的好处在于,它创造横纵轴范围为[0,1]的一致分布。这与地形的其他patch很契合,比如谜题片段。通过这种数值序列,该运算法则能够避免重叠对象的出现。

我不得不感谢Andrew Willmott及其位于Maxis的团队,他们致力于Halton Sequence运算法则和许多其他绝妙的想法,将其运用于《孢子》和《Sigraph》等游戏中。你可以在网络上找到与他们有关的文章和视频。《孢子》是款罕见的游戏,它让人们看到程序生成内容和艺术化工程的潜力。

这种方法的效果确实很不错,但我的对象相当大,不像Andrew在《孢子》中添加的草和灌木。采用这种方法会让我的地形上布满各种各样的对象,从而导致游戏中没有足够的移动空间。

我觉得,我需要尝试将对象集中起来。这样,我能够在维持对象数量不变的前提下,营造出更具艺术性和国际化的视觉效果。我花了一天的时间来思考如何实现,睡过一觉后,我意识到使用简单的circle packing运算法则便可以解决这个问题。用圆圈来代表对象的“个体空间”。

正如所有构建对象视觉效果原型的工程师那样,我开始仿制原型(注:作者无法在Gamasutra博文中添加APPlet,但已将动作效果和源代码发布到其个人博客上)。

circles(from gamasutra)

在每次运行中,这个applet都会重复上百次,随后圆圈停止在某个地方。它的效果很像spring/particle physics系统,使用relaxation重复移动对象直到他们最终达到平衡。每个圆圈都会将对象相互远离,然后令对象向集中点靠近。我希望这个过程能够更快,而且它只需要处理少数对象即可。

所以我对其进行了些许修改,以下便是得到的结果。

iteration(from gamasutra)

在这个新原型中,圆圈以大小进行分类,这样relaxation算法就会将小圆圈向外推,这正是我想要的结果。对于为数不多的Halton Sequence坐标都会出现对应的集中效果,这样它们之间就能够保持一定的距离。

双彩网下载

精灵计划内购破解版

风流霸业

梦想总动员之勇闯梦境最新版