Когерентный сферический шум?

Кто-нибудь знает, как я мог бы генерировать следующий вид шума?

  • Три входа, три выхода
  • Выходные данные всегда должны приводить к вектору одинаковой величины
  • Если он получает тот же вход, что и в другой раз, он должен вернуть тот же вывод
  • Он должен быть непрерывным (лучше всего, если он выглядит гладким, как шум Перлина)
  • Это должно казаться довольно случайным

РЕДАКТИРОВАТЬ: Было бы также хорошо, если бы он был изотропным, но это не совсем необходимо.

1 ответ

Решение

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

vec3 sphereNoise(vec3 input, float radius)
{
    vec3 result;
    result.x = simplex(input.x, input.y); //could use perlin instead of simplex
    result.y = simplex(input.y, input.z); //but I prefer simplex for its speed
    result.z = simplex(input.z, input.x); //and its lack of directional artifacts

    //uncomment the following line to make it a spherical-shell noise
    //result.normalize();
    result *= radius;
    return result;
}
Другие вопросы по тегам