0

我需要使用我编写的柏林噪声程序在 Java 中为 3D 行星(球体)生成纹理。但要注意的是左右需要相同,上下也需要相同,这样您才能将纹理放在球体上。

我不能把 perlin 噪声源放在这里,因为它太长了,但它主要基于http://devmag.org.za/2009/04/25/perlin-noise/

4

2 回答 2

1

柏林噪声的工作方式是它在网格值之间进行插值。

为此,单纯形噪声会更合适(否则两极处的噪声密度将不一样,因为您无法用正方形正确地铺设球体)。

您需要将球体划分为单纯形(在您的情况下为三角形),然后对于每个三角形角度(每个点仅一次),随机化一个值。

然后,您可以通过使用单纯形噪声方法进行插值来计算三角形每个点的纹理。

于 2012-08-28T07:47:57.187 回答
1

如果您的噪声函数缩放到 4D,那么您可以使用两个 2D 圆的坐标输入 x,y,z,w。生成的图像将在 x 和 y 轴上以最佳方式平铺。

例如(非常草率但为了清楚起见):

float textureSize = 1024.0f;

    for(float i = 0.0f; i < textureSize; i += 1.0f){

      for(float j = 0.0f; j < textureSize; j += 1.0f){

        nx = cos((i / textureSize) * 2.0f * PI);
        ny = cos((j / textureSize) * 2.0f * PI);
        nz = sin((i / textureSize) * 2.0f * PI);
        nw = sin((j / textureSize) * 2.0f * PI);

        looped_noise = noise_4D( nx, ny, nz, nw, octaves, persistence, lacunarity, blah...);
        noise_buffer[((int)i * (int)textureSize) + (int)j] = looped_noise;

      }
    }

如果您的函数无法轻松扩展到 4D,请尝试使用任何单纯形噪声实现。

于 2012-09-21T16:50:33.973 回答