Я разрабатываю игру, частично составленную из исследования планет. Я хочу использовать для них псевдослучайную генерацию, регенерируя из определенного начального числа, когда мне нужно загрузить их, а не хранить каждую деталь, которая была бы слишком тяжелой. Поэтому я буду просто хранить в файле случайное начальное число и изменения, сделанные игроком, если таковые имеются.
Игрок должен видеть планету с орбиты (с очень низким уровнем детализации, затем опускаться на землю, медленно увеличивая уровень детализации региона, в котором он / она приземляется, и выгружая те, что находятся на других сторонах). планеты, которые выходят за пределы поля зрения игрока.
Если бы мне пришлось делать это на ровной поверхности, я бы легко сделал это с помощью системы с квадратными блоками. Но проблема здесь в том, что планеты - это почти сферы.
Итак, как лучше всего загрузить детали земли (рельеф и заземленные объекты) вокруг точной точки?
Я уже хоть на два решения, но у обоих есть слабое место:
1. Разрезать сферу на квадратные куски.
Как только игрок окажется достаточно близко от земли, мне просто нужно улучшить детали ближайших квадратов с его / ее позиции.
Если этого недостаточно, я по-прежнему могу разрезать каждый квадрат на квадраты для загрузки, когда игроки находятся на земле или очень близко от нее.
Но, как вы можете видеть на картинке, есть проблема, если игрок пытается приземлиться на шест: квадраты становятся очень тонкими прямоугольниками или даже треугольниками для последней линии, и в дополнение к тому факту, что их будет много для загрузки, поколение будет выглядеть искаженным.
2. Начиная с икосаэдра.
Здесь я мог бы просто увеличить треугольную тесселяцию вокруг позиции игрока, когда он приближается.
Но я не знаю, как расположить треугольники ближе, чем позиция игрока. Я слышал, что декартовы координаты могут быть полезны в этом случае, но я не знаю, как их использовать.
Я использую для этого C ++ / OpenGL, поэтому для генерации и загрузки здесь нужны вершины, представляющие рельеф поверхности и цвет / текстуру.