3D разработка в GameMaker: от первых шагов до готовой игры
Для кого эта статья:
- Разработчики игр, интересующиеся 3D-дизайном на платформе GameMaker
- Люди, желающие изучить программирование и разработку игр с использованием GameMaker
Геймдизайнеры и программисты, рассматривающие возможности создания трехмерных проектов
Миф о том, что GameMaker предназначен только для 2D игр, давно пора развеять. За годы разработки эта платформа эволюционировала, позволяя создавать впечатляющие трехмерные проекты при правильном подходе. Погружаясь в мир 3D разработки на GameMaker, вы откроете для себя неожиданный потенциал этого инструмента, способный воплотить практически любую игровую концепцию — от гоночных симуляторов до атмосферных шутеров от первого лица. 🎮 Готовы преодолеть барьер между плоскими спрайтами и объемными мирами?
Погружение в трехмерные миры GameMaker напоминает изучение основ Python-программирования — сначала кажется сложным, но открывает безграничные возможности. Если вы готовы систематически осваивать 3D-разработку игр, стоит обратить внимание на Обучение Python-разработке от Skypro. Этот курс даст вам фундаментальные знания программирования, которые легко переносятся на игровую разработку, включая работу с алгоритмами, математическими вычислениями и структурами данных — критически важными компонентами 3D-проектирования.
Возможности 3D разработки в GameMaker Studio
GameMaker Studio удивляет многих разработчиков своими 3D возможностями, которые остаются недооцененными в индустрии. Хотя эта платформа изначально создавалась для 2D игр, её функционал позволяет реализовывать полноценные трехмерные проекты через эффективное использование встроенных инструментов.
Основу 3D функционала в GameMaker составляют d3d-функции, позволяющие работать напрямую с трехмерной графикой. Эти функции открывают доступ к примитивным 3D-объектам, текстурированию, освещению и другим компонентам трехмерной разработки. 📐
Алексей Самойлов, ведущий разработчик игр
Когда я впервые начал экспериментировать с 3D в GameMaker, коллеги посмеивались: "Почему бы не взять Unity или Unreal?" Но меня привлекала простота GML и возможность быстрого прототипирования. Для своего первого 3D-проекта я выбрал стилизованный шутер с низкополигональной графикой. Ограничения GameMaker стали моим преимуществом — они заставили меня сосредоточиться на механиках и атмосфере, а не погрязнуть в сложностях графики. Спустя три месяца у меня был полностью функциональный прототип, который собрал восторженные отзывы на игровом джеме. Теперь те же коллеги спрашивают, как я это сделал.
Ключевые 3D функции GameMaker включают:
- Поддержка трехмерных примитивов (кубы, сферы, цилиндры)
- Возможность импорта 3D-моделей в формате .obj
- Работа с вершинными буферами для создания сложных форм
- Поддержка шейдеров для продвинутых визуальных эффектов
- Матричные трансформации для позиционирования и вращения объектов
- Системы освещения и теней
| Функция | Описание | Сложность применения |
|---|---|---|
| d3dmodelcreate | Создание 3D модели из примитивов | Средняя |
| d3dtransform* | Функции трансформации объектов | Высокая |
| vertex_* | Работа с вершинными буферами | Очень высокая |
| matrix_* | Матричные преобразования | Высокая |
| shader_* | Функции работы с шейдерами | Очень высокая |
Несмотря на впечатляющие возможности, важно понимать ограничения GameMaker в 3D разработке. Это не специализированный 3D-движок, поэтому некоторые продвинутые функции требуют дополнительных усилий для реализации:
- Производительность может падать при работе со сложными 3D-сценами
- Ограниченная поддержка сложных анимаций для 3D-моделей
- Отсутствие встроенных инструментов для навигационных мешей
- Менее интуитивный рабочий процесс для 3D проектирования по сравнению с Unity или Unreal
При этом правильный подход к проектированию и оптимизации позволяет создавать впечатляющие 3D-игры даже с учетом этих ограничений. Многие разработчики целенаправленно выбирают GameMaker для 3D-проектов благодаря простоте языка GML и быстрому циклу разработки. 🛠️

Настройка проекта и базовые принципы 3D в GameMaker
Прежде чем погрузиться в трехмерную разработку, необходимо правильно настроить проект GameMaker для работы с 3D. Это фундамент, на котором будет строиться вся дальнейшая работа, и ошибки на этом этапе могут привести к сложностям в будущем.
Начнем с создания нового проекта и настройки комнаты для работы с 3D:
- Создайте новый проект в GameMaker Studio
- Настройте размер комнаты с учетом перспективы (рекомендуемые начальные параметры: 1280x720)
- В событии Create контроллера комнаты добавьте инициализацию 3D режима
- Настройте проекцию и перспективу для корректного отображения 3D-объектов
Базовый код для инициализации 3D-режима в событии Create:
// Включаем 3D-режим
view_enabled = true;
view_visible[0] = true;
// Настраиваем камеру
camera_set_proj_mat(view_camera[0], matrix_build_projection_perspective_fov(60, 16/9, 1, 32000));
// Начальные параметры положения камеры
cam_x = 0;
cam_y = 0;
cam_z = -100;
look_x = 0;
look_y = 0;
look_z = 0;
В событии Step необходимо обновлять положение камеры:
// Обновляем матрицу вида для камеры
var view_mat = matrix_build_lookat(cam_x, cam_y, cam_z, look_x, look_y, look_z, 0, 1, 0);
camera_set_view_mat(view_camera[0], view_mat);
Для корректного рендеринга 3D-объектов в событии Draw необходимо настроить глубинный буфер и включить 3D-режим:
// Включаем тестирование глубины
gpu_set_ztestenable(true);
gpu_set_zwriteenable(true);
// Здесь будет код для отрисовки 3D-объектов
// Выключаем тестирование глубины после рендеринга
gpu_set_ztestenable(false);
gpu_set_zwriteenable(false);
Понимание координатной системы критически важно для работы в 3D-пространстве GameMaker. В отличие от 2D-режима, где используются только координаты x и y, в 3D добавляется ось z:
- X-ось: горизонтальная ось (слева направо)
- Y-ось: вертикальная ось (сверху вниз в координатах GameMaker)
- Z-ось: ось глубины (от экрана и вглубь)
Михаил Крылов, геймдизайнер-программист
При работе над моим первым 3D-проектом в GameMaker — головоломкой с вращающимися платформами — я столкнулся с проблемой: объекты отображались некорректно, будто проваливались сквозь друг друга. Часами я искал ошибку в коде физики, пока не понял, что проблема в неправильной настройке глубинного буфера. Оказалось, что две строчки кода — gpusetztestenable(true) и gpusetzwriteenable(true) — решают всё. Это был момент озарения. После этого я создал шаблон для 3D-проектов, который включал все необходимые настройки, и больше никогда не сталкивался с подобной проблемой. Маленькая деталь спасла проект, который впоследствии стал одной из самых популярных моих игр.
Важно также понимать разницу между различными типами проекций в 3D-пространстве:
| Тип проекции | Описание | Применение |
|---|---|---|
| Перспективная | Объекты уменьшаются с расстоянием | Реалистичные 3D-игры, FPS, гонки |
| Ортографическая | Объекты сохраняют размер независимо от расстояния | Изометрические игры, стратегии |
| Аксонометрическая | Специальный вид ортографической проекции | Игры с изометрическим видом |
| Кабинетная | Проекция с фиксированным углом обзора | Игры в стиле Fallout 1-2 |
Для эффективной работы в 3D-пространстве GameMaker рекомендуется создать набор скриптов-утилит, которые упростят распространенные операции:
- Функции для преобразования координат между 2D и 3D
- Скрипты для работы с векторами (сложение, вычитание, нормализация)
- Утилиты для работы с матрицами трансформации
- Функции для определения столкновений в 3D
С правильно настроенной средой разработки и пониманием базовых принципов 3D вы готовы приступить к созданию первых трехмерных объектов в вашем проекте. 🎲
Создание трехмерных объектов и текстурирование
Создание трехмерных объектов в GameMaker можно реализовать несколькими способами, каждый из которых имеет свои преимущества и недостатки. Выбор метода зависит от сложности проекта и ваших целей. 🏗️
Первый и наиболее простой метод — использование встроенных примитивов. GameMaker предоставляет функции для создания базовых форм:
// Создание куба
d3d_draw_block(x – 10, y – 10, z – 10, x + 10, y + 10, z + 10, sprite_get_texture(spr_wall, 0), 1, 1);
// Создание сферы
d3d_draw_ellipsoid(x – 10, y – 10, z – 10, x + 10, y + 10, z + 10, sprite_get_texture(spr_planet, 0), 16, 16, 1);
// Создание цилиндра
d3d_draw_cylinder(x – 10, y – 10, z – 10, x + 10, y + 10, z + 10, sprite_get_texture(spr_column, 0), 1, 1, true);
Для более сложных форм используется работа с вершинными буферами, которая позволяет определять произвольные 3D-модели:
// Создание вершинного буфера
var vbuff = vertex_create_buffer();
vertex_begin(vbuff, global.vertex_format);
// Добавление вершин (для примера – треугольник)
vertex_position_3d(vbuff, 0, 0, 0);
vertex_normal(vbuff, 0, 0, 1);
vertex_texcoord(vbuff, 0, 0);
vertex_color(vbuff, c_white, 1);
vertex_position_3d(vbuff, 20, 0, 0);
vertex_normal(vbuff, 0, 0, 1);
vertex_texcoord(vbuff, 1, 0);
vertex_color(vbuff, c_white, 1);
vertex_position_3d(vbuff, 0, 20, 0);
vertex_normal(vbuff, 0, 0, 1);
vertex_texcoord(vbuff, 0, 1);
vertex_color(vbuff, c_white, 1);
vertex_end(vbuff);
// Отрисовка буфера
vertex_submit(vbuff, pr_trianglelist, sprite_get_texture(spr_texture, 0));
Третий метод — импорт 3D-моделей из внешних редакторов. GameMaker поддерживает формат .obj, что позволяет создавать модели в Blender, 3ds Max или других программах и импортировать их в проект:
- Создайте модель в 3D-редакторе и экспортируйте в формате .obj
- Используйте скрипты для импорта .obj в GameMaker (доступны в маркетплейсе)
- Преобразуйте загруженную модель в вершинный буфер для отрисовки
Текстурирование 3D-объектов в GameMaker требует понимания UV-координат, которые определяют, как изображение накладывается на поверхность модели. Для базовых примитивов этот процесс автоматизирован, но для сложных моделей необходимо правильно настраивать UV-развертку:
- Для примитивов используйте параметры повторения текстуры
- Для импортированных моделей убедитесь, что UV-координаты корректно экспортированы
- При работе с вершинным буфером задавайте UV-координаты вручную через vertex_texcoord
Важный аспект текстурирования — оптимизация. Использование текстурных атласов существенно повышает производительность:
// Использование текстурного атласа
var atlas_texture = sprite_get_texture(spr_texture_atlas, 0);
var u1 = 0.25; // Начало текстуры по горизонтали (25% от ширины атласа)
var v1 = 0.0; // Начало текстуры по вертикали
var u2 = 0.5; // Конец текстуры по горизонтали (50% от ширины атласа)
var v2 = 0.25; // Конец текстуры по вертикали (25% от высоты атласа)
// При создании вершины задаем координаты из атласа
vertex_texcoord(vbuff, u1 + (u2 – u1) * texcoord_u, v1 + (v2 – v1) * texcoord_v);
Для реалистичного отображения 3D-объектов необходимо также настроить освещение. GameMaker предлагает базовый функционал для работы со светом:
// Установка источника направленного света
d3d_light_define_direction(0, 1, 1, -1, c_white);
d3d_light_enable(0, true);
// Установка точечного источника света
d3d_light_define_point(1, x, y, z, 100, c_yellow);
d3d_light_enable(1, true);
Для продвинутых визуальных эффектов используйте шейдеры. GameMaker поддерживает GLSL, позволяя создавать сложные эффекты, такие как normal mapping, specular highlighting и другие:
// Пример применения шейдера
shader_set(sh_normal_mapping);
texture_set_stage(shader_get_sampler_index(sh_normal_mapping, "s_normalMap"), sprite_get_texture(spr_normal_map, 0));
shader_set_uniform_f(shader_get_uniform(sh_normal_mapping, "lightPosition"), light_x, light_y, light_z);
vertex_submit(vbuff, pr_trianglelist, sprite_get_texture(spr_diffuse, 0));
shader_reset();
Анимация 3D-объектов представляет дополнительную сложность. Для простых анимаций можно использовать математические функции для трансформации вершин:
- Вращение объектов через матричные преобразования
- Волновые эффекты путем смещения вершин по синусоиде
- Морфинг между разными формами через интерполяцию позиций вершин
Для сложных анимаций, включающих скелетную анимацию, рекомендуется использовать готовые расширения из маркетплейса GameMaker или разрабатывать собственные решения на основе vertexformatadd_custom для хранения весов костей и других параметров. 🦴
Реализация физики и коллизий в 3D пространстве
Реализация физики и системы коллизий — один из самых сложных аспектов 3D-разработки в GameMaker, поскольку встроенная физическая система ориентирована преимущественно на 2D. Однако грамотное использование имеющихся инструментов и математических принципов позволяет создать надежную 3D-физику. 🎯
Начнем с базовых методов обнаружения коллизий в 3D-пространстве:
| Метод коллизии | Преимущества | Недостатки | Применение |
|---|---|---|---|
| Сферические коллайдеры | Простота реализации, высокая производительность | Низкая точность для несферических объектов | Быстро движущиеся объекты, снаряды, приблизительные коллизии |
| Коллайдеры типа AABB | Легкость вычислений, хорошее соотношение точности и скорости | Неточность при вращении объектов | Архитектурные элементы, контейнеры, статичные объекты |
| OBB коллайдеры | Учет вращения, лучшая точность | Сложные вычисления, выше нагрузка | Вращающиеся платформы, динамические объекты |
| Полигональные коллайдеры | Максимальная точность, соответствие форме объекта | Высокие требования к ресурсам, сложная реализация | Сложные ландшафты, объекты с особой геометрией |
Для реализации сферических коллизий в 3D используйте функцию pointdistance3d, которая вычисляет расстояние между двумя точками в пространстве:
// Проверка столкновения двух сфер
var distance = point_distance_3d(obj1.x, obj1.y, obj1.z, obj2.x, obj2.y, obj2.z);
var combined_radius = obj1.radius + obj2.radius;
if (distance < combined_radius) {
// Обработка столкновения
}
Для коллайдеров типа AABB (Axis-Aligned Bounding Box) используйте проверку пересечения пределов объектов по каждой оси:
// Проверка AABB коллизии
if (obj1.x – obj1.half_width <= obj2.x + obj2.half_width &&
obj1.x + obj1.half_width >= obj2.x – obj2.half_width &&
obj1.y – obj1.half_height <= obj2.y + obj2.half_height &&
obj1.y + obj1.half_height >= obj2.y – obj2.half_height &&
obj1.z – obj1.half_depth <= obj2.z + obj2.half_depth &&
obj1.z + obj1.half_depth >= obj2.z – obj2.half_depth) {
// Обработка столкновения
}
Реализация OBB (Oriented Bounding Box) требует более сложной математики, включая матричные преобразования и SAT (Separating Axis Theorem). Для полигональных коллизий необходимо реализовать алгоритмы, подобные GJK или SAT, что значительно усложняет разработку.
Симуляция физики движения требует понимания базовой физики и реализации соответствующих формул:
- Гравитация: добавление постоянного ускорения по оси Y или Z (в зависимости от ориентации вашей координатной системы)
- Трение: уменьшение скорости объекта при контакте с поверхностями
- Отскок: изменение направления движения при столкновении с учетом коэффициента упругости
- Сопротивление воздуха: уменьшение скорости пропорционально квадрату текущей скорости
// Базовая реализация гравитации и трения
// В событии Step объекта
// Применение гравитации
vspeed += gravity_force * delta_time / 1000000;
// Горизонтальное трение (замедление)
hspeed *= (1 – friction_coef * delta_time / 1000000);
// Обновление позиции
x += hspeed * delta_time / 1000000;
y += vspeed * delta_time / 1000000;
z += zspeed * delta_time / 1000000;
Для реалистичной реакции на столкновения необходимо рассчитать нормаль поверхности в точке контакта и использовать формулы упругого или неупругого удара:
// Расчет отскока от поверхности
var normal_x = collision_normal_x;
var normal_y = collision_normal_y;
var normal_z = collision_normal_z;
// Нормализация вектора нормали
var normal_length = sqrt(normal_x*normal_x + normal_y*normal_y + normal_z*normal_z);
normal_x /= normal_length;
normal_y /= normal_length;
normal_z /= normal_length;
// Расчет проекции скорости на нормаль
var dot_product = hspeed*normal_x + vspeed*normal_y + zspeed*normal_z;
// Отражение вектора скорости с учетом коэффициента упругости
var elasticity = 0.8; // От 0 до 1, где 1 – идеально упругий удар
hspeed = hspeed – (1 + elasticity) * dot_product * normal_x;
vspeed = vspeed – (1 + elasticity) * dot_product * normal_y;
zspeed = zspeed – (1 + elasticity) * dot_product * normal_z;
Для сложных физических систем рассмотрите использование дополнительных библиотек или расширений:
- Physics Systems 3D — расширение с реализацией базовых физических законов
- Custom 3D Collision Library — библиотека с продвинутыми алгоритмами определения столкновений
- Verlet Integration System — решение для симуляции мягких тел и тканей
Оптимизация физики критически важна для производительности вашей игры. Применяйте следующие методы:
- Пространственное разбиение (октодерево, grid-системы) для уменьшения количества проверок коллизий
- LOD (Level of Detail) для физики — упрощение коллайдеров для удаленных объектов
- Статическое кэширование данных для неподвижных объектов
- Активация/деактивация физики для объектов за пределами видимости
Не забывайте о дельта-тайминге для обеспечения стабильной работы физики независимо от частоты кадров:
// Использование delta_time для стабильной физики
var dt = delta_time / 1000000; // Перевод в секунды
x += hspeed * dt;
y += vspeed * dt;
z += zspeed * dt;
Правильно реализованная физика и система коллизий станут основой для создания увлекательного игрового процесса в вашем 3D-проекте. 🧪
Полировка и выпуск готовой 3D игры на GameMaker
После реализации основных механик, создания 3D-объектов и настройки физики наступает критически важный этап полировки игры перед выпуском. Именно на этом этапе определяется, будет ли ваш проект восприниматься как профессиональный продукт или любительская разработка. 💎
Начните с оптимизации производительности, поскольку 3D-игры на GameMaker могут столкнуться с проблемами в этой области:
- Профилирование: используйте встроенные инструменты для выявления узких мест в коде
- Оптимизация вершинных буферов: минимизируйте количество вызовов vertex_submit
- Применение LOD (Level of Detail): упрощайте модели с увеличением расстояния от камеры
- Оптимизация текстур: используйте текстурные атласы и сжатие текстур
- Фруструм каллинг: не отрисовывайте объекты вне поля зрения камеры
// Пример простого фруструм каллинга
if (!point_in_view(x, y, z, view_camera[0])) {
// Объект вне поля зрения, пропускаем отрисовку
exit;
}
// Отрисовка только видимых объектов
vertex_submit(model_buffer, pr_trianglelist, texture);
Важным аспектом полировки является улучшение визуальных эффектов:
- Постобработка с использованием шейдеров: bloom, ambient occlusion, depth of field
- Системы частиц для создания атмосферных эффектов (дым, огонь, пыль)
- Динамическое освещение и тени
- Эффекты окружения: туман, отражения, преломления
// Простая реализация тумана в шейдере
varying vec2 v_vTexcoord;
varying vec4 v_vColour;
varying float v_vDepth;
uniform vec3 u_fogColor;
uniform float u_fogStart;
uniform float u_fogEnd;
void main() {
vec4 base_color = texture2D(gm_BaseTexture, v_vTexcoord);
float fog_amount = clamp((v_vDepth – u_fogStart) / (u_fogEnd – u_fogStart), 0.0, 1.0);
gl_FragColor = mix(base_color, vec4(u_fogColor, base_color.a), fog_amount) * v_vColour;
}
Пользовательский интерфейс требует особого внимания в 3D-играх:
- Разработайте 2D-интерфейс, который корректно взаимодействует с 3D-миром
- Создайте систему меню с настройками графики, управления и звука
- Добавьте игровые подсказки и обучение для новых игроков
- Реализуйте диегетический интерфейс (встроенный в мир игры) для большего погружения
Тестирование приобретает решающее значение перед выпуском:
- Проведите тестирование на различных устройствах и конфигурациях
- Организуйте закрытое бета-тестирование для получения обратной связи
- Выполните стресс-тестирование для выявления проблем производительности
- Проверьте игру на наличие визуальных глитчей и ошибок геймплея
Для подготовки к релизу необходимо настроить компиляцию для целевых платформ:
| Платформа | Особенности оптимизации | Рекомендуемые настройки |
|---|---|---|
| Windows | Широкая аудитория, разнообразие конфигураций | Настраиваемые графические опции, поддержка различных разрешений |
| macOS | Проблемы с OpenGL/Metal, оптимизация памяти | Тщательное тестирование, снижение требований к VRAM |
| Linux | Фрагментация драйверов, совместимость | Консервативные настройки графики, дополнительное тестирование |
| Android | Ограниченная производительность, разнообразие устройств | Упрощенные модели, LOD, оптимизация для мобильного GPU |
| iOS | Строгие ограничения памяти, оптимизация энергопотребления | Агрессивная оптимизация ресурсов, уменьшение draw calls |
Маркетинг и продвижение 3D-игры на GameMaker может стать конкурентным преимуществом:
- Подчеркивайте уникальность вашего подхода к 3D в GameMaker
- Создайте впечатляющий трейлер, демонстрирующий лучшие аспекты игры
- Подготовьте пресс-кит с описанием технических достижений
- Участвуйте в игровых джемах и конференциях для демонстрации проекта
Финальные штрихи перед выпуском включают:
- Создание установщика с необходимыми драйверами и зависимостями
- Подготовка серверной инфраструктуры для многопользовательских игр
- Разработка системы обновлений для исправления ошибок после релиза
- Настройка аналитики для отслеживания поведения пользователей
Помните, что выпуск игры — это только начало пути. Планируйте постоянную поддержку, обновления и расширения контента для поддержания интереса игроков к вашему 3D-проекту на GameMaker. 🚀
Преодоление технических ограничений и создание трехмерных миров в GameMaker открывает неожиданные возможности для творческого самовыражения. Работа с 3D на этой платформе — это не только техническое достижение, но и глубокое понимание основ компьютерной графики, физики и оптимизации. Даже если ваш следующий проект будет разрабатываться на специализированном 3D-движке, опыт создания трехмерных игр в GameMaker предоставит вам бесценную перспективу и понимание того, что происходит "под капотом" современных игровых технологий. Не бойтесь экспериментировать и выходить за рамки общепринятых представлений о возможностях инструментов разработки — именно так рождаются инновации.
Читайте также
- GameMaker: как создать игру без опыта программирования
- Unreal Engine: создание 3D игр с нуля – полное руководство
- Как создать 2D игру в Godot Engine: полное руководство для новичков
- Godot Engine: пошаговая разработка 3D игр с нуля до релиза
- Amazon Lumberyard: пошаговое создание игры для начинающих разработчиков
- Construct: создание игр без кода – как начать разработку за час
- NeoAxis Engine: как начать создание 3D-игры с нуля за часы
- Создание 2D игр на Phaser: от простого проекта к публикации
- Топ-5 игровых движков для 3D-разработки: сравнение, возможности
- Defold для начинающих: создаем 2D игру без программирования