Вид в три четверти на плоском холсте
До версии 15.0 корабль в TUNL рисовался сверху, а пещера вокруг него была видом сбоку в разрезе. Исправить это означало создать маленькую 3D-модель, хитбокс, который картинка не имела права перерасти, и много сдержанности в вопросе о том, что вообще должно двигаться.
Несоответствие
Пещера TUNL - это разрез сбоку. Гравитация тянет вниз, сталактиты свисают с потолка, а подлёт в начале каждого забега - это городской силуэт в сумерках. Единственное, что рисовалось строго сверху, - это сам корабль, как план самолёта, летящего сквозь картину склона горы, снятую сбоку. Игроки обычно не формулируют это так явно, но из-за этого корабль ощущается слегка приклеенным.
Очевидное решение, нарисовать простой вид сбоку, отбросило бы силуэт сверху, по которому узнаётся корабль, а форма корабля лучше всего смотрится именно сверху. Компромисс - это вид в три четверти: 3D-модель того же корпуса, повёрнутая из вида сверху вокруг своей продольной оси и спроецированная плоско.
Крошечный рендерер
В TUNL нет никакой 3D-библиотеки и нет этапа сборки, поэтому рендерер маленький. Корпус уже существовал как набор плоских граней, освещённых сверху, с верхней половиной, смешанной в сторону белого, и нижней - в сторону почти чёрного. 3D-версия даёт каждой грани третью координату, вращает модель вокруг продольной оси, проецирует её ортографически и заливает каждую грань в том же плоском стиле с освещением сверху. Получается около 90 видимых заливаемых граней на кадр против примерно 40 заливок для плоского корпуса. Здесь нет размытия, и это важно, потому что размытие - дорогая операция в веб-вью телефона, а свечение - это одна радиальная заливка. Если когда-нибудь слабое устройство начнёт испытывать трудности, очевидное решение - кэшировать корпус по углу крена в оффскрин-холсте.
Хитбокс главнее всего
Самое важное ограничение в том, что столкновение не меняется. Хитбокс корабля - это круг, и вся сложность игры настроена относительно него. Поэтому 3D-картинка не должна выглядеть больше этого круга, и не должна быть настолько меньше, чтобы корабль "умирал" ещё до того, как крыло заметно чего-то коснётся.
Это превратило угол крена из вопроса вкуса в измерение. При наклоне на 45 градусов от вида сверху читается только ближнее крыло, и картинка покрывает лишь чуть больше половины и примерно до четырёх пятых высоты круга. При 90 градусах это просто снова старый вид сверху. При 60 градусах читаются оба крыла, а размах снова составляет около 85% круга. Я построил небольшую лабораторию с пятью вариантами вида и кривой покрытия и выбрал 60. Теперь тест проверяет, что при любом крене и любой стреловидности крыла нарисованный корпус никогда не выходит за пределы круга и никогда за пределы плоского носа, и что он всё ещё заполняет здоровую долю круга во время полёта.
Что движется, а что намеренно нет
Как только корабль стал 3D-объектом, возникло искушение анимировать всё. Большая часть этого была отсечена. То, что выжило, должно нести информацию:
- Крен следует за набором высоты. Демпфированная пружина поворачивает корпус на угол до примерно десяти градусов в любую сторону - спиной к камере при наборе высоты и брюхом при падении. Это управляется вертикальной скоростью как долей предельной скорости, поэтому выглядит одинаково на любом экране. Это второй индикатор того, что ты пытаешься оценить.
- Крылья складываются в соответствии с ощущаемой скоростью. Как у истребителя с изменяемой геометрией крыла, внешние панели раскрыты в медленном начале и хорошо сложены назад к тому моменту, когда пещера набирает полную скорость. Синяя монета, замедляющая время, выбрасывает их вперёд как воздушный тормоз, и они складываются обратно ровно так же быстро, как затухает замедление. Варп складывает их за полсекунды.
- Варп-кольцо дарит бочку. Один полный оборот, со сглаживанием. Это безопасно по построению: варп делает тебя неуязвимым, поэтому картинка, выходящая за пределы круга посреди бочки, никогда не может стать причиной смерти.
Что не выжило - это свободное раскачивание. Более ранний вариант, где корабль "качался вслед" за движением, выглядел живо, но это был шум: в игре, единственный навык которой - считывание расстояний, корпус, колеблющийся сам по себе, конкурирует с информацией, которая тебе нужна. Это то же самое рассуждение, из-за которого параллаксный фон с дальними силуэтами скал был убран в тот же день, когда его добавили. В игре, суть которой - считывать, где находятся стены, второй набор форм, движущихся с другой скоростью, отвлекает внимание, даже при низком контрасте.
Покраска 3D-корпуса
Шесть вариантов покраски корабля были разработаны для плоского корпуса в координатах плана. Вместо того чтобы перерисовывать их, я использовал небольшой геометрический приём: при заданном крене верхняя поверхность корпуса проецируется точно в план, сжатый по вертикали на синус угла крена. Поэтому существующий "художник" работает под этим сжатием и обрезается по 3D-силуэту. Две вещи, которые нельзя выразить таким образом - швы граней и контур - прорисовываются в экранном пространстве.
Для 3D-версии потребовалась одна поправка. У плоского корпуса семь граней, а у 3D - около девяноста, и рисование яркого шва на каждой превращало отделку STEALTH в лампу. Поэтому в 3D швы идут с половинной силой и пропускают маленькие грани, а когда корпус почти развёрнут ребром посреди бочки, узор пропускается на эти несколько кадров.
Что осталось плоским
Только корабль в полёте получил новый вид. Ангар, магазин и карточка для шаринга по-прежнему показывают корабль сверху, потому что это портреты корабля, а не картины полёта, а вид сверху - это тот, что показывает весь план целиком. Значок приложения и графика в магазине приложений тоже являются портретами сверху, и стоит ли им когда-либо перейти на вид в полёте - открытый вопрос.
Полная картина того, как корабль построен и покрашен, есть на странице кораблей, а увидеть его полёт можно в сегодняшней пещере.