Многие начинают с энтузиазма и быстро сталкиваются с реальностью: Scratch — визуальная среда, в которой всё заточено под 2D. Хотите вращающийся мир, камеру, объекты, которые выглядят объёмными — и ломаете голову, как это реализовать без языков программирования и сторонних библиотек. Болят руки от множества клонов, игра тормозит, объекты налетают друг на друга, а глубина рисования не работает. В этой статье я разложу по шагам реальные техники, которые позволяют в Scratch получить ощущение трёхмерности — от простых приёмов до собственного «вершинного» движка — и покажу, где ждать подводных камней и как их обходить.
- Краткая карта подходов и когда какой выбрать
- Подготовка: что учесть перед началом работы
- Шаг за шагом: простой 3D‑движок с вершинами и перспективой
- Практические заметки по реализации в Scratch
- Улучшение вида: освещение, сортировка и билборды
- Оптимизация и три практических приёма
- Частые ошибки и как их избежать
- Короткий чек‑лист перед запуском
Краткая карта подходов и когда какой выбрать
Прежде чем углубляться в код, важно понимать три основных способа получить 3D‑эффект в Scratch. Каждый подходит под разные задачи: простая визуальная игра, шутер типа старой школы, изометрическая стратегия или полноценный движок с объектами, которые можно поворачивать в пространстве.
| Подход | Суть | Плюсы | Минусы | Подходит для |
|---|---|---|---|---|
| Изометрия | Рисунок в изометрической сетке, спрайты с заранее нарисованными видами | Простой в реализации, дешев в ресурсах | Нет настоящей перспективы, ограниченная перспектива | Стратегии, головоломки, платформеры |
| Билборды и слоёвка | Объекты — плоские спрайты, масштабируются и располагаются по глубине | Лёгкая имитация объёма, быстро работает | Нужны множество костюмов для вращения | 2.5D платформеры, RPG |
| Проекция вершин (реальная 3D) | Хранение 3D‑координат, математика поворота и перспективной проекции | Гибкость, настоящая перспектива и вращение | Сложнее в реализации, нужно сортировать по глубине, может тормозить | Учебные проекты, демо‑движки, простые 3D‑игры |
| Raycasting (вертикальные срезы) | Как в старых 3D шутерах, рисуем вертикальные полосы по глубине | Хорош для лабиринтов и FPS в ретро‑стиле | Ограничен по визуалу, сложнее освещение | Лабиринты, ретро‑шутеры |
Подготовка: что учесть перед началом работы
Перед тем как писать скрипты, продумайте ограничения и подготовьте структуру проекта. Scratch имеет лимиты: количество клонов, быстрота исполнения блоков, и отсутствие прямого доступа к низкоуровневым оптимизациям. Поэтому проект должен учитывать экономию ресурсов и простоту данных.
- Решите, будете ли вы использовать множество костюмов для спрайтов или хранить геометрию в списках.
- Определите формат хранения вершин: три списка для X, Y, Z или один список с трёхзначными записями.
- Планируйте отрисовку: будете ли вы рисовать линиями пером, позиционировать клоны или менять размеры спрайтов.
- Подготовьте базовые переменные: камераX, камераY, камераZ, уголYaw, уголPitch, focalLength.
Шаг за шагом: простой 3D‑движок с вершинами и перспективой
Здесь приведу рабочий алгоритм, который можно адаптировать в Scratch. Он даёт настоящую перспективу и возможность вращать объекты вокруг собственной оси и камеры.
- Создайте списки verticesX, verticesY, verticesZ. В них добавьте координаты вершин объекта. Например, куб — 8 точек.
- Создайте список edges, где пары чисел обозначают индексы вершин, которые нужно соединить линией.
- Заведите переменные камеры: camX, camY, camZ и углы camYaw, camPitch. Также задайте focalLength — число, определяющее силу перспективы.
- Каждый кадр выполняйте:
- Для каждой вершины прочитайте её координаты, вычтите координаты камеры — получите относительные координаты.
- Поверните точку вокруг осей: сначала по Y (yaw), затем по X (pitch). Формулы поворота используют cos и sin. Пример для поворота вокруг Y:newX = x * cos(yaw) — z * sin(yaw)
newZ = x * sin(yaw) + z * cos(yaw)
- Выполните перспективную проекцию:screenX = centerX + (newX * focalLength) / newZ
screenY = centerY — (newY * focalLength) / newZ
Здесь важно проверять newZ > 0, иначе точка за камерой.
- Сохраните проецированные координаты в списки screenX и screenY.
- Перед рисованием отсортируйте ребра по средней глубине их вершин (average newZ). Рисуйте от дальних к ближним, чтобы получить корректную видимость.
- Для отрисовки используйте перо или создавайте клоны, которые рисуют линии между screen‑координатами. Перо обычно экономнее по числу клонов.
Практические заметки по реализации в Scratch
- Списки в Scratch медленнее массивов в обычных языках. Ограничьте количество вершин и обновляйте только при необходимости.
- Для быстродействия используйте фиксированный шаг времени и не считайте лишние trig‑функции — храните результаты cos/sin для часто используемых углов.
- Проверяйте newZ на маленькие значения, чтобы избежать деления на ноль и сильных рывков в масштабе.
- Если хотите объекты с текстурами, используйте билборды: отдельный спрайт с костюмами для разных углов и масштабируйте его по глубине.
Улучшение вида: освещение, сортировка и билборды
После того как базовая проекция работает, можно добавить детали, которые придадут иллюзию объёма и глубины:
- Освещение: расчёт нормали грани и скалирование яркости в зависимости от угла между нормалью и направлением света. Для простоты используйте dot‑product и нормализованные векторы.
- Глубинная сортировка: сортируйте не только ребра, но и полигоны по средней Z. Это важно при заполнении граней цветом или текстурами.
- Клиффинг: не рисуйте объекты или части граней, которые находятся за камерой или слишком близко.
- Коллизии: для простоты используйте сферические или осе‑выравненные боксы вместо сложной полигониальной коллизии.
Оптимизация и три практических приёма
Если игра тормозит, начните с простых экономящих приёмов.
- Уменьшите число вершин и граней. Чем проще модель, тем быстрее отрисовка.
- Используйте перо вместо клонов там, где можно. Клоны удобно для интерактивных объектов, но их много — это тормоза.
- Обновляйте отображение только при изменении сцены. Если камера не двигается, не пересчитывайте и не перерисовывайте всё каждый кадр.
Частые ошибки и как их избежать

- Ошибка: деление на ноль при проекции. Решение: добавьте минимальную границу newZ, и скрывайте вершины с newZ ≤ 0.1.
- Ошибка: неправильная сортировка — ближние элементы перекрываются. Решение: сортируйте полигоны по средней глубине и рисуйте от дальнего к ближнему.
- Ошибка: слишком много костюмов для поворота персонажей. Решение: используйте билборды и интерполяцию масштаба вместо бесконечных кадров.
Короткий чек‑лист перед запуском
| Пункт | Проверено |
|---|---|
| Хранятся ли координаты вершин в списках | Да/Нет |
| Есть ли камера и focalLength | Да/Нет |
| Проверяется ли newZ перед проекцией | Да/Нет |
| Сортация граней по глубине реализована | Да/Нет |
| Оптимизация: минимальные клоны, перерисовка при изменениях | Да/Нет |
Сделать настоящую 3D‑игру в Scratch реально. Это требует терпения и осторожного подхода к структуре данных и отрисовке. Начните с простого — кубов и камер, затем добавляйте освещение, текстуры и коллизии. Маленькие шаги, постоянное тестирование и внимание к производительности дадут результат быстрее, чем попытки сразу сделать сложный мир. Удачи в эксперименте — и не бойтесь ломать и заново собирать архитектуру на каждом шаге.












