Java - шум Перлина, который зацикливается

Мне нужно сгенерировать текстуры для трехмерных планет (сфер) на Java с помощью написанной мной программы Perlin Noise. Но загвоздка в том, что левое и правое должны быть одинаковыми, а также верх и низ, чтобы вы могли наложить текстуру на сферу.

Я не могу поместить здесь источник шума перлина, потому что он слишком длинный, но в основном он основан на http://devmag.org.za/2009/04/25/perlin-noise/


person Community    schedule 28.08.2012    source источник


Ответы (2)


Шум перлина работает так, что он интерполирует значения сетки.

Для этой цели больше подходит симплексный шум (иначе плотность шума не будет одинаковой на полюсах, так как нельзя правильно замостить сферу квадратами).

Вам нужно будет разделить свою сферу на симплексы (треугольники в вашем случае), а затем для каждого угла треугольника (только один раз на точку) рандомизировать значение.

Затем вы можете рассчитать текстуру в каждой точке треугольника путем интерполяции методом симплексного шума.

person Clement Bellot    schedule 28.08.2012

Если ваша функция шума масштабируется до 4D, вы можете передать x,y,z,w координатами двух 2D-кругов. Результирующее изображение будет оптимально расположено как по осям 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, попробуйте любую из существующих реализаций симплексного шума.

person Community    schedule 21.09.2012