我想有效地为给定表面上的物体生成位置。正如您可能猜到的那样,这是一个游戏。表面实际上是一个 3D 地形,但是第三个维度并不重要,因为它是由地形高度决定的。
问题是我想以最有效和最简单的方式做到这一点,但仍然会得到很好的结果。我所说的“自然”是指 mentoined in this article about Perlin noise . (树木形成森林,大到小群散布在土地上)这个方法很好,但太复杂了。我需要经常这样做,并且最好不要涉及更多纹理,即使以更差的性能为代价(因此结果不会那么漂亮,但仍然足以提供带有植被的漂亮自然地形)。
放置的物体数量各不相同,但通常在 50 个左右。一个很好的改进是以某种方式限制物体在海拔非常高的区域(山脉)的放置,但我想这可以通过放置更多的物体和删除位于给定高度以上的那些。
最佳答案
这可能不是您正在寻找的答案,但我相信 Perlin Noise 是您问题的解决方案。
Perlin Noise 本身不涉及纹理;我相信你对它是什么有误解。对于您的目的,它基本上是一个 2D 索引,对于每个点,一个介于 0 和 1 之间的值。您不需要生成任何纹理。参见 this description它的更多信息和优雅的解释。 Perlin Noise 的基础知识涉及制作一些随机噪声图,从一个点很少的图开始,每个新图都具有两倍多的随机点(和较低的振幅),然后将它们相加。
特别是,如果您的 map 是离散平铺的,您甚至不必以高分辨率生成噪声 :)
您打算“多久”执行一次此操作?如果您打算每帧执行 10 次以上,那么 Perlin Noise 可能不会是您的答案。但是,如果您每隔几秒(或更短)执行一次,那么我认为您不应该担心对速度的影响——至少, 对于 2D Perlin 噪声。
建立它,你可以看看this question以及我个人对此的回答,即尝试做一些与您正在尝试做的事情非常相似的事情。基本步骤包括:
生成柏林噪声;更高的湍流 = 更少的聚集和更多的孤立特征。
设置一个“阈值”(即 0.5)——高于此阈值的任何值都被视为“开启”,高于该阈值的任何值均被视为“关闭”。阈值越高 = 频率越高,阈值越低 = 频率越低。
用您制作的任何东西填充“on”图 block 。
这里有一些 Perlin Noise 示例,用于生成基于 50x50 图 block 的 map 。请注意,两者性质之间的唯一区别是“阈值”。更大的团 block 意味着更低的阈值,更小的团 block 意味着更高的阈值。
关于c# - 如何以 "natural"方式高效地在 2D 表面上展开对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3135724/