Вид в три четверти на плоском холсте

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

Дневник разработки · 20 сентября 2026 · все записи

Несоответствие

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

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

Крошечный рендерер

В TUNL нет никакой 3D-библиотеки и нет этапа сборки, поэтому рендерер маленький. Корпус уже существовал как набор плоских граней, освещённых сверху, с верхней половиной, смешанной в сторону белого, и нижней - в сторону почти чёрного. 3D-версия даёт каждой грани третью координату, вращает модель вокруг продольной оси, проецирует её ортографически и заливает каждую грань в том же плоском стиле с освещением сверху. Получается около 90 видимых заливаемых граней на кадр против примерно 40 заливок для плоского корпуса. Здесь нет размытия, и это важно, потому что размытие - дорогая операция в веб-вью телефона, а свечение - это одна радиальная заливка. Если когда-нибудь слабое устройство начнёт испытывать трудности, очевидное решение - кэшировать корпус по углу крена в оффскрин-холсте.

Хитбокс главнее всего

Самое важное ограничение в том, что столкновение не меняется. Хитбокс корабля - это круг, и вся сложность игры настроена относительно него. Поэтому 3D-картинка не должна выглядеть больше этого круга, и не должна быть настолько меньше, чтобы корабль "умирал" ещё до того, как крыло заметно чего-то коснётся.

Это превратило угол крена из вопроса вкуса в измерение. При наклоне на 45 градусов от вида сверху читается только ближнее крыло, и картинка покрывает лишь чуть больше половины и примерно до четырёх пятых высоты круга. При 90 градусах это просто снова старый вид сверху. При 60 градусах читаются оба крыла, а размах снова составляет около 85% круга. Я построил небольшую лабораторию с пятью вариантами вида и кривой покрытия и выбрал 60. Теперь тест проверяет, что при любом крене и любой стреловидности крыла нарисованный корпус никогда не выходит за пределы круга и никогда за пределы плоского носа, и что он всё ещё заполняет здоровую долю круга во время полёта.

Что движется, а что намеренно нет

Как только корабль стал 3D-объектом, возникло искушение анимировать всё. Большая часть этого была отсечена. То, что выжило, должно нести информацию:

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

Покраска 3D-корпуса

Шесть вариантов покраски корабля были разработаны для плоского корпуса в координатах плана. Вместо того чтобы перерисовывать их, я использовал небольшой геометрический приём: при заданном крене верхняя поверхность корпуса проецируется точно в план, сжатый по вертикали на синус угла крена. Поэтому существующий "художник" работает под этим сжатием и обрезается по 3D-силуэту. Две вещи, которые нельзя выразить таким образом - швы граней и контур - прорисовываются в экранном пространстве.

Для 3D-версии потребовалась одна поправка. У плоского корпуса семь граней, а у 3D - около девяноста, и рисование яркого шва на каждой превращало отделку STEALTH в лампу. Поэтому в 3D швы идут с половинной силой и пропускают маленькие грани, а когда корпус почти развёрнут ребром посреди бочки, узор пропускается на эти несколько кадров.

Что осталось плоским

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

Полная картина того, как корабль построен и покрашен, есть на странице кораблей, а увидеть его полёт можно в сегодняшней пещере.

Играть в пещеру дня