Программирование игр, создание игрового движка, OpenGL, DirectX, физика, форум
GameDev.ru / Программирование / Форум / Принципы генерации ландшафтов на сферической поверхности

Принципы генерации ландшафтов на сферической поверхности

Страницы: 1 2 3 4 Следующая »
kasomПользовательwww17 янв. 20172:37#0
Доброго времени суток. Не понимаю, как должна быть устроена генерация ландшафтов на сферической поверхности (то есть планет). Лобовой способ генерации "плоского" ландшафта: берем карту высот и вытягиваем в зависимости от цвета z-координату. Нагуглил вот такую штуку: http://mathproofs.blogspot.ru/2005/07/mapping-cube-to-sphere.html. Я правильно понимаю, что мы берем куб, на каждой грани генерируем ландшафт, а потом вот этим преобразованием проходимся по всем координатам и получаем сферу? Не будет ли это слишком накладно? Сходу кажется, что это ужасно неоптимально. И еще: не хочется ведь для каждой грани использовать одну и ту же карту высот. А сделать одну огромную - опять же жутко неоптимально, как мне кажется. Помогите советом, как это делается по-человечески?
MANABПостоялецwww17 янв. 201711:49#1
Почему не оптимально? Ты же делаешь это не каждый кадр, а один раз при загрузке сцены/генерации части космоса.
Для каждой грани используется своя карта высот, в местах стыков ландшифт должен быть соответствующим.

Правка: 17 янв. 2017 11:50

МизраэльПостоялецwww17 янв. 201714:30#2
kasom
Берём сферу и генерируем карту высот в полярных координатах.
kasomПользовательwww17 янв. 201715:03#3
Мизраэль
Не будет ли вычисление тригонометрии губительно сказываться на скорости генерации ландшафта?
serpinfПостоялецwww17 янв. 201715:15#4
kasom
в гугл земле и похожих сервисах данные карт хранятся в проекции Меркатора, чтобы пиксели были максимально квадратными.
МизраэльПостоялецwww17 янв. 201715:16#5
kasom
> Не будет ли вычисление тригонометрии губительно сказываться на скорости
> генерации ландшафта?
Генерацию лучше делать оффлайн всё же, но если предполагается в реальном времени, то можно сделать высокополигональную геосферу и в рантайме её вершины передвигать. Тригонометрия там не нужна.
МизраэльПостоялецwww17 янв. 201715:19#6
kasom
ещё важно, что в итоге хочется получить? простую мультяшную планету, как в Самогонках, большущую планету для стратегической игры или просто шарик для космосима. В последнем случае геометрией вообще можно не заморачиваться.
Battle Angel AlitaПостоялецwww17 янв. 201715:27#7
3d perlin noise
kasomПользовательwww17 янв. 201715:30#8
Мизраэль
Скорее "большущую планету для стратегической игры".
kasomПользовательwww17 янв. 201715:50#9
Мизраэль
> сделать высокополигональную геосферу и в рантайме её вершины передвигать
Подскажите пожалуйста, правильно ли я понял схему: генерируем сферу, получаем на выходе какой-то буфер вершин. Теперь для каждой вершины можем подсчитать значение 3D Simplex Noise (почти как предложил Battle Angel Alita) и передвинуть ее соответсвующим образом. Это все если в онлайне. Если хочу в офлайне, то можно просто заранее сделать все то же самое, а потом из файла подгрузить вершинный буфер. Верно?
foxesПостоялецwww17 янв. 201716:10#10
Механизм генериции правильнее делать смешанным, и скорее всего без файлов. Во первых загрузка и декодирование файла может занять столько времени как и генерация, только если объект не модифицируется. Сам алгоритм генерации как 3d perlin noise не оптимален для просчета его в реальном времени для каждой вершины, но имеет место быть если это будет оригинальная оптимизированная альтернатива. Я например делал это в шейдере, а для физики это всего лишь один расчет (вершина) на персонажа. Также для генерации лучше использовать заранее посчитанный участок шума/слоя. С другой стороны при масштабировании поверхности лучше разделить расчет шума на отдельные подслои детализации и потом их смешивать для получения различных lod объектов, так нагрузка при генерации в реальном времени будет меньше в том числе для фонового синтеза.

3D Simplex Noise по скорости будет уступать 2D построенного через развертку.

Правка: 17 янв. 2017 16:28

kasomПользовательwww17 янв. 201716:46#11
foxes
> 2D построенного через развертку.
То есть лучше сгененировать 2D simplex noize, а потом отобразить его на сферу какой-нибудь проекцией Меркатора?
}:+()___ [Smile]Постоялецwww17 янв. 201716:52#12
kasom
> То есть лучше сгененировать 2D simplex noize, а потом отобразить его на сферу какой-нибудь проекцией Меркатора?
Нет, потому что плоскость невозможно отобразить на сферу без растяжений или сжатий.
Кстати, для 2D случая, simplex не имеет смысла.
foxesПостоялецwww17 янв. 201718:08#13
}:+()___ [Smile]
> Нет, потому что плоскость невозможно отобразить на сферу без растяжений или
> сжатий.
очередной шаблон

В случае с генерацией не будет ни каких сжатий и растяжений.
разница только в масштабе по горизонтали на cos(b).
L=atan2(v.x,v.z);
B=atan2(v.y,Length(v.xz));

noise.x=L*cos(B);
noise.y=B;
По этим координатам уже генерируется равномерный шум для сферы.
+ Аналог без каких либо искажений

Правка: 17 янв. 2017 18:53

MikleМодераторwww17 янв. 201720:14#14
Battle Angel Alita
> 3d perlin noise
+1
Страницы: 1 2 3 4 Следующая »

/ Форум / Программирование игр / Графика

2001—2018 © GameDev.ru — Разработка игр