Техническая реализация 3D-головоломки от первого лица про созерцание звезд
Логотип, модели Полины Дворянкиной Левел-арт Анны Чертовой
Меня зовут Александра, я работала программистом в проекте «Distant Suns» и здесь расскажу про код, нарратив и 2D-визуал игры.
Левел-арт Полины Дворянкиной
Наша игра о герое, который ищет дорогу к святилищу, ориентируясь по звёздам. Игрок должен использовать древние технологии, собирать созвездия и заряжать механизмы, чтобы узнать тайны погибшей цивилизации.
Взгляд главная тема игры
Основной геймплей построен на управлении взглядом. Важно фиксировать, куда смотрит игрок, поэтому каждый кадр от камеры вперёд бросается луч, который активирует интерфейс интерактивных объектов.
Интерфейс видимости
Основные интерактивные объекты
Чтобы код не превратился в кашу, для интерактивных объектов был создан общий интерфейс «видимости». При пересечении с лучом игровые объекты получают три сигнала: игрок увидел, игрок перестал видеть, игрок сфокусировался. На основе этого интерфейса было реализовано 4 типа интерактивных объектов: шар, линза, тьма и свет.
Версии билда с просмотра и предпросмотра
Шар изначально должен был иметь обычную физику: игрок поднимал его взглядом и мог бросить. Но физика движка конфликтовала с механикой взгляда. Шар должен был весить грамм при поднятии и тонну при броске, иначе он не поспевал за курсором или улетал в стратосферу. Но проблематичней была плавность перемещения, а точнее, её отсутствие. Точность луча, который взаимодействовал с шаром, сильно зависела от FPS. В поисках решения я случайно отключила шару гравитацию. Команде так понравился эффект невесомости, что мы решили его оставить — к тому же это исправило проблемы с физикой.
Версии билда с промежуточной и просмотра
Линза была первым и самым простым объектом. Смотря через неё, игрок фокусирует свет звезды и заряжает механизмы. В какой-то момент я предложила добавить механику превращения шара в линзу. Это разнообразило игровые ситуации и сделало систему более замкнутой.
Модели и левел-арт Полины Дворянкиной
Тьма и свет. Игре не хватало челленджей, а тема взгляда была раскрыта однобоко. Всё сводилось к вопросу «что, если смотреть на...». А что, если смотреть нельзя? Так в игре появилась тьма, наносящая урон, и целебный свет. Техническую сложность вызвала обратная связь, реализованная через тряску и зум камеры. Чтобы эффекты не накладывались и переход был плавным, две переменные типа float попеременно записывают уровень зума.
Вращение неба
Фишка игры — возможность вращать небо. Звучит просто: взять скайсферу, прикрепить звёзды и дать игроку вращать её по локальным осям с помощью WASD.
Скайсфера
Так я думала, пока всё не начало дёргаться и отказываться вращаться. Движок не поддерживает полноценное многоосевое вращение по локальным осям. Возникает риск слияния кватернионов — проще говоря, оси могут «склеиться», и программа не поймёт, как вращать объект. К тому же, небо должно двигаться относительно направления взгляда игрока, а не вокруг повёрнутой оси.
Билд с просмотра, предпросмотра и промежуточной
Если нельзя использовать локальные оси, сделаем свои. Вместо вращения по локальным осям, код теперь вращает скайсферу в мировых координатах, используя в качестве осей верхний и правый вектор камеры игрока.
Схема вращения неба вокруг векторов камеры
Оправы


