c# - 如何以 "natural"方式高效地在 2D 表面上展开对象?

标签 c# performance object xna random

我想有效地为给定表面上的物体生成位置。正如您可能猜到的那样,这是一个游戏。表面实际上是一个 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以及我个人对此的回答,即尝试做一些与您正在尝试做的事情非常相似的事情。基本步骤包括:

  1. 生成柏林噪声;更高的湍流 = 更少的聚集和更多的孤立特征。

  2. 设置一个“阈值”(即 0.5)——高于此阈值的任何值都被视为“开启”,高于该阈值的任何值均被视为“关闭”。阈值越高 = 频率越高,阈值越低 = 频率越低。

  3. 用您制作的任何东西填充“on”图 block 。

这里有一些 Perlin Noise 示例,用于生成基于 50x50 图 block 的 map 。请注意,两者性质之间的唯一区别是“阈值”。更大的团 block 意味着更低的阈值,更小的团 block 意味着更高的阈值。

一片森林,有蓝色的树木和棕色的灌木丛 Sparse Forest

沼泽,较深的区域被较浅的区域包围 Marshes

关于c# - 如何以 "natural"方式高效地在 2D 表面上展开对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3135724/

相关文章:

c - 提高SQLite每秒INSERT的性能?

javascript - 我收到错误消息 : "Cannot read property ' push' of undefined"

c# - 没有从 Exocortex FFT 获得预期的输出

c# - Knights Tour 递归 C# 我做这些事情的方式有问题

ios - 如何找出高能和cpu影响的原因?

javascript - 数据表 mRender "object is not a function"错误

python - 在 Python 中,什么时候函数不需要对象前缀?

c# - 无法获取 TextBox 值 OnRowUpdating

c# - 在 .NET Framework 2.0 中使用扩展方法

c++ - 将大图像切片为 10x10 图像的有效方法(opencv)