Как я могу генерировать шум Perlin на сферической поверхности?

Я пытаюсь создать местность, используя шум Перлина. Я понимаю, как сгенерировать его с помощью декартовых координат, но не могу понять, как он будет работать на сфере. Я знаю, что вы можете проецировать 2D-поверхности на сферы, но разве искажение не испортит распределение шума? Лучшая идея, которую я могу придумать для создания равномерного шума на поверхности сферы, - сопоставить точку на сфере с 3D-декартовой координатой и использовать функцию 3D-шума. (В основном, чтобы создать куб шума и" сбрить " углы, чтобы сделать его круглым, как это было. Есть ли лучший метод, которого мне не хватает?

2 ответов


настоящая головоломка здесь заключается в том, как изменить базовые функции шума Перлина (называемые октавами?), которые определяются с использованием частоты и амплитуды так, что они находятся над сферой вместо N-мерной плоскости.

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

вы можете сделать что-то немного причудливее, если хотите, чтобы ваши базовые функции различались по-разному в двух измерениях, но вам понадобится второй параметр направления для ориентации проекции. Вам также нужно будет рассчитать два угловых расстояния. Хотя это может оказаться перебором. Если у вас есть куча базисных функций, круговые шаблоны алгоритма выше могут полностью размытие друг друга, поэтому я сначала попробую простое решение.

используя эти базисные функции шума Perlin, теперь вы можете оценить свой шум Perlin над сферой как сумму кучи из них. Решите ли вы тесселировать сферу и оценить углы вершин, зависит от вас. Вот что бы я сделал.


Я считаю, что подход-использовать 3-мерные поля шума (каждая точка в 3D пространстве скалярное значение шума) в отличие от двумерного поля 2 (каждая точка на 2D плоскости имеет значение шума).

при использовании функции 2D-шума для создания карты высоты вы смещаете значение z в соответствии со значением шума.

при использовании 3D-поля вы пробуете шум в точках на поверхности сферы, а затем используете значение шума для смещения каждой точки в радиальном направлении прочь от центра сферы или к нему.

3D-шум сложнее и медленнее производить, очевидно, но вам не нужно иметь дело с осложнениями обертывания поверхности вокруг сферы, и поскольку функция шума непрерывна, швов нет.

Это, очевидно, может быть применено к любой произвольной форме.