使用Simplex噪声与八度的高度图:帮助参数和解释

我find了几段代码,其中Simplex噪声的Java代码(基于这个广泛引用的文章 )与八度音符相结合,以获得一个高度图。 然而,这些类/片段不在-1,1范围内,尽管如此,所以我不得不添加一些修改。

通过反复试验和一些大脑工作,我得到了一个在-1和1之间产生输出的版本,在这里(你可以理智地检查它吗?这是正确的吗?)

public static float[][] generateOctavedSimplexNoise(final int width, final int height, final int octaves, final float roughness, final float scale) { final float[][] totalNoise = new float[width][height]; float layerFrequency = scale; float layerWeight = 1f; float weightSum = 0f; for (int octave = 0; octave < octaves; octave++) { // Calculate single layer/octave of simplex noise, then add it to total noise for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { totalNoise[x][y] += (float) noise(x * layerFrequency, y * layerFrequency) * layerWeight; } } // Increase variables with each incrementing octave layerFrequency *= 2f; weightSum += layerWeight; layerWeight *= roughness; } // scale output between -1 and 1, as we are doing // a weighted average for (int x = 0; x < width; x++) { for (int y = 0; y < height; y++) { totalNoise[x][y] /= weightSum; } } return totalNoise; } 

我的理解是, “粗糙度”必须在0和1之间变化 ,并影响最终图像的“平坦度”。 什么“规模”是我无法理解的 – 有什么帮助? 。 另外,在我的testing中,超过6-7倍频程似乎毫无用处,希望这是预期的。

但最重要的是我的问题是: 我如何以自上而下的方式工作? 也就是说,知道我大致想要的地图types(海洋中的一个大岛,有几个湖泊和几座山脉,但大多是平原和山丘),我如何select地形types的参数和阈值?

我试了很多,但似乎无法控制的function,以产生一个不错的地图..

长时间的search把我带到本教程和C ++库libnoise的相应代码中。 有了图片,公式和代码,它会更清晰一些(尽管还有很多工作和学习需要进一步研究,因为我了解如何创建一个具有特定特征的地图,但这恐怕超出了“噪音”)。

这确实使用柏林噪音,而不是单纯的噪音,所以我不知道我将能够重现所有我正在阅读..但是,好吧,希望这是有用的别人。