Как расстояние до стены задаёт её высоту

Плоская карта для такого движка — не просто схема уровня, а набор данных: здесь стена, здесь проход, здесь пустое пространство. Для каждой вертикальной полосы экрана программа выбирает направление взгляда и проверяет, где луч впервые пересечёт стену. Ближняя стена должна выглядеть крупнее, дальняя — меньше, поэтому высоту полосы вычисляют по расстоянию до точки столкновения: чем оно больше, тем ниже полоса.

Это упрощённая версия перспективы. В настоящей трёхмерной сцене пришлось бы учитывать положение и форму множества объектов в пространстве; здесь же достаточно повторить расчёт для ряда направлений и получить изображение стены слева направо.

От точки столкновения к текстуре

Одной высоты мало: нужно понять, какую часть рисунка стены показать. Место, где луч попал в стену, подсказывает координату на её поверхности. Движок берёт соответствующую вертикальную полоску текстуры и растягивает её до рассчитанной высоты. Так кирпичная кладка или каменная поверхность сохраняют рисунок, хотя сама стена описана на карте лишь линией или участком сетки.

Есть и важная поправка: лучи по краям экрана идут под углом к направлению взгляда. Если просто использовать их длину, боковые стены получатся чрезмерно вытянутыми — возникает «рыбий глаз». Поэтому движок учитывает угол луча и оценивает расстояние относительно направления камеры.

Выигрыш и пределы упрощения

Расчёт по полосам был удобен для компьютеров, которым трудно было быстро обрабатывать полноценные трёхмерные сцены: для каждой части экрана требовалось найти ближайшую стену, а не просчитывать сложную геометрию всего мира. Но такой способ естественно подходит прежде всего для вертикальных стен одинаковой высоты. Наклонные поверхности, свободно расположенные объекты и сложные уровни требуют отдельных ухищрений.

Поэтому убедительная глубина возникала не из объёмной карты, а из точной связи между тремя вещами: направлением взгляда, расстоянием до стены и размером её изображения. Стоило игроку повернуть, как набор лучей пересчитывался — и плоская схема снова складывалась в коридор.