Доброго времени суток. Не понимаю, как должна быть устроена генерация ландшафтов на сферической поверхности (то есть планет). Лобовой способ генерации "плоского" ландшафта: берем карту высот и вытягиваем в зависимости от цвета z-координату. Нагуглил вот такую штуку: http://mathproofs.blogspot.ru/2005/07/mapping-cube-to-sphere.html. Я правильно понимаю, что мы берем куб, на каждой грани генерируем ландшафт, а потом вот этим преобразованием проходимся по всем координатам и получаем сферу? Не будет ли это слишком накладно? Сходу кажется, что это ужасно неоптимально. И еще: не хочется ведь для каждой грани использовать одну и ту же карту высот. А сделать одну огромную - опять же жутко неоптимально, как мне кажется. Помогите советом, как это делается по-человечески?
Почему не оптимально? Ты же делаешь это не каждый кадр, а один раз при загрузке сцены/генерации части космоса.
Для каждой грани используется своя карта высот, в местах стыков ландшифт должен быть соответствующим.
kasom
Берём сферу и генерируем карту высот в полярных координатах.
Мизраэль
Не будет ли вычисление тригонометрии губительно сказываться на скорости генерации ландшафта?
kasom
в гугл земле и похожих сервисах данные карт хранятся в проекции Меркатора, чтобы пиксели были максимально квадратными.
kasom
> Не будет ли вычисление тригонометрии губительно сказываться на скорости
> генерации ландшафта?
Генерацию лучше делать оффлайн всё же, но если предполагается в реальном времени, то можно сделать высокополигональную геосферу и в рантайме её вершины передвигать. Тригонометрия там не нужна.
kasom
ещё важно, что в итоге хочется получить? простую мультяшную планету, как в Самогонках, большущую планету для стратегической игры или просто шарик для космосима. В последнем случае геометрией вообще можно не заморачиваться.
3d perlin noise
Мизраэль
Скорее "большущую планету для стратегической игры".
Мизраэль
> сделать высокополигональную геосферу и в рантайме её вершины передвигать
Подскажите пожалуйста, правильно ли я понял схему: генерируем сферу, получаем на выходе какой-то буфер вершин. Теперь для каждой вершины можем подсчитать значение 3D Simplex Noise (почти как предложил Battle Angel Alita) и передвинуть ее соответсвующим образом. Это все если в онлайне. Если хочу в офлайне, то можно просто заранее сделать все то же самое, а потом из файла подгрузить вершинный буфер. Верно?
Механизм генериции правильнее делать смешанным, и скорее всего без файлов. Во первых загрузка и декодирование файла может занять столько времени как и генерация, только если объект не модифицируется. Сам алгоритм генерации как 3d perlin noise не оптимален для просчета его в реальном времени для каждой вершины, но имеет место быть если это будет оригинальная оптимизированная альтернатива. Я например делал это в шейдере, а для физики это всего лишь один расчет (вершина) на персонажа. Также для генерации лучше использовать заранее посчитанный участок шума/слоя. С другой стороны при масштабировании поверхности лучше разделить расчет шума на отдельные подслои детализации и потом их смешивать для получения различных lod объектов, так нагрузка при генерации в реальном времени будет меньше в том числе для фонового синтеза.
3D Simplex Noise по скорости будет уступать 2D построенного через развертку.
foxes
> 2D построенного через развертку.
То есть лучше сгененировать 2D simplex noize, а потом отобразить его на сферу какой-нибудь проекцией Меркатора?
kasom
> То есть лучше сгененировать 2D simplex noize, а потом отобразить его на сферу какой-нибудь проекцией Меркатора?
Нет, потому что плоскость невозможно отобразить на сферу без растяжений или сжатий.
Кстати, для 2D случая, simplex не имеет смысла.
}:+()___ [Smile]
> Нет, потому что плоскость невозможно отобразить на сферу без растяжений или
> сжатий.
очередной шаблон
В случае с генерацией не будет ни каких сжатий и растяжений.
разница только в масштабе по горизонтали на cos(b).
L=atan2(v.x,v.z); B=atan2(v.y,Length(v.xz)); noise.x=L*cos(B); noise.y=B;
По этим координатам уже генерируется равномерный шум для сферы.
Battle Angel Alita
> 3d perlin noise
+1
Тема в архиве.