Проектная работа
Как устроен 3D‑мир в играх
Любая игра - это точки, треугольники и немного математики. Семь коротких уроков, в каждом живая сцена, которую можно покрутить руками.
Курсор над полом
x y z
Кликни по полу - робот пойдёт туда. Тяни мышью, чтобы повернуть камеру.
Как игра понимает, куда ты кликнул? Из камеры через курсор выпускается невидимый луч, и игра ищет, где он пересёк пол. Это называется рейкаст. Так работают клики в стратегиях, выстрелы в шутерах и выбор предметов мышкой.
О проекте
Актуальность
В трёхмерном пространстве работают игры, симуляторы, архитектурные визуализации и виртуальные примерочные. Чтобы их создавать, нужно понимать, как компьютер хранит и показывает 3D-мир. Обычно это объясняют формулами и схемами на бумаге, а трёхмерные вещи на плоском рисунке понять трудно. Гораздо нагляднее, когда сцену можно повернуть и изменить самому.
Цель
Наглядно объяснить, как устроено трёхмерное пространство в компьютерных играх, и сделать интерактивное пособие, в котором каждое понятие можно проверить на живой сцене.
Задачи
- Разобраться, как задаётся положение точки: координаты X, Y, Z и системы осей в разных движках (урок 1).
- Изучить трансформ объекта: позицию, поворот и масштаб (урок 2).
- Выяснить, из чего состоит 3D-модель и зачем играм уровни детализации (урок 3).
- Показать иерархию объектов и разницу между локальными и мировыми координатами (урок 4).
- Разобрать работу камеры: угол обзора, пирамиду видимости и отсечение лишнего (урок 5).
- Показать, как свет и материал меняют вид поверхности (урок 6).
- Объяснить игровой цикл и роль deltaTime (урок 7).
- Собрать всё в интерактивный сайт с живыми 3D-сценами.
Урок 1 из 7
Каждая точка - это три числа
В 3D-мире у любой точки есть адрес из трёх чисел: X - вправо и влево, Y - вверх и вниз, Z - вперёд и назад. Центр мира, где все три числа равны нулю, называют началом координат.
Двигай ползунки. Пунктир показывает, как точка отбрасывает «тень» на пол и на оси: по нему удобно читать её координаты.
Разные движки договорились по-разному, какая ось смотрит вверх:
| Движок | Вверх | Система |
|---|---|---|
| Unity | Y | левая |
| Unreal Engine | Z | левая |
| Godot | Y | правая |
| Blender | Z | правая |
| Three.js, этот сайт | Y | правая |
Левая и правая система отличаются направлением одной оси. Поэтому модель из Blender в Unity иногда приезжает лёжа на боку.
position = (2.00, 1.50, 1.00)
Урок 2 из 7
Позиция, поворот, масштаб
У каждого объекта в игре есть трансформ - три набора чисел. Позиция говорит, где объект стоит. Поворот - куда он смотрит. Масштаб - во сколько раз он больше или меньше исходной модели.
Когда персонаж бежит, игра каждый кадр меняет его позицию. Когда оборачивается - поворот. Больше ничего и не нужно, чтобы расставить весь мир.
Тяни за стрелки и кольца прямо на модели. Клавиши W, E и R переключают режимы, как в Unity: сначала кликни по сцене.
В редакторах поворот показывают в градусах. Внутри движок обычно хранит его в радианах или кватернионах - так удобнее считать и не бывает «шарнирного замка», когда две оси поворота совпадают.
| Позиция | 0.00 | 0.00 | 0.00 |
|---|---|---|---|
| Поворот, ° | 0 | 0 | 0 |
| Масштаб | 1.00 | 1.00 | 1.00 |
Урок 3 из 7
Модель - это сетка из треугольников
Видеокарта умеет рисовать только треугольники, зато очень много и очень быстро. Любая модель, от камня до персонажа, собрана из них. Такая сетка называется меш, а углы треугольников - вершины.
В каждой вершине хранится её позиция и нормаль - стрелка, которая показывает, куда «смотрит» поверхность. По нормалям игра считает, как на объект падает свет.
Больше треугольников - глаже форма, но тяжелее для видеокарты. Поэтому далёкие объекты в играх подменяют упрощёнными копиями. Это называется LOD, уровень детализации.
0 треугольников, 0 вершин
Урок 4 из 7
Объекты вложены друг в друга
В играх объекты собраны в дерево: меч лежит в руке, рука прикреплена к телу, тело - к персонажу. Объект-«ребёнок» двигается вместе с «родителем» и хранит свои координаты относительно него. Это локальные координаты. А мировые - где объект находится на самом деле, если считать от центра мира.
Луна здесь - ребёнок планеты, планета - ребёнок солнца. Каждый просто крутится по кругу, но в мире луна рисует сложную петлю.
Посмотри на числа: локальные координаты луны не меняются вовсе. Луна никуда не движется сама, крутятся её родители.
| Луна, локально | |||
|---|---|---|---|
| Луна, в мире |
Урок 5 из 7
Камера видит только пирамиду
Игрок видит мир через камеру. У неё есть угол обзора - FOV: чем он больше, тем шире картинка и сильнее искажения по краям.
Всё, что видит камера, помещается в усечённую пирамиду - frustum. У пирамиды есть ближняя и дальняя стенка: слишком близкое и слишком далёкое тоже не рисуется. Объекты вне пирамиды игра даже не отправляет видеокарте - так экономятся силы.
Большое окно - вид со стороны, жёлтые линии - пирамида камеры. Маленькое окно - то, что видит игрок. Серые объекты сейчас не рисуются.
Ортографическая камера не уменьшает далёкие предметы. Так рисуют стратегии и изометрические игры.
Рисуется 0 из 0 объектов
Урок 6 из 7
Свет и материал решают, как выглядит поверхность
Одна и та же форма может выглядеть как пластик, металл или резина - всё решает материал. В современных играх его описывают двумя главными числами: шероховатость (roughness) и металличность (metalness). Гладкая поверхность даёт чёткий блик, шероховатая рассеивает свет.
Тени тоже считаются: игра рисует сцену с точки зрения источника света и запоминает, что он видит. Всё, что свет не видит, оказывается в тени. Это называется карта теней.
Подвигай солнце и посмотри, как тени бегут по полу.
Урок 7 из 7
Игра - это цикл, который крутится 60 раз в секунду
Каждый кадр игра делает одно и то же: смотрит, какие клавиши нажаты, двигает объекты, проверяет столкновения и рисует картинку.
Между кадрами проходит немного времени - deltaTime. На него умножают скорость, чтобы персонаж бегал одинаково и на слабом, и на мощном компьютере.
function update(dt) {
const dir = readKeys(); // куда жмёт игрок
robot.x += dir.x * speed * dt; // скорость × время
robot.z += dir.z * speed * dt;
checkCrystals(); // столкновения
render(); // картинка на экран
}
Столкновение здесь самое простое: если до кристалла меньше метра, он собран. Ползунок «Скорость времени» замедляет весь мир, как слоу-мо.
Кликни сюда, чтобы управлять
WASD или стрелки - идти, Shift - бежать
0 кадров в секунду
dt = 0 мс
Кристаллы 0 из 0
position = (0.00, 0.00, 0.00)
Вывод
Трёхмерный мир игры держится на нескольких простых идеях. Положение любой точки - это три числа. Каждый объект описывается трансформом: позицией, поворотом и масштабом. Модели собраны из треугольников, объекты вложены друг в друга, а камера показывает только то, что попало в её пирамиду видимости. Свет и материал решают, как выглядит поверхность, а игровой цикл каждый кадр двигает мир с поправкой на deltaTime.
Все задачи проекта выполнены: каждое понятие разобрано в отдельном уроке и показано на живой 3D-сцене, где его можно изменить и сразу увидеть результат. Сайт работает в браузере без установки и подойдёт как наглядное пособие для тех, кто начинает разбираться в разработке игр.
Источники
- three.js docs. Документация библиотеки three.js.
- Transforms. Unity Manual.
- Coordinate System and Spaces. Документация Unreal Engine.
- Using 3D transforms. Документация Godot Engine.
- Coordinate Systems. LearnOpenGL.
- Camera. LearnOpenGL.
- Explaining basic 3D theory. MDN Web Docs.
- WebGL model view projection. MDN Web Docs.
- Game Loop. Nystrom R. Game Programming Patterns.
Дата обращения ко всем ресурсам: 27.09.2026.