Когда школьники впервые учатся программировать, они начинают с простых консольных программ. Не знаю, как у других, но моя практика долгое время заключалась в решении каких-то задачек из спортивного программирования.
В моём окружении главной наживкой для обучения программированию была разработка игр. Однако, никто нам не объяснил - как на том же самом 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