Lab 03 · потрогать руками
Пощупай рендер Doom
Лаба без кода: крути ползунки и двигай игрока — формулы из урока оживают прямо здесь, в браузере (и на телефоне). Ничего писать не надо, всё считается на лету.
Как пользоваться
Три живых эксперимента под формулами из урока. Меняешь параметр — картинка и числа пересчитываются мгновенно. Цель не «написать рендер», а почувствовать, почему высота падает как 1/z, почему BSP даёт правильный порядок из любой точки, и сколько экономит front-to-back. Внизу — ноутбук для домашнего компа, если захочешь те же опыты на реальном numpy.
1 · Проекция: высота ∝ 1/z
Высота стены на экране — перспективная проекция. Крути z (глубину) и смотри, как столбец растёт/сжимается:
Что заметить: удвой z (200→400) — высота падает ровно вдвое. Это и есть 1/z, единственный источник «глубины». Расширь FOV — d_proj падает, и весь мир мельчает (рыбий глаз).
2 · BSP: порядок front-to-back из любой точки
Уровень разбит двумя секущими прямыми на 4 subsector'а. Перетащи игрока (красная точка) — порядок обхода пересчитывается через знак векторного произведения на каждом узле:
Что заметить: перетащи игрока через пунктирную линию — два ближних листа меняются местами (1↔2). Дерево не пересчитывает геометрию, только знак
s на узлах — и порядок всегда верный. Вот почему BSP работает из любой позиции.3 · Overdraw: что экономит front-to-back
Пять стен в коридоре перекрывают столбцы экрана. Переключай режим и смотри на счётчик записанных пикселей:
Что заметить: с отсечением (front-to-back) каждый столбец пишется один раз — overdraw ≈ 1.0×. В режиме painter (back-to-front) дальние стены рисуются зря и затираются ближними — записей в 2–3 раза больше. На 486 это была разница между «играбельно» и «слайд-шоу».
🏠 Что дальше
Вернись в урок, раздел «🎮 Поиграй / поковыряй» — как запустить настоящий Doom и поломать его (DSDA-Doom для наблюдений, chocolate-doom + брейкпоинт в обходе BSP, nuts.wad для visplane overflow).
Связи
из урока
Doom и BSP — теория за этими тремя экспериментами: проекция, обход дерева, отсечение.
дальше
ECS — тот же «горячий цикл по столбцам» как пример кэш-дружелюбной раскладки.
Что заметить по итогу (чеклист наблюдений)
- z вдвое больше → высота вдвое меньше (проверил на ползунке).
- Игрок за пунктиром → порядок ближних листов меняется, но всегда корректен.
- front-to-back overdraw ≈ 1.0×, painter — заметно больше.
- Сформулировал, почему fill rate, а не «3D-математика», был узким местом 1993-го.