Карты в Bloodshot
Я очень люблю всякие допотопные технологии псевдо 3D графики. Люблю изучать ранние попытки изображать объёмные уровни и геометрию, всевозможные трюки, какие использовались в играх — встречаются крайне занимательные вещи. И среди этого интереса есть одна частность: «вид из глаз» в играх для Sega Genesis. Их на платформе всего около пяти штук, и каждая использует уникальные трюки.
Мой личный фаворит даже не супер-классный Zero Tolerance, в котором тоже много умопомрачительных трюков (типа лифта и лестницы, или спрайтовых дверей), а страшненький и тормозной Bloodshot.
Во-первых, как все давно уже заметили, стены в нём рисуются на половину их высоты, а другая половина отражена зеркально, и за счёт смены палитры вносится небольшая асимметрия (череп на двери). Во-вторых, из-за этого игра вынуждена отображать спрайты не на слое фона, а на отдельном слое аппаратных спрайтов, динамически конструируя его, чтобы покрыть нужные части экрана.
Но есть ещё в-третьих, и я всегда догадывался об этом, но не имел подтверждения. И в Bloodshot, и в ZT есть «диагональные» стены — если бы посмотреть на них сверху. Обычно в простых рейкастинг-движках мир состоит из клеток, и стена — это ребро куба, занимающего клетку, поэтому все стены расположены под 90 градусов друг к другу.
Диагональные стены в таких движках делать сложно, так как клетки проходятся алгоритмами типа DDA, и чтобы засечь попадение луча в диагональную стену, нужно выдумывать трюки. В ZT это скорее всего сделано увеличением разрешения прохода луча для «диагональных» клеток. Но есть ещё способ математически проверять принадлежащий клетке отрезок на пересечение с лучом. Клетка играет роль сектора, а DDA ищет видимые сектора.
Есть ещё один интересный момент, не сразу бросающийся в глаза. В Bloodshot есть «тонкие» колонны, размером в четверть клетки. И ещё один: двери в нём имеют толщину, включая текстуру на торце двери, а не являются тонкой анимированной текстурой, как в большинстве Wolf 3D-подобных игр. Почему? Исходя из этих визуальных наблюдений я очень давно предположил: в Bloodshot мир кодируется не клетками, а набором отрезков, и весь рейкастинг в нём работает на математической проверке пересечений луча и каждого отрезка. И именно поэтому он так тормозит.
Чтобы доказать это, я когда-то пытался разобрать формат карт, найти, где они вообще есть. Если бы они были просто клеточными, их легко было бы найти в бинарных данных просто глазами. Я нашёл текстуры, сделал их экспорт, но карты так и не нашёл. Это утвердило меня в мысли о верности теории, но прямого доказательства не было. И вот наконец я снова вернулся к этой теме, и обнаружил, что для игры сделали редактор карт. И да: они реально векторные! Дело закрыто!
разное
разработка