Костыли и пиксели #14

Всем привет! В 14-м выпуске предлагаю вылезти из тесных коридоров и посмотреть, как разработчики справляются с по-настоящему гигантскими пространствами.

Костыли и пиксели #14

Главная боль любой игры про космос — это ошибка округления координат (Floating-point precision loss). Память не резиновая. Пока вы топчетесь в центре карты, движок знает позицию объектов вплоть до миллиметра. Но стоит улететь на пару миллионов километров, и цифры становятся слишком большими. На точные дроби памяти уже не хватает, и движок начинает грубо округлять значения. Из-за этого 3D-модели прямо на ходу начинает трясти, физика ломается, а персонаж может просто выпасть сквозь пол.

Переписывать фундамент движка ради этого слишком долго и дорого, поэтому программисты используют изящный костыль — "плавающую точку начала координат" (Floating Origin). Суть обмана проста: в дальних путешествиях ваш герой на самом деле никуда не летит.

Очень наглядно это работает в Outer Wilds. Игра симулирует целую солнечную систему с честной физикой орбит. Если бы корабль просто летел от центра карты к краю, погрешность в вычислениях быстро разорвала бы его на куски. Поэтому игра делает финт ушами: как только вы отлетаете от центра на опасное расстояние, движок незаметно сбрасывает ваши координаты обратно в абсолютный ноль (0,0,0), где математика снова работает безупречно. И в ту же миллисекунду берет вообще всё — планеты, кометы, солнце — и сдвигает к вам на это же расстояние.

Костыли и пиксели #14

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

А вот если на эту проблему забить, получатся знаменитые "Далекие земли" (Far Lands) из старых версий Minecraft. Если игрок уходил слишком далеко от точки старта, математике просто срывало крышу от гигантских чисел. Генерация ландшафта превращалась в сюрреалистическое месиво, сквозь которое герой проваливался в пустоту.

Костыли и пиксели #14

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

5
2 комментария