Как избежать шаблонов при создании случайного перлин-шума

Я делаю генератор шума 3d Perlin. Важно, чтобы координата была начальным числом, чтобы оно каждый раз давало мне одно и то же случайное значение (шум никогда не сохраняется). Это моя функция для генерации случайных значений на основе начального числа, которое является координатой:

__forceinline float getRandomField(const vec3& Position) const
{
uint32_t seed = uint32_t(Position.x);
seed <<= 8;
seed ^= 0xE56FAA12;
seed |= uint32_t(Position.y);
seed <<= 8;
seed ^= 0x69628a2d;
seed |= uint32_t(Position.z);
seed <<= 8;
seed ^= 0xa7b2c49a;

srand(seed);

return (float(int(rand()%2001) -1000)/1000.0f);
}

Результат (срез в плоскости x, y):

Шум Перлина с нежелательным рисунком

Как ни странно, это дает мне образец. Очевидно, я понятия не имею, что я делаю. Я думал, что если применить некоторые странные значения xor и сдвиг битов в случайное начальное число, я получу случайное число. Видимо я был не прав.

Каков наилучший способ создать случайное значение из координаты без получения шаблона?

3

Решение

Просто чтобы дать ответ другим людям, которые могут иметь такую ​​же проблему. Я нашел тот, который дал довольно хороший результат. Мне даже не нужна функция rand ().

__forceinline float getRandomField(const vec3& Position) const
{
uint32_t seed = uint32_t(Position.x)*1087;
seed ^= 0xE56FAA12;
seed += uint32_t(Position.y)*2749;
seed ^= 0x69628a2d;
seed += uint32_t(Position.z)*3433;
seed ^= 0xa7b2c49a;

return (float(int(seed%2001) -1000)/1000.0f);
}

Ключ заключается в умножении каждой оси на простое число. Я нашел их в Википедии:
1087,2749,3433.
Шестнадцатеричные значения с xor’ed просто случайно выбиты мной. Насколько я знаю, они не простые числа. Проверьте результат:

Неплохо, а?

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]