Разбор · Проектная работа на заказ
Как устроен 3D-мир в играх
Интерактивный учебник для защиты студенческого проекта: семь коротких уроков о том, как игры хранят и рисуют трёхмерный мир. В каждом уроке живая 3D-сцена, которую можно покрутить руками, а на первом экране робот идёт туда, куда кликнули.
- Тип
- Проектная работа на заказ для студента, защищена на «отлично»
- Сроки
- 27 сентября 2026, 2 коммита
- Стек
- HTML, CSS, JavaScript и three.js без сборщика · 2034 строки
Первый экран: робот идёт к точке клика, ширина 1440px.
Телефон, 393px.
Урок 1 на телефоне.
01
Для кого и зачем
Заказ от студента: ему нужен был сайт для защиты проекта о том, как устроено трёхмерное пространство в играх. Тема абстрактная — координаты, матрицы, камеры, — и на словах её легко потерять. Задача была показать каждое понятие так, чтобы его можно было потрогать: подвинуть ползунок, повернуть камеру, кликнуть по полу.
Поэтому каждый урок устроен одинаково: слева короткий текст простым языком, справа живая сцена и табло с цифрами, которые меняются вместе с ней. Сам сайт оформлен как проектная работа: в начале актуальность, цель и задачи, в конце вывод и источники, а каждая задача ведёт к своему уроку. Проект защищён на «отлично».
02
Что сделано
- Первый экранпометка «Проектная работа» и робот на сетке с осями: кликаешь по полу — идёт туда, а табло показывает координаты под курсором
- О проектеактуальность, цель, восемь задач со ссылками на уроки и паспорт проекта в виде основной надписи чертежа
- Координатыкристалл на ползунках X, Y, Z, пунктирные проекции на оси и таблица «какая ось смотрит вверх» в Unity, Unreal, Godot и Blender
- Трансформманипулятор, как в редакторах движков: перемещение, поворот и масштаб по клавишам W, E, R и таблица чисел
- Мешсфера, бублик и камень в шести уровнях детализации: каркас, вершины, нормали и счётчик треугольников
- Иерархиясолнце, планета и луна: локальные координаты луны не меняются, а мировые рисуют петлю
- Камерапирамида обзора со стороны и окно «вид игрока», перспектива и ортография, счётчик того, что рисуется
- Свет и материалшероховатость, металличность, цвет, положение солнца и тени
- Игровой циклмини-игра на WASD с кристаллами, кадры в секунду, deltaTime и замедление времени
- Вывод и источникиитог проекта и девять источников: документация three.js, Unity, Unreal и Godot, LearnOpenGL, MDN и Game Programming Patterns
- Файлыindex.html — 369 строк, style.css — 364, десять JS-модулей — 1301: общий модуль сцены и по файлу на каждый урок.
- Библиотекиthree.js 0.170 подключается через importmap с jsDelivr, без сборщика. Модель робота — RobotExpressive из примеров three.js, лицензия CC0.
- СкоростьСцена запускается за 400px до появления на экране и рисуется, только пока её видно. Плотность пикселей ограничена двумя.
- АдаптивОдна точка перелома — 900px. На сенсорных экранах вместо подсказки про клавиатуру появляются кнопки-стрелки. При «уменьшить движение» декорации сами не вращаются.
03
Решения, на которые стоит посмотреть
-
Клик по полу — это рейкаст
Координаты мыши переводятся в диапазон от −1 до 1, из камеры через эту точку выпускается луч, и сайт ищет, где он пересёк пол. Клик от поворота камеры отличается по расстоянию: если между нажатием и отпусканием мышь ушла дальше 6px, это был поворот, и робот никуда не идёт.
-
Цвет — это ось
X красная #e5484d, Y зелёная #2f9e57, Z синяя #2f6feb — как во всех 3D-редакторах. Эти три цвета — единственные акценты на странице: ими подписаны оси в сценах, покрашены ползунки, цифры на табло и буквы в тексте уроков. По цвету сразу понятно, о какой координате речь.
-
Восемь сцен, один цикл
На странице восемь 3D-окон, но цикл отрисовки один. Сцена создаётся, когда до неё осталось 400px прокрутки, а рисуется, только пока её видно, — поэтому страница не тормозит и на ноутбуке со встроенной графикой. Время кадра ограничено 0,1 с: после переключения вкладки робот не «телепортируется».
-
Камера показывает саму себя
В уроке про камеру на одном холсте два вида: со стороны и глазами игрока. Второй рисуется через scissor ровно под рамкой из CSS. Каждый кадр строится пирамида обзора и проверяется каждый объект: что в неё не попало, красится серым, а табло считает, сколько объектов рисуется. Корпус камеры и линии пирамиды лежат на отдельном слое, поэтому игрок их не видит.
-
Один робот на все сцены
Модель скачивается один раз, а каждая сцена получает свою копию со своим скелетом. Высота считается только по жёстким частям тела: у кистей сырые размеры в «единицах скелета» в сто раз больше, и с ними робот сжимался до точки. Если первый адрес модели не отвечает, берётся второй, а без сети вместо робота появляется фигура из кубиков.
Что стоит доработать
- three.js и модель робота грузятся со сторонних серверов, jsDelivr и threejs.org. Без интернета 3D не запустится совсем.
- На телефоне касание 3D-окна поворачивает камеру, а не листает страницу: прокручивать приходится за текст.
- Приблизить сцену нельзя: колесо мыши отдано прокрутке страницы, а жест «щипок» выключен вместе с ним.
- У «камня» в уроке про меш в каждой вершине торчит пучок нормалей — по одной на каждую плоскую грань. В тексте урока это не объяснено.
04
Как проверить
- Кликнуть по полу на первом экране — робот пойдёт в эту точку первый экран ↗
- Сузить угол обзора камеры и посмотреть, как объекты становятся серыми камера ↗
- Собрать пять кристаллов на WASD и замедлить время ползунком мини-игра ↗
Связь со мной