Я разрабатываю игру, частично составленную из исследования планет. Я хочу использовать для них псевдослучайную генерацию, регенерируя из определенного начального числа, когда мне нужно загрузить их, а не хранить каждую деталь, которая была бы слишком тяжелой. Поэтому я буду просто хранить в файле случайное начальное число и изменения, сделанные игроком, если таковые имеются.
Игрок должен видеть планету с орбиты (с очень низким уровнем детализации, затем опускаться на землю, медленно увеличивая уровень детализации региона, в котором он / она приземляется, и выгружая те, что находятся на других сторонах). планеты, которые выходят за пределы поля зрения игрока.
Если бы мне пришлось делать это на ровной поверхности, я бы легко сделал это с помощью системы с квадратными блоками. Но проблема здесь в том, что планеты - это почти сферы.
Итак, как лучше всего загрузить детали земли (рельеф и заземленные объекты) вокруг точной точки?
Я уже хоть на два решения, но у обоих есть слабое место:
1. Разрезать сферу на квадратные куски.
Как только игрок окажется достаточно близко от земли, мне просто нужно улучшить детали ближайших квадратов с его / ее позиции.
Если этого недостаточно, я по-прежнему могу разрезать каждый квадрат на квадраты для загрузки, когда игроки находятся на земле или очень близко от нее.
Но, как вы можете видеть на картинке, есть проблема, если игрок пытается приземлиться на шест: квадраты становятся очень тонкими прямоугольниками или даже треугольниками для последней линии, и в дополнение к тому факту, что их будет много для загрузки, поколение будет выглядеть искаженным.
2. Начиная с икосаэдра.
Здесь я мог бы просто увеличить треугольную тесселяцию вокруг позиции игрока, когда он приближается.
Но я не знаю, как расположить треугольники ближе, чем позиция игрока. Я слышал, что декартовы координаты могут быть полезны в этом случае, но я не знаю, как их использовать.
Я использую для этого C ++ / OpenGL, поэтому для генерации и загрузки здесь нужны вершины, представляющие рельеф поверхности и цвет / текстуру.
источник
Ответы:
Итак, я написал это здесь:
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 плоскостей и убедиться, что их края совмещены (что тривиально), и в результате получится:
У вас будет хорошая сфера с простыми в использовании координатами
Любые вопросы, пожалуйста, прокомментируйте, я постарался принять немного предварительных знаний. Я также новичок в обучении людей
источник
Как вы уже показали, есть несколько решений этой проблемы, но ни одно из них не является идеальным на 100%. Сферы хитрые.
Куб основе
Один из распространенных маршрутов, используемых Spore и, скорее всего, другими играми (хотя трудно сказать наверняка, не заглядывая под капот), - проецировать сферу на куб и использовать квадратную сетку над каждой гранью куба.
(Это то, что Алек Тил и dnk drone.vs.drones описывают в комментариях выше)
( Изображение из этого поста, которое описывает использование кубического представления для LoD )
Это имеет много преимуществ метода широта-долгота, с гораздо меньшими пиковыми искажениями. Легко конвертировать взад-вперед между позициями на грани сетки и позициями на сфере, либо нормализуя вектор, либо разделив его на наибольшую составляющую по абсолютной величине. Это также хорошо сочетается с кубическим отображением методами текстурирования , которые могут быть полезны при просмотре всей планеты на расстоянии.
Типичный картографический подход называется гномической проекцией , и он все еще имеет проблему несоответствия плотности, как вы можете видеть на изображении выше. Сетка намного более плотная в углах куба, чем в центрах граней. Если важна однородность, вы можете уменьшить это с помощью правильных формул отображения, но это обычно затрудняет обратное отображение.
Во всех случаях у вас все еще будут угловые искажения в углах, где обычное пересечение сетки из четырех квадратов с углами в 90 градусов становится встречей из 3 ромбов с углами в 120 градусов.
Икосаэдр основе
Моим личным любимым подходом была бы икосаэдрическая версия, которую вы описали, потому что она делает максимальное угловое искажение настолько малым, насколько это возможно. Там, где треугольная сетка обычно имеет шесть треугольников, встречающихся под углом 60 градусов, вершины икосаэдра имеют 5 треугольников, встречающихся под углом 72 градуса. Таким образом, каждый из них имеет меньше искажений, чем квадраты в примере с кубом.
Это не такая знакомая территория, как квадраты кубической версии, поэтому, вероятно, она не так популярна. Требуется немного больше математики, чтобы проработать.
Выявление ближайших точек не так сложно, как может показаться. Любая геодезическая сфера на основе икосаэдра может быть сплющена на правильную треугольную сетку:
И правильная треугольная сетка может рассматриваться как квадратная сетка, как обсуждалось здесь .
Поэтому, как только вы определите, на какой грани икосаэдра вы находитесь (что можно сделать с помощью радиопередачи против икосаэдрической сетки - я не знаю ни одного умного математического способа упростить эту часть), окружение можно заполнить, используя знакомые обход сетки. :)
Редактировать:
Если вы используете геодезическую Class-I, вы можете развернуть свои планеты в пять прямоугольных диаграмм для эффективного хранения кусков / текстур / карт высот, аналогично шести квадратным диаграммам, которые вы использовали бы для хранения версии на основе куба:
(Это может помочь решить проблему, поднятую Fuzzy Logic в другом ответе. Это также возможно, но немного сложнее для геодезических класса II. Я не исследовал класс III)
Хитрость заключается в том, что оси этих диаграмм на самом деле не перпендикулярны в использовании, поэтому существующие средства разработки и потоковой передачи не будут поддерживать их «из коробки». Если вы планируете в любом случае написать свой собственный поток чанков или использовать процедурное генерирование на лету, то это может не быть проблемой. Вы также можете обойти проблему авторинга, создав исходные карты с более высоким разрешением, чем вам нужно, используя более традиционные инструменты, а затем запустите их через процесс выпечки, который выполняет выборку по сетке диаграммы, чтобы создать плотное, эффективное представление, которое подключается напрямую. в икосаэдрическую структуру.
источник
Quad-сфера с кусочками LOD является предпочтительным методом, если вы хотите иметь возможность перемещаться из космоса на землю с любым уровнем детализации ландшафта, как процедурным, так и предопределенным отображением высоты и текстурами.
Icosasphere обеспечивает более равномерную сетку и легко тесселяцию, но создает проблемы при попытке отобразить текстуры и карты высот, которые вам нужно будет кэшировать, и в этом случае не будет очень компактным или простым.
Четырехсфера имеет точки защемления, но с достаточным количеством тесселяции вы все равно их не увидите. Затем вы можете отобразить текстуры и эффективно реализовать DLOD, как если бы каждый регион (кусок) представлял собой квадратную сетку с небольшими проблемами. Это проще в реализации по сравнению с икосферой и будет более эффективным как в вычислительном, так и в ресурсном отношении.
См. Статьи Шона О'Нила о создании процедурной вселенной на Гамасутре:
- Часть 1 Шум Перлина и Фрактальное броуновское движение для карт высот и текстур.
- Часть 2 Алгоритм ROAM для процедурной сетки с DLOD для генерации планет. Страдает от проблем с производительностью. Не рекомендуется, но хорошо для образовательной ценности.
- Часть 3 Устраняет проблемы, связанные с масштабным масштабированием, оптимизацией и проблемами с плавающей запятой. В основном относится к масштабам вселенной, но также применимо к планетам при переходе от масштабов световых лет к сантиметрам, если хотите.
- Часть 4 <- смотрите эту статью в частности Обсуждается реализация Quad-сферы с кусочками (quad-tree) DLOD для генерации планет
источник
Я не специалист по программированию, но вы могли бы иметь какую-то контрольную точку. Пока вы проходите через контрольно-пропускной пункт безопасности, с анимацией, конечно, поверхность планеты может загружаться, и наоборот.
источник