Трёхмерная графика и Panda3D
Panda3D — открытый игровой движок с Python-API, который изначально разрабатывался Disney для онлайн-проектов вроде Toontown Online. Он даёт полноценный 3D-рендеринг (OpenGL/DirectX), загрузку моделей, освещение, камеру и игровой цикл — при этом основная логика пишется на Python.
Эта глава — мост между 2D-играми на Pygame и "настоящим" 3D — как устроена трёхмерная графика в экосистеме Python, из чего состоит Panda3D, где он уместен, и как собрать первые сцены из кода.
База Python — первая программа, точка входа __main__, venv и зависимости.
Игровой цикл и события — Pygame.
Графики функций и диаграммы — Matplotlib.
Общая теория игр — раздел "Разработка игр".
Трёхмерная графика в Python
В Python нет встроенного 3D-рендерера: графика всегда идёт через сторонние библиотеки, которые оборачивают нативный код (C/C++) и OpenGL/Vulkan/DirectX.
| Подход | Примеры | Уровень | Типичное применение |
|---|---|---|---|
| Полноценный движок | Panda3D, Ursina | Высокий | 3D-игры, визуализации, симуляции |
| Тонкая обёртка над OpenGL | PyOpenGL, ModernGL | Низкий | Учебные шейдеры, свой рендер |
| 2D с "псевдо-3D" | Pygame, Arcade | Средний (2D) | Спрайты, тайловые карты |
| Скриптинг в DCC | Blender Python API | Зависит от задачи | Контент, анимация, пайплайн |
| Внешний движок + Python | Godot (GDExtension), Unity (редко) | Высокий | Продакшен-игры |
Трёхмерная сцена в любом движке опирается на одни и те же идеи:
- Вершины — точки в пространстве (координаты
x, y, z). - Примитивы — треугольники, из которых собираются меши.
- Текстуры и материалы — цвет и картинки на поверхности.
- Освещение — ambient, directional, point, spot.
- Камера — точка обзора и проекция (перспектива или ортографика).
- Цикл кадров — обновление логики и отрисовка ~60 раз в секунду.
Python здесь управляет сценой и логикой; тяжёлая математика и вызовы GPU выполняет нативное ядро движка.
Готовая галерея скриптов с карточками, кубом, пирамидой и составными сценами — Примеры фигур Panda3D на Python. Для 2D-фигур в браузере (JavaScript, без Python) — Примеры фигур на Processing/p5.js. Для 2D-игр на том же Python — Pygame — мини-игры и глава Разработка игр на Python.
Panda3D — что это
Panda3D — это движок с несколькими Python-пакетами и C++-ядром (libpanda, libpandaexpress и др.). Он включает:
- рендер-пайплайн и шейдеры;
- загрузчик моделей (egg, bam, glTF через плагины, OBJ и др.);
- систему сценового графа (иерархия узлов);
- физику (Bullet, ODE — опционально);
- аудио (OpenAL);
- ввод, окно, таймеры, задачи (
taskMgr).
Движок кроссплатформенный (Windows, Linux, macOS) и распространяется под лицензией BSD. Для учебных 3D-проектов на чистом Python это один из самых зрелых вариантов.
Архитектура
Panda3D строится вокруг сценового графа — дерева узлов (NodePath). Каждый узел может нести геометрию, свет, камеру или пустой "контейнер" для группировки и трансформаций.
ShowBase (приложение)
├── render ← корень 3D-сцены
│ ├── card ← CardMaker / GeomNode
│ ├── cube
│ └── sun_np ← DirectionalLight
├── camera ← камера по умолчанию
├── loader ← текстуры, модели
└── taskMgr ← задачи каждый кадр
ShowBase
Класс ShowBase из direct.showbase.ShowBase — каркас приложения. При создании он:
- открывает окно и контекст рендеринга;
- создаёт
render,camera,loader,taskMgr,win,clock; - запускает главный цикл через
run().
Наследование от ShowBase — типичный паттерн: в __init__ настраиваете сцену, в run() уходит управление движку.
NodePath и трансформации
NodePath — "ручка" к узлу с удобными методами setPos, setHpr (heading-pitch-roll), setScale, lookAt. Дочерние узлы наследуют трансформации родителя — так вращают группы объектов или крепят модель к "руке" персонажа.
Задачи (game loop)
taskMgr.add(callback, "name") регистрирует функцию, вызываемую каждый кадр. Колбэк получает task и возвращает task.cont (продолжить) или task.done. Время между кадрами — globalClock.getDt() — удобно для анимации, не зависящей от FPS.
Рендер и освещение
Объекты вешают на self.render. Свет — отдельные узлы (AmbientLight, DirectionalLight, …), которые подключают через render.setLight(np). Без света объекты с нормалями могут выглядеть чёрными; карточки с текстурой часто переводят в setLightOff().
Состав пакета — основные модули
| Модуль / пакет | Назначение |
|---|---|
panda3d.core | Ядро: геометрия, математика (Vec3, Point3), текстуры, окно, рендер-состояния |
panda3d.bullet | Физика Bullet (опционально) |
panda3d.ode | Физика ODE (legacy) |
direct.showbase.ShowBase | Базовый класс приложения |
direct.task | Задачи и таймеры |
direct.actor.Actor | Скелетная анимация персонажей |
direct.gui | 2D-виджеты поверх 3D (DirectButton, OnscreenText) |
direct.filter | Постобработка (bloom, SSAO — через конфиг) |
Установка с PyPI ставит бинарные колёса с уже собранным C++-ядром — отдельно компилировать Panda3D для учебных примеров обычно не нужно.
Ограничения и сложности
| Тема | Суть |
|---|---|
| Производительность | Горячие пути — на C++; Python годится для логики, AI, UI. Тысячи draw call или тяжёлый CPU-код на Python — узкое место. |
| GIL | Параллельные потоки Python не ускоряют вычисления на CPU; многопоточность в Panda3D чаще для I/O или C++-стороны. |
| Кривая обучения | Нужны базовые 3D-понятия (оси, euler, UV, нормали). API объёмное; документация местами устарела. |
| Экосистема | Меньше ассет-магазинов и туториалов, чем у Unity/Godot. Контент часто готовят в Blender и экспортируют. |
| Редактор | Нет единого "Panda3D Editor" уровня Unity; сцены собирают кодом или через panda3d-gltf / egg-файлы. |
| Размер дистрибутива | Колесо ~100+ MB — для встраиваемых скриптов это много. |
Уместен для учебных 3D-проектов на Python, визуализаций, прототипов и инструментов, где важен код, а не визуальный редактор.
Для коммерческого AAA или мобильного хита чаще смотрят на Unity, Unreal или Godot; для 2D — Pygame проще.
Для Unity + C# с редактором — курс в редакторе и готовые скрипты в Lab.
Установка и первый запуск
Рекомендуется виртуальное окружение — см. Зависимости Python.
python -m venv panda_env
# Windows
panda_env\Scripts\activate
# Linux / macOS
source panda_env/bin/activate
pip install panda3d
Проверка:
import panda3d
print(panda3d.__version__)
Минимальное приложение — окно с цветным фоном и вращающейся карточкой:
Код ITЗагрузка примера кода…
Разбор фрагмента:
ShowBase.__init__поднимает окно и подсистемы.disableMouse()отключает стандартное управление камерой мышью — в учебном примере камера фиксирована.CardMakerсоздаёт плоский прямоугольник в плоскости XY;setP(-20)наклоняет карточку.spinкрутит объект по оси H (heading) с угловой скоростью 60°/с, умноженной наgetDt().
Текстура на карточке
Загрузка PNG через loader.loadTexture. Путь лучше давать относительно проекта — Panda3D ожидает Unix-пути внутри models/ или корня:
Код ITЗагрузка примера кода…
Структура каталога:
my_panda_app/
├── main_texture.py
└── images/
└── sample.png
setTransparency(TransparencyAttrib.MAlpha) нужен для PNG с альфа-каналом. setLightOff() — текстура рисуется "как есть", без затенения по нормалям.
Куб из вершин и нормалей
Готового "куба одной строкой" в ядре нет — меш собирают через Geom API — вершины, нормали, цвет, индексы треугольников.
Код ITЗагрузка примера кода…
Формат getV3n3c4() — vertex + normal + color на каждую вершину; directional light использует нормали для расчёта яркости граней. В продакшене кубы обычно загружают из .gltf / .bam, а не пишут руками.
Загрузка моделей и ввод
Типичный следующий шаг после примитивов:
model = self.loader.loadModel("models/box.bam")
model.reparentTo(self.render)
model.setScale(0.5)
model.setPos(0, 5, 0)
Обработка клавиш через accept:
self.accept("escape", sys.exit)
self.accept("w", self.move_forward)
Для персонажей с анимацией — direct.actor.Actor и файлы .egg/.bam с joint-анимацией.
Сравнение с Pygame и другими 3D-вариантами
| Pygame | Panda3D | Ursina | |
|---|---|---|---|
| Размерность | 2D | 3D | 3D (над Panda3D) |
| Порог входа | Низкий | Средний | Низкий |
| Контроль | Полный (SDL) | Полный движок | Меньше деталей |
| Документация | Хорошая | Объёмная, местами старая | Компактная |
Pygame остаётся лучшим стартом для игрового цикла и 2D; готовые скрипты с разбором — мини-игры в Lab. Переход на Panda3D логичен, когда нужны перспектива, освещение и модели в 3D.
Что попробовать дальше
- Добавить управление камерой (
enableMouse()или WASD). - Загрузить модель из Blender (glTF → через конвертер или
panda3d-gltf). - Подключить физику
panda3d.bulletдля падения объектов. - Наложить 2D-HUD через
direct.gui.OnscreenText. - Сравнить с мини-играми Pygame и Практикумом игр — те же идеи цикла и состояния, другой рендер.
- Чёрный экран — нет света или камера смотрит мимо объекта.
- Текстура не грузится — путь не относительный или файл вне рабочей директории.
- Анимация "дёргается" — забыли умножить скорость на
globalClock.getDt(). - Окно "зависло" — долгий код в задаче без возврата
task.cont.
Полезные ссылки
- Примеры фигур Panda3D на Python — галерея готовых скриптов от карточки до составных сцен
- Pygame — мини-игры на Python — 2D — змейка, Pong, Breakout с разбором кода
- Unity C# — скрипты для новичков — 3D в редакторе — WASD, прыжок, монетки, UI
- Tkinter — окна и виджеты — десктоп-формы и кнопки без 3D-движка
- Официальный мануал Panda3D
- Примеры в репозитории panda3d
- Blender — подготовка 3D-моделей для экспорта
В подборках
Статья входит в тематические подборки и блок "С чего начать?" на главной. Соседние шаги того же маршрута:
Разработка видеоигр — Разработка игр на Python, Pygame — мини-игры на Python, Minecraft — команды и datapack, Unity C# — скрипты для новичков, Практикум разработки игр — о разделе, Разработка игр — о разделе, Языки программирования игр, Разработка игр с использованием C++.