如何平滑我的地形发生器?

Joe*_*son 6 java random algorithm noise terrain

我正在尝试一种新的随机景观生成算法.这种方法是我的想法,所以它可能变得不可能.与此同时,我正试图解决这个问题.

    public static void generate(){
    for(int x = -64; x <= 64; x++){
        for(int y = -64; y <= 64; y++){
            double val = 2d;
            for(int i = x - 4; i <= x + 4; i++){
                for(int j = y - 4; j <= y + 4; j++){
                    double w = Math.pow(hypotenuse(x, y, i, j), 1);
                    val += (1 * (random(i, j) / w));
                }
            }
            tileSet(x, y, val);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

在我解释这段代码之前,让我说这是一个2D游戏,因此高度图是瓷砖的类型而不是实际高度.水最低(0),然后是沙子,草和树(3).为了测试,我在两个维度中从-64循环到64.对于每个图块,声明一个值(以2或草开头).然后,我们循环解决此瓦(-4至4是任意金额,我能够通过修改这个值来实现效果显著差异,但好像4没关系).现在,变量w代表重量.每个(i,j)点离(x,y)越远,随机值在加到val之前给出的权重越小.我已经尝试了w的不同指数,下一行的不同乘数(在这个例子中两个情况都是1); 较低的指数和乘数似乎扩大了最终结果而不必平滑,较高的指数则相反,你会得到更多的树更接近水,中间的草和沙更少.

这是方法random()

public static double random(int x, int y){
    Random random = new Random(seed * 17717171L + x * 22222223L + y * 111181111L);
    return random.nextGaussian() / 2d;
}
Run Code Online (Sandbox Code Playgroud)

在那些内部循环完成之后,设置x,y的值.

这是一次运行

太粗糙了

这是.5的乘数,意思是 val += (.5 * (random(i, j) / w));

还是太粗糙了

正如你所看到的,有更多的沙子和草,更少的树木(和整体水),但仍然是一样多的小颠簸.因此它无法有效地改变规模.

感谢您的时间!

And*_*nes 1

您所做的称为反距离加权。正如文章指出的,关键参数是权重的指数。所以在你的代码中,尝试

double w = Math.pow(hypotenuse(x, y, i, j), p);
Run Code Online (Sandbox Code Playgroud)

采取等p0.25, 0.5, 1.0, 2.0,

另外,您的算法还有一个细微的变化,可能会使算法的推理变得更容易:不是为每个单元格生成随机值并将其添加到相邻单元格,而是首先在每个单元格角生成随机值,然后使用反距离从细胞中心测量权重来计算细胞值。

使用此方案,对像元值有贡献的随机值都以统一的方式处理,而不是一个随机值获得权重 1,而其他随机值获得反距离加权。

如果您还没有遇到过梯度噪声,您可能也对它感兴趣。