Как загрузить сферическую планету и ее регионы?


15

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

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

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

Итак, как лучше всего загрузить детали земли (рельеф и заземленные объекты) вокруг точной точки?
Я уже хоть на два решения, но у обоих есть слабое место:

1. Разрезать сферу на квадратные куски.

метод квадратных кусков

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

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

2. Начиная с икосаэдра.

метод икосаэдра

Здесь я мог бы просто увеличить треугольную тесселяцию вокруг позиции игрока, когда он приближается.

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


Я использую для этого C ++ / OpenGL, поэтому для генерации и загрузки здесь нужны вершины, представляющие рельеф поверхности и цвет / текстуру.


Прежде чем я начну писать, ваш мир - сфера? Вы пытаетесь наложить сетку на сферу, где каждая сетка имеет свойства, сохраненные в файл?
Алек Тил

@AlecTeal Я пытаюсь симулировать планету. Так что это глобально сфера. И главная проблема в том, что игрок может попытаться приземлиться в любой точке, на шесте или вдоль экватора.
Aracthor

2
Итак ... должен спросить, вы искали "игровой движок сферического мира", поскольку там есть множество реализаций. Почему они не работают? Кроме того, именно поэтому у нас есть кубические карты, они являются стандартными картами на любом топологическом многообразии, гомеоморфном сфере по этой причине!
Алек Тил

1
Предлагаю также оценить вариант с четырьмя сферами
dnk drone.vs.drones

maths.kisogo.com/index.php?title=Notes:Spherical_coordinates предварительный проект. Нужны фотографии и быть законченным.
Алек Тил

Ответы:


5

Итак, я написал это здесь:

http://www.maths.kisogo.com/index.php?title=Notes:Spherical_coordinates

(Мне нужна была математическая разметка, и она действительно довольно длинная)


Применение документа

Документ начинается с введения понятия многообразия, это многообразие, где его фрагменты являются «гомеоморфными» (в основном: такими же, как) фрагменты R ^ n (R ^ 2 - это плоскость x / y, как вы могли бы знаю)

Диаграмма охватывает некоторые (возможно, все, хотя в случае сферы она НЕ МОЖЕТ охватывать все) многообразия.

В статье я разрабатываю 4 графика для сферы, которые сохраняют углы, то есть они сохраняют постоянное расстояние.

Как вы узнали, давать координаты точкам на сфере довольно сложно! Вместо этого мы делаем (хотя в примере круг), чтобы дать каждой точке координату вида (i, x, y), где i - число от 1 до 6 для сферы, от 1 до 4 для круга. Это номер графика.

Х и у относятся к углам на этом графике (или просто х, если это круг).

6 диаграмм сферы - это верхнее / нижнее полушария, левое / правое и переднее / заднее полушария.


Координаты

Теперь вы можете дать каждому пункту "хорошую" координату, которая ведет себя хорошо. В математических терминах области графиков являются «открытыми» картами, это означает, что существует некоторое положительное число, такое, что шар вокруг каждой точки также находится в наборе. Например, диапазон (0,1) (набор, который содержит x, если 0 <x <1) открыт, возьмите любое p в (0,1) (например, 0,001), тогда есть число (например, 0,0005), такое что любая точка в пределах 0,0005 от 0,001 также находится в (0,1).

Это означает, что вы можете передавать указания через графики.

Теперь на графиках, которые мы разрабатываем, есть 45 градусов наложения. Это означает, что если у вас есть элемент в координатах (i, x, y), вы можете БЕЗОПАСНО указывать точки формы (i, x + a, y + b) до тех пор, пока aиb находятся между -45 и +45 (в градусах)

Любая точка вида (i, x + a, y + b) может быть легко преобразована в точку в «нормальном» трехмерном пространстве без проблем.


Реализация

Теперь у вас есть способ хранить координаты чего-либо на сфере и обозначать регионы большими полосами пространства с этими координатами, они также ведут себя как координаты, например, они открыты (что является проблемой, если вместо этого вы используете 2 угла)

Теперь вы также можете полностью отказаться от ответов «как создать регулярную сферу», потому что все, что вам нужно сделать, это сделать 6 плоскостей и убедиться, что их края совмещены (что тривиально), и в результате получится:

У вас будет хорошая сфера с простыми в использовании координатами

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


@Alec_Teal Я отвечаю на ваш ответ с тех пор, как вы его опубликовали, сложный и трудный для понимания (я не использую так много математических формул), но я думаю, что должен понять ... Действительно ли ваш метод отличается от основанного на кубе сфера как описано выше? Я не понял, являются ли ваши "диаграммы" квадратными проекциями или чем-то еще ...
Aracthor

@Aracthor это более общее. Диаграмма буквально похожа на диаграмму в книге (карт), все, что она делает, это навязывает сетку какой-то области. Скажем, у вас был тор, например, или тор с двумя отверстиями, вам понадобятся эти методы. Ни один из ответов здесь не касается координат на сфере так же, как обычные способы создания геометрии, что является другой задачей. Я могу помочь с формулами, я пытался написать это как можно более доступным, но это мой хлеб с маслом, поэтому я не вижу сложности.
Алек Тил

@Alec_Teal Я подтвердил это, но я все еще не думаю, что получил все. Но давайте продолжим это обсуждение в чате .
Aracthor

13

Как вы уже показали, есть несколько решений этой проблемы, но ни одно из них не является идеальным на 100%. Сферы хитрые.

Куб основе

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

(Это то, что Алек Тил и dnk drone.vs.drones описывают в комментариях выше)

Сфера подразделяется на основе куба

( Изображение из этого поста, которое описывает использование кубического представления для LoD )

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

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

Изменение функции отображения для улучшения однородности

Во всех случаях у вас все еще будут угловые искажения в углах, где обычное пересечение сетки из четырех квадратов с углами в 90 градусов становится встречей из 3 ромбов с углами в 120 градусов.

Икосаэдр основе

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

Это не такая знакомая территория, как квадраты кубической версии, поэтому, вероятно, она не так популярна. Требуется немного больше математики, чтобы проработать.

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

Выравнивание геодезических тесселяций на правильной треугольной сетке Сетка икосаэдра на треугольной сетке

И правильная треугольная сетка может рассматриваться как квадратная сетка, как обсуждалось здесь .

Треугольный квадрат изоморфизм сетки

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

Редактировать:

Если вы используете геодезическую Class-I, вы можете развернуть свои планеты в пять прямоугольных диаграмм для эффективного хранения кусков / текстур / карт высот, аналогично шести квадратным диаграммам, которые вы использовали бы для хранения версии на основе куба:

Развертывание геосферы в прямоугольных картах

(Это может помочь решить проблему, поднятую Fuzzy Logic в другом ответе. Это также возможно, но немного сложнее для геодезических класса II. Я не исследовал класс III)

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


1
Здесь есть кое-что хорошее. Я бы +1, но я планирую написать ответ позже (я стараюсь держаться подальше от ранних этапов голосования, когда я также отвечаю). Мои единственные комментарии были бы, что этот подход лучше для рендеринга сфер, чем моделирование поверхности
Алек Тил

Просто если вам любопытно, я уже закончил свой ответ.
Алек Тил

4

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

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

Четырехсфера имеет точки защемления, но с достаточным количеством тесселяции вы все равно их не увидите. Затем вы можете отобразить текстуры и эффективно реализовать DLOD, как если бы каждый регион (кусок) представлял собой квадратную сетку с небольшими проблемами. Это проще в реализации по сравнению с икосферой и будет более эффективным как в вычислительном, так и в ресурсном отношении.

См. Статьи Шона О'Нила о создании процедурной вселенной на Гамасутре:
- Часть 1 Шум Перлина и Фрактальное броуновское движение для карт высот и текстур.
- Часть 2 Алгоритм ROAM для процедурной сетки с DLOD для генерации планет. Страдает от проблем с производительностью. Не рекомендуется, но хорошо для образовательной ценности.
- Часть 3 Устраняет проблемы, связанные с масштабным масштабированием, оптимизацией и проблемами с плавающей запятой. В основном относится к масштабам вселенной, но также применимо к планетам при переходе от масштабов световых лет к сантиметрам, если хотите.
- Часть 4 <- смотрите эту статью в частности Обсуждается реализация Quad-сферы с кусочками (quad-tree) DLOD для генерации планет


0

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


Это обходит проблему, открывая возможность не проектировать исследуемую поверхность планеты как сферу, но не решает ее.
Филипп
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.