java - OpenSimplexNoise 更高的细节级别

标签 java perlin-noise procedural-generation simplex-noise simplex-algorithm

我对世界生成和用于它们的算法很陌生,所以我希望有人能给我一些有用的解释或代码或两者兼而有之,或者链接到我在寻找解决方案时错过的一些资源。

如何使用 OpenSimplexNoise 获得更高的细节级别?

我知道在像 PerlinNoise 这样的算法中可以通过频率来完成 并将多个 Octave 相加。 那么我怎样才能用 OpenSimplexNoise 实现这样的事情呢?

这是我已经得到的:

    private static final int WIDTH = 512;
private static final int HEIGHT = 512;
private static final double FEATURE_SIZE = 64;

public static void main(String[] args)
    throws IOException {

    OpenSimplexNoise noise = new OpenSimplexNoise(1233313l);
    BufferedImage image = new BufferedImage(WIDTH, HEIGHT, BufferedImage.TYPE_BYTE_INDEXED);
    for (int y = 0; y < HEIGHT; y++)
    {
        for (int x = 0; x < WIDTH; x++)
        {
            double value = noise.eval(x / FEATURE_SIZE, y / FEATURE_SIZE);
            int rgb = 0x010101 * (int)((value + 1) * 127.5);
            image.setRGB(x, y, rgb);
        }
    }
    ImageIO.write(image, "png", new File("noise1.bmp"));
}

我怎样才能实现它以获得更平坦的森林等结果?

最佳答案

OpenSimplexNoise 不直接提供您所描述的功能,因此您需要自己提供。基本上,您会重复生成一层噪声并将其添加到最终结果中。更具体地说:

  • Octave 音阶数由循环次数控制。
  • 通过将给定层的值乘以某个值来控制层的幅度。振幅通常由倍频程数得出;最常见的示例是使用 1/(2^n),其中 n 是当前 Octave 音阶的编号。
  • 可以通过调整采样间隔来控制频率。对于 OpenSimplexNoise,您可以通过将 x y z 参数乘以一定数量来实现这一点。同样,这通常是从 Octave 数得出的,最常见的例子是 2^n

调整 Octave 音阶数、振幅和频率值更多的是一门艺术而不是一门科学,并且很大程度上取决于您的情况。进行一些实验并研究其他人使用过的方法来找到最适合您的项目的方法。我使用 6 个 Octave 音阶以及上述标准幅度和频率得到了很好的结果。

关于java - OpenSimplexNoise 更高的细节级别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39256678/

相关文章:

java - OrderItem (order_orderID) 中的 Hibernate 外键为 null

opengl - C++ OpenGL Cube Map Perlin Noise to Sphere

algorithm - 包装 2D 柏林噪声

c++ - Perlin Noise 算法似乎不会产生梯度噪声

algorithm - 什么是 3D 更快? Perlin 或 Simplex 噪声?

opengl - 在顶点着色器中置换顶点

rendering - RealityKit 如何在运行时创建自定义网格?

java - JSch:从存储在 hdfs 上的私钥添加身份

java - 使用 XSLT 格式化 XML 转换的输出以生成文本文件

java - 在Java中发现驱动类中没有参数