TGViewer
Knowledge Accumulator Knowledge Accumulator @knowledge_accumulator · 5.69K subscribers
Post #299 2.53K
Как создать новую вселенную за 20 строк кода?

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

В моём окружении главной наживкой для обучения программированию была разработка игр. Однако, никто нам не объяснил - как на том же самом C++, на котором я решаю динамическое программирование, создаются 3D-игры? Интуитивно казалось, что эту пропасть нереально преодолеть, и мотивации разобраться не было.

Недавно я решил закрыть эту дыру и обнаружил вот это замечательное видео. Оказывается, на современном железе сделать подобие First Person View это элементарная задача.

Итак, заведём бинарный 2D-массив, содержащий "карту мира" - в каждой позиции либо стена, либо пустота. Смотря на значения этих переменных, у вас не возникнет мысли о том, что перед вами полноценная параллельная вселенная. Но пары секунд игрового опыта может быть достаточно, чтобы свести ваш мозг с ума и заставить в это поверить.

Представьте, что вы умеете рендерить 2D-массив пикселей в каком-нибудь окне. Заведём 4 переменные - x, y, angle и fov - координаты камеры, угол по горизонтали, в котором она смотрит, и угол её обзора.

Чтобы нарисовать картинку от первого лица из этого положения, проходимся по каждому столбцу экрана. Каждый из них соответствует конкретному углу - между angle - fov/2 и angle + fov/2.

Далее "запускаем луч" из положения камеры в этом направлении - "летим" переменными x_ray и y_ray, двигая точку по чуть-чуть в упомянутом направлении. На каждом шаге просто проверяем, есть ли блок стены в этом месте. Когда мы нашли блок стены или улетели за дальность прорисовки, возвращаем одно число - wall_distance.

Итак, у нас есть список wall_distance для каждой x-координаты. Теперь рисуем вертикальную линию в каждом столбце. Линия всегда будет в центре, а её длина будет обратно пропорциональна wall_distance. Осталось добавить тривиальное управление персонажем - изменение x, y, angle по кнопкам. Параллельная реальность готова!

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

Посмотрите на гифку. Если вы не ощущаете себя в этой комнате, скорее всего, с вами не всё в порядке.

Этот базовый алгоритм называется Ray Casting и был впервые реализован ещё в 1960-х. На рубеже 80-х и 90-х благодаря изобретательству таких людей, как Джон Кармак, и развитию железа, стало возможно создавать адекватный игровой опыт на основе такой технологии.

На подобном принципе был основан движок игры Wolfenstein 3D (1992) - знакового шутера того времени. Со временем он эволюционировал до полноценного 3D и лёг в основу Quake Engine (1996), от которого берут своё начало Source (Half-Life, CS, Dota 2), IW (Call of Duty) и, конечно, движок всех Doom.

Как оказалось, заложить первый кирпич в здание полноценной игры и создать параллельную вселенную с нуля не очень сложно! Даже написать обучение линейной регрессии на чистом C++, скорее всего, сложнее.

Очень рад за новое поколение, у которого есть такое количество доступной и познавательной информации в интернете, и они могут без большого труда прикоснуться к прекрасному. С другой стороны, их мозги превратятся в кисель благодаря тиктоку и шортсам, так что, соболезную.

@knowledge_accumulator
  • 👍 18
  • 🔥 6
  • 😁 4
  • ❤ 3
More from @knowledge_accumulator
  1. Sep 20, 2026Почувствуйте AGI Все эти годы я писал о том, что не верю в потенциал LLM превратиться в су…
  2. Sep 5, 2026Предсказать среднее могут не только лишь все Классическая задача машинного обучения - трен…
  3. Aug 17, 2026Долина vs Нью-Йорк Если что-то находится далеко от нас, нам свойственно излишне обобщать с…
  4. Jul 30, 2026Кто виноват в сливе рекламного бюджета? При создании рекламного line item рекламодатель ус…
  5. Jul 13, 2026Покатался на яхте в Американской глубинке После переезда в Калифорнию произошло неожиданно…
  6. Jun 30, 2026Да кто такие эти ваши producer-side A/B-тесты? В своей яндексовской эре работы над рекомен…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →