Как сделать бесконечную вселенную?

15

Мне интересно, каковы лучшие практики в индустрии разработки игр для рендеринга 3D-вселенной?

Чтобы быть более конкретным:

  • Точки данных даны и статичны. Каждая точка имеет положение, цвет и размер;
  • Весь набор данных намного больше доступной памяти;
  • Пользователь должен иметь возможность «уменьшить», чтобы увидеть большую картинку сразу;

Самый наивный подход - разделить вселенную на кубы и визуализировать только то, что видно. Я не уверен, как в этом сценарии я должен реализовать «уменьшение». Должен ли я предварительно вычислять кубы для каждого возможного уровня масштабирования? Или, может быть, есть лучшие подходы?

Я ищу не зависящее от технологии решение.

Anvaka
источник
2
Планируете ли вы иметь какое-то максимальное расстояние обзора, или у вас есть какой-то способ слияния удаленных точек, чтобы вам не приходилось отображать их по отдельности, или «точки» непрозрачны и расположены так, что большинство из них будут быть скрытым от любой данной точки зрения? Потому что, если ничего из вышеперечисленного не выполняется, я не вижу способа помешать пользователю найти углы камеры, с которых большинство точек (или, по крайней мере, значительная их часть) будут видны одновременно.
Илмари Каронен
4
Кстати, немного экзотично, но рассматривали ли вы процедурно сгенерированные данные? У вас нет преимуществ пользовательских областей крафта, но в результате контент основан на уравнениях, а не на больших объемах данных. С некоторой креативностью это могло бы упростить многие вещи (:
Алан Вулф
1
Уменьшение / увеличение масштаба infinite universeможет быть аналогично отслеживанию отношений между двумя точками на некоторой кривой Мандельброта после увеличения до разных уровней. На каком-то уровне вы можете потерять точность и не сможете их различить или даже найти снова.
user2338816
1
@AlanWolfe Пользовательское крафтинг все еще возможен - ярким примером являются старые игры Frontier, которые имели реальные звездные позиции примерно для 1000 звезд или около того ближе к Солнцу (включая Сол и его реальные планеты и луны). Вы просто убедитесь, что они находятся в местах, которые не были сгенерированы процедурно, и добавили их как еще один «слой».
Луаан
@ IlmariKaronen да, ты прав. У меня есть максимальная дистанция обзора, и я подумал, что буду объединять точки расстояния, следуя ответу Минг-Танга
Анвака

Ответы:

8

Это основано на моих размышлениях и просмотре исходного кода Селестии.

Селестия позволяет летать вокруг планеты и уменьшать масштаб, чтобы увидеть всю галактику. Я просмотрел его исходный код и обнаружил, что он использует октри, структуру для рекурсивного разделения пространства на 8 октантов.

Средство визуализации будет визуализировать окружение путем обхода октодерева и не проходить глубоко через дальние объекты.

Селестия также отслеживает абсолютную величину октанта, где абсолютная величина октанта основана на абсолютной величине звезд внутри октанта. Если октант находится близко друг к другу, Селестия отображает звезды по отдельности, а если октант находится далеко, Селестия делает октант одной звездой величины октанта.

Кроме того, может быть значимая иерархия, прикрепленная к объектам. Например, если вы находитесь близко (радиус объявлен в базе данных) к звезде, то ее планеты отображаются. Если планета находится достаточно близко (отсечение пикселей на экране), ее трехмерная модель рисуется.

Другими космическими играми, которые я могу назвать, являются Orbiter и Kerbal Space Program с закрытым исходным кодом. Я также посмотрел на Галактику Границы, которая процедурно генерировала звездную карту. Существует веб-сайт, анализирующий работу игры по ее разборке: http://www.jongware.com/galaxy1.html

Мин-Tang
источник
12

В этой головоломке есть несколько частей, каждая из которых обеспечит глубокую и интересную кроличью нору исследования. Некоторые из них:

  • Уровень детализации - автоматический (или «ручной») выбор подробных или упрощенных моделей, или даже спрайтов, или просто точек, или для объектов, которые находятся дальше.
  • Отбраковка - выбор только рисовать то, что нужно. Это может быть то, что находится в поле зрения (отбраковка усеченного конуса), что не спрятано за другими вещами (отбраковка окклюзии) или другие специальные методы. (Ответ @Alan Wolfe описывает некоторые способы организации ваших данных, которые помогают упростить выборку.)
  • Потоковая передача - извлечение мировых данных из хранилища в память по мере необходимости, если они все не помещаются в память сразу
  • Sky box - очень отдаленные объекты можно предварительно визуализировать на сфере, которая находится на «бесконечном расстоянии» от камеры.

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

Дэвид ван Бринк
источник
2

Все, что является иерархическим и / или редким, должно помочь вам здесь.

Там много пустого пространства, поэтому не нужно использовать хранилище для представления пустого пространства. Типичный иерархический подход - это что-то вроде дерева октав, которое рекурсивно делит пространство на 8 меньших кубов, и вы можете хранить объекты в наименьшем кубе, который они могут полностью занимать.

Октри также очень хорошо подходит для того, чтобы вы могли запрашивать у него список всех объектов в области видимости, который позволит вам получить список только тех объектов, которые находятся в пределах вашего угла обзора и не слишком отдалены. Разреженное решение может быть чем-то вроде разреженной сетки, где вы можете запросить информацию о любом местоположении x, y, z, но вам нужно хранить информацию только для ячеек, которые не являются пустым пространством.

Другие используемые общие иерархические подходы включают деревья BSP (они рекурсивно разбивают пространство на 2 полупространства), а также деревья KD, которые делают подобное.

Лично я думаю, что октри может быть хорошим началом для вас, если вы хотите разделить его настолько глубоко, насколько это необходимо, чтобы не тратить память на пустое место. Кроме того, вам может понадобиться другое решение для ваших статических объектов по сравнению с вашими динамическими объектами.

Некоторые решения (например, BSP) могут быть очень эффективными, но их создание занимает много времени, поэтому они обычно не являются хорошим выбором для перемещения / изменения объектов.

Надеюсь, это поможет, дайте мне знать, если у вас есть какие-либо вопросы о деталях!

Алан Вульф
источник