【问题标题】:how to understand Perlin Noise and how to use it? [closed]如何理解 Perlin Noise 以及如何使用它? [关闭]
【发布时间】:2014-12-10 21:58:10
【问题描述】:

我现在很绝望。搜索了每个角落和所有东西,但我仍然无法.. 我正在寻找如何使用噪声在 java 中生成平铺的 2d 地图。这是我在编程中唯一想知道的。对我来说最好的学习方法是查看某事物的完整简单代码并通过测试对其进行分析。有没有人可以给我看一段视频或者给我看一个简单的小代码来说明它是如何工作的? 我只是不明白怎么做。如果它是简单的英语会很好,因为我不能真正理解复杂的单词。

【问题讨论】:

    标签: java tiles noise perlin-noise


    【解决方案1】:

    您实际上可能想跳过 Perlin Noise 并查看名为 OpenSimplex Noise 的内容。

    Perlin Noise 是一种较旧的算法,往往会出现明显的网格伪影。它倾向于沿基轴和 45 度对角线排列其所有特征。

    OpenSimplex 噪声对于与 Perlin 噪声基本相同的所有事情都很有用:噪声采用输入点(在 2D、3D 或 4D 中)并返回介于 -1 和 1 之间的值。输出值随输入坐标变化。

    如果您有兴趣了解该算法在技术层面的工作原理......基本上它需要一个 [math]n 维 hypercubic tiling(正方形、立方体、正方体......)并将其沿主要方向拉伸对角线以形成simplectic honeycomb。然后它伪随机地选择每个顶点的梯度方向,外推它们,并将它们乘以基于距离的函数(“内核”),该函数在一定半径后变为零并保持为零。输入点被“倾斜”以找到超立方蜂窝基上的有效坐标,然后通过基于超立方空间坐标的快捷数学来确定它在单晶蜂窝上的哪些形状,并从那里确定哪些顶点有助于那个时候的价值[/math]....但是好消息是你不需要为了简单地使用它!

    要使用它,请将 OpenSimplexNoise.java 放到您的目录中,然后执行以下操作:

    OpenSimplexNoise noise = new OpenSimplexNoise(); //May provide seed as argument to generate different patterns.
    for (int y = 0; y < 256; y++) {
        for (int x = 0; x < 256; x++) {
            double value = noise.eval(x / 32.0, y / 32.0, 0.5); //2D slice of 3D at z=0.5
            //Now do whatever you need to do with the value.
        }
    }
    

    这是 Perlin 噪声和 OpenSimplex 噪声之间差异的演示: 顶部是 Perlin,底部是 OpenSimplex。两者都是 3D 函数的 2D 切片。最左边是基本的noise(x,y,0)纹理,接下来是黑色/白色的负片/正片,接下来是黑色,|noise(x,y,0)|

    请注意,还有一种称为 Simplex Noise 的算法,其工作方式与 OpenSimplex Noise 不同。 Simplex Noise 是由同一个人 Ken Perlin 在 Perlin noise 之后开发的,但不幸的是 3D+ 版本背负了专利。 OpenSimplex Noise 实际上是我自己开发的,作为游戏开发项目的一部分,可供任何人使用。

    【讨论】:

    • 谢谢,我会试试看的。
    • 所以您创建了 openSimplex 噪声?是否有版权?我打算直接将它用于我的代码。到目前为止,我不打算赚一毛钱,但我想问一下以防万一。
    • @WVrock 刚刚看到这个。我在公共领域发布了代码,所以我没有版权声明!不过,我最近发布了这个:github.com/KdotJPG/OpenSimplex2 我认为它会产生更好的结果,尤其是平滑版本。
    猜你喜欢
    • 1970-01-01
    • 2018-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-05
    • 2021-06-19
    • 2013-06-13
    • 1970-01-01
    相关资源
    最近更新 更多