3d Hill生成算法?

时间:2011-08-26 03:51:21

标签: algorithm language-agnostic minecraft

假设你有一个3d框的立方体,每个立方体有3个索引:(x,y,z),还有1个附加属性来指定它是代表陆地还是空中。

假设我们有一个3d数组来表示这个立方体框,每个立方体都是3d数组中的一个元素。

例如,下面的数组代表一个碗形的土地:

y=0:        
0 0 0 0 0     
0 0 0 0 0
1 1 1 1 1
1 1 1 1 1

y=1:
0 0 0 0 0
0 0 0 0 0
1 0 0 0 1
1 1 1 1 1

y=2:
0 0 0 0 0
0 0 0 0 0
1 0 0 0 1
1 1 1 1 1

y=3:
0 0 0 0 0  
0 0 0 0 0
1 1 1 1 1
1 1 1 1 1

什么是算法,如果给定一个选择框,它会生成f频率且平均高度为h,高度平均变化为v的山丘?

我们可以假设粘合盒的最低级别是“基线”或“海平面”。

function makeTrees(double frequency, int height, double variation)
{
    //return 3d array.
}

我正在编写一个Minecraft MCEdit过滤器插件:P

2 个答案:

答案 0 :(得分:2)

最简单的方法是将问题分解为三个部分:

  1. 编写例程以生成单个高度为h的山的立方体。首先让它变成一个简单的圆锥体(用顶角进行游戏,直到找到看起来令人愉悦的东西)

  2. 使用您选择的随机数生成器在h-v和h + v之间生成一组n个高度

  3. 在您的立方体上随机放置n座山脉。它们是否相交并不重要 - 事实上,它会导致更好的范围。

  4. 但是,我还建议放弃这种方法,只需在边界立方体中生成fractal terrain,然后将其离散化。您可以使用分形生成器的参数来限制高度和方差。

答案 1 :(得分:1)

假设您希望频率为f的正弦山丘(或更确切地说,wavenumber f,因为“频率”通常用于时间量),作为半径{{1来自中心:

定义一个这样的阈值函数:

enter image description here

任何带有r = sqrt(x^2+y^2)的元素(x,y,z)都将是陆地,剩下的就是空中。