Пост

Дневник разработки: июль

Свет в конце тоннеля

Привет, ребята.

Я наконец-то закончил работать над предсказанием энкаунтеров и вот как это выглядит:

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

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

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

Вне системы отсчета Земли

В системе отсчета Земли

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

И если на эллиптическую орбиту поставить маневр, статическая система отсчета должна смениться динамической.

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

Через некоторое время непрерывного исправления тонны багов и граничных случаев, я обнаружил, что в этой системе отсутствуют еще многие вещи. Например, отображение позиций тел во время энкаунтера, система целей, ноды восходящего и нисходящего узлов, больше всплывающих подсказок с полезной информацией об объектах, интерфейс для более точного изменения характеристической скорости орбитального маневра (в английском просто delta-V =/), и в конце концов соединить это всё с системой полетов. К этому моменту я немного устал от разработки орбит и решил переключиться на другие задачи. Так как того, что я сделал, уже достаточно для достижения Луны, я планирую только соединить систему маневров с полетами и горизонтом к следующему релизу, а все остальные фичи, которых не хватает, перейдут на один из последующих апдейтов.

Я наконец-то мог начать работать над чем-то другим. В первую очередь я поменял карту температур, которую использовал для процедурного текстурирования Земли. Я взял исходные L3 датасеты со спутников TERRA/MODIS и AQUA/MODDIS на сайте NASA в более высоком разрешении, соединил их, обработал так, чтобы заполнить районы с отсутствующей информацией и конвертировал в 16-битную карту температур. По сравнению с 8-битной картой, это сильно улучшило процедурное текстурирование. Переходы между биомами стали более плавными, пропали артефакты и зашумленность, а также текстурирование стало чуть более реалистичным. Больше нет песчаных пустынь в центре Сибири.

До

После

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

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

У Луны сейчас нет текстур, но она всё равно выглядит великолепно

Я использую карту высот разрешением в 32 000 на 16 000 пикселей. И не смотря на то, что площадь Луны в 13 раз меньше площади Земли, этого всё еще недостаточно для хорошего уровня детализации. Мне нужно было написать подходящую функцию шума, чтобы добавить недостающих деталей.

Когда немного переборщил с шумом

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

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

Что касается даты релиза обновления, я снова переместил ее, в этот раз на конец августа, за что приношу извинения. Я достиг хорошего прогресса в разработке игры за последний месяц, но есть еще куча вещей, которые нужно сделать. После того, как я закончу с Луной, я начну создавать новые детали ракет. Некоторые из них будет очень просто добавить, другие (как парашют) не очень. Также было бы неплохо сделать редизайн некоторых готовых деталей. Но я попробую менять скоуп на протяжении следующего месяца и выбирать только самые важные задачи, чтобы у меня была возможность выпустить обновление, даже если не всё, что я хотел, будет в нем.

Спасибо, и надеюсь, увидимся уже в следующем обновлении.

Авторский пост защищен лицензией CC BY 4.0 .

© unbeGames. Некоторые права защищены.

Популярные теги