Обзор игрового движка Panda3D и его особенностей

Обзор игрового движка Panda3D и его особенностей

Я занимаюсь разработкой с использованием движка Panda3D почти 4 года. Уже достаточно хорошо разбираюсь в его особенностях. Этот движок малоизвестный и не достаточно популярный, поэтому хотелось бы поделиться информацией о нем.

Движок Panda3D разработан компанией Дисней и в последствии передан университету CMU и сообществу.

Лицензия была изменена на достаточно свободную - BSD, которая позволяет использовать движок и даже модифицировать его в том числе и в коммерческих целях без каких либо обязанностей выплачивать роялти.

На данный момент его разработкой занимается сообщество, а университет оказывает небольшую поддержку в виде предоставления хостинга для сборки и публикации новых версий.

Также разработка финансируется из пожертвований собранных через вебсайт Open Collective.

Исходный код движка полностью открыт, что позволяет глубже его изучить и при необходимости вносить изменения.

Возможности движка

Движок написан на языке C++ и небольшая его часть - на Python. Panda3D спроектирован таким образом чтобы разработка проектов с его использованием велась на языке Python в большей степени, а также на языке C++, если это необходимо.

Графическое API

  • OpenGL (кроссплатформенный, основной вариант и наиболее поддерживаемый)
  • Direct3D
  • OpenGL ES
  • Software Rendering
  • Vulkan (на очень ранней стадии разработки)

Поддержка шейдеров

  • NVIDIA CG
  • Генератор шейдеров для NVIDIA CG (в комплекте поставляются простейшие шейдеры)
  • GLSL (можно подключить GLSL шейдеры из проекта RenderPipeline)
  • Генератор шейдеров для GLSL (на начальной стадии разработки)

Звук

  • Поддержка 3D звука
  • Звуковые библиотеки: OpenAL, FMOD

Физические движки

  • Bullet (основной вариант)
  • ODE
  • Собственный движок PandaPhysics (используется для системы частиц)
  • PhysX

Сеть

  • HTTP
  • TCP
  • UDP (reliable UDP не поддерживается)

Графический интерфейс

  • DirectGUI (собственная система UI, частично написана на Python, основной вариант, не достаточно гибкая, не очень удобная)
  • libRocket (не поддерживался долгое время, удален в этом году)
  • cefpython (сторонняя библиотека на основе движка браузера Chromium)
  • LUI (сторонняя библиотека, в комплекте тема оформления по умолчанию, не развивается)

Поддержка операционных систем

  • Windows версии 7 и выше (поддержка XP была прекращена в этом году)
  • Linux
  • Mac OSX (плохая поддержка шейдеров и графических API)
  • Android (в разработке, в экспериментальном состоянии)
  • WebGL (замена устаревшему плагину для браузера - Panda3D Runtime, на начальной стадии разработки)

Прочие возможности

  • Система чистиц (инстумент для настройки частиц не развивается)
  • Рассчет коллизий (используя физический движок)
  • Поддержка системы конечных автоматов (FSM)
  • Поддержка клавиатуры, мыши (включая raw input), геймпадов
  • Инструменты профайлинга (как локальные, так и работающие по сети)
  • Скелетная анимация (есть интерполяция и блендинг, но отсутствует поддержка IK)
  • Встроенные средства процедурной анимации (перемещение, изменение масштаба, цвета)
  • Иструменты упаковывания ассетов (используется собственный формат multify и виртуальная файловая система)
  • Поддержка большого количества форматов графических ассетов
  • ИИ (библиотека PandAI)
  • Occlusion Culling (в том числе используя порталы)
  • Hardware Instancing
  • Поддержка LOD

Отличия от популярных движков

Крупные и достаточно известные игровые движки, такие как Unreal Engine 4, Unity3D и подобные развились до уровня конструкторов игр, в которых за пару кликов мышкой можно собрать готовую игру из доступных модулей. Такие движки содержат в себе редактор, который является обязательным инструментом и определяет весь workflow разработки. К примеру Unity3D полностью берет на себя задачу обработки C # скриптов.

У Panda3D подход к разработке несколько другой, многие ошибочно пытаются найти некоторый редактор игр сразу после установки движка. Так как игровые движки выросли до уровня констукторов игр, то для таких движков как Panda3D и ему подобных используют термин - framework.

Panda3D не содержит в себе ни конструктора игр, ни редактора игровых уровней. И так как он является некоммерческим, то стандартные ассеты высокого качества и магазин с ними тоже отсутствуют.

Движок не предлагает собственный workflow, а вместо этого встраивается в текущий. То есть все модули движка подключаются к стандартному C++ или Python приложению как отдельные библиотеки. Таким образом можно встраивать движок в том числе и в уже существующее приложение, а также использовать только те модули движка, которые необходимы в данный момент. Например в приложении рассчета физики можно полностью выключить рендеринг и использовать его таким образом на серверах.

Движок достаточно простой в изучении. Кривая сложности - линейная, то есть вы постепенно прогрессируете равными шагами. В отличие от Unreal Engine 4 и Unity3D, где кривая сложности - экспонента, когда очень просто начать и сделать прототип, но гораздо сложнее завершить начатое и решать более сложные задачи.

Структура движка

Внутренняя структура Panda3D представляет собой граф в виде дерева, где каждый элемент это контейнер ноды (NodePath). Каждый такой контейнер может содержать в себе одну ноду любого типа (на основе PandaNode) или ни одной (пустой контейнер). Нодами же могут быть меши с геометрией, коллайдеры, звуки, источники света, скелеты, кости, элементы интерфейса и другие объекты. Каждая нода упаковывается в свой собственный контейнер и из таких контейнеров строится дерево.

Для каждого контейнера ноды доступны такие параметры как положение его в пространтве, масштаб, материалы, текстуры, включение/выключение рендеринга и прочие. Контейнеры нод можно свободно перемещать между собой внутри дерева. Все параметры контейнера ноды будут наследовать и дочерние контейнеры, таким образом можно применить текстуру сразу ко всей ветке дерева или вообще выключить ее рендеринг.

Если необходимо изменить параметры которые относятся непосредственно к определенному типу ноды (например громкость звука или сила источника света), то нужно обращаться к ноде, которая находится внутри соответствующего контейнера. Данные параметры не наследуются.

Рендеринг графики

Стандартный рендеринг

Движок перешел в статус некоммерческой разработки очень давно, когда большинство современных графических технологий и возможностей отсутствовало. Вся разработка сейчас находится в руках сообщества, поэтому в нем остутствуют современные высококачественные шейдеры, системы рассчета теней и отражений.

В стандартном комплекте движка есть генератор шейдеров, который создает шейдеры в формате NVIDIA CG (версия генератора для GLSL еще в разработке). Он предоставляет следующие возможности:

  • Простейшие модели шейдинга для Diffuse (Lambert) и Specular (Blinn-Phong)
  • Тени для Direct Light и Spot Light (очень сильно снижают производительность)
  • Cel-Shading (Toon-Shading)
  • HDR
  • Blur
  • Bloom
  • Ambient Occlusion
  • Outline
  • Normal Mapping и Parallax Bump Mapping

Материалы используют модель specular - glossiness (shininess) и текстурные карты, такие как normal map, diffuse, specular, glow, gloss, height, decal и прочие.

Но всего этого уже недостаточно чтобы выйти на современный уровень графики. Приложения использующие стандартные возможности Panda3D будут выглядеть как игры начала 00-х годов. Это обусловлено отсутствием современных шейдеров, PBR материалов и пост-процессинга.

RenderPipeline

RenderPipeline это сторонний проект, целью которого является пересмотреть стандартный способ рендеринга в Panda3D - Forward Rendering и вместо него предложить альтернативный - Deferred Rendering.

RenderPipeline представляет из себя библиотеку расширяющую возможности рендеринга в Panda3D и набор инструментов для настройки и визуализации процесса рендерига.

В отличие от specular - glossiness модели материалов и текстур в режиме RGB, используемых по умолчанию, RP использует roughness - metallic PBR и текстуры в режиме sRGB. Также он использует собственную систему освещения (RPLight) написанную на языке C++, которая теперь входит в комплект Panda3D, что упрощает установку и использование RenderPipeline.

RenderPipeline использует Deferred Rendering и модульную систему для рендеринга отдельных слоев/буферов (Stage), где каждый Stage использует свои шейдеры, а в конечном итоге они все объединяются в один кадр.

Также RP поддерживает систему плагинов, позволяющую расширять его возможности и добавлять новые плагины со своими шейдерами. В стандартный комплект входят следующие плагины:

  • Ambient Occlusion (SSAO, HBAO, SSVO, ALCHEMY)
  • Atmospheric Scattering
  • Bloom
  • Color Correction (пост процессинг включающий в себя Tonemapping, различные фильтры для камеры, автоматическую экспозицию, Color LUT, Sharpen)
  • Depth of Field
  • FXAA и SMAA
  • Motion Blur
  • Separable Screen Space Subsurface Scattering (SSSSS или Skin Shading)
  • Sky Occlusion
  • Тени от солнца, Spot Light и Point Light
  • Voxel Global Illumination (в экспериментальном состоянии)
  • Volumetric Clouds & Lighting (в экспериментальном состоянии)
  • Screen Space Reflections (в экспериментальном состоянии)

Также RP включает в себя поддержку Normal Mapping, Parallax Bump Mapping, динамической смены времени суток (дня и ночи).

Инструменты визуализации позволяют в реальном времени отслеживать весь процесс рендеринга каждого Stage, и того как из них строится кадр.

Из минусов можно отметить, то что RP уже долгое время не развивается и многие шейдеры не достаточно оптимизированы. Но проект достаточно компактный, гибкий и хорошо документирован, что позволяет интегрировать мего в свой проект и поддерживать собственными силами.

Поддержка форматов графических ассетов

Panda3D поддерживает множество форматов текстур и моделей, а также инструментов для импорта/экспорта и конвертирования между форматами.

Для текстур поддерживаются форматы: PNG, JPEG, DXT, TGA и другие.

Для моделей используются следующие форматы:

  • EGG (собственный текстовый формат)
  • BAM (собственный бинарный формат)
  • X (с ограничениями)
  • glTF (в активной разработке)

Также существуют множество плагинов экспорта моделей для таких программ как:

  • Blender (основной и наиболее поддерживаемый, есть экспорт в формат glTF)
  • 3Ds Max
  • Maya

YABEE

Blender плагин для экспорта моделей в формат EGG.

Основная версия, поддерживает Blender до версии 2.79, не развивается. Использует параметры материалов и текстуры из Blender Render.

Обновленная версия адаптированная под Blender 2.80+ и новые Cycles материалы.

Panda3D BAM Exporter

Blender плагин для экспорта моделей в формат BAM. Использует материалы совместимые с RenderPipeline.

blend2bam

Утилита конвертирования моделей из формата Blender в BAM.
Поддерживает несколько пайплайнов для конвертирования:

  • Blender - glTF - BAM
  • Blender - EGG - BAM

panda3d-gltf

Плагин для Panda3D который добавляет поддержку формата glTF в движок. Позволяет напрямую загружать файлы в формате glTF.

Минимальный пример

Минимальный пример который создает окно, загружает модель со скелетной анимацией и воспроизводит анимацию.

import sys from direct.showbase.ShowBase import ShowBase from direct.actor.Actor import Actor class Demo(ShowBase): def __init__(self): ShowBase.__init__(self) self.set_background_color(0.0, 0.5, 0.75, 1) # цвет фона окна self.accept('escape', sys.exit) # биндим клавишу на завершение приложения self._panda = Actor('models/panda-model.egg', { 'walk': 'models/panda-walk4.egg', }) # загружаем модель панды с анимацией self._panda.set_h(60) # поворачиваем модель self._panda.set_scale(0.005) # масштабируем модель self._panda.reparent_to(self.render) # подключаем модель к рендеру (сцене) self._panda.loop('walk') # воспроизводим зацикленную анимацию self.cam.set_pos(0, -20, 2) # двигаем камеру demo = Demo() demo.run()
Обзор игрового движка Panda3D и его особенностей

Игры использующие Panda3D

Toontown Online - старая MMORPG от Дисней, закрылась
Pirates of the Caribbean Online - старая MMORPG от Дисней, закрылась
Ghost Pirates of Vooju Island - adventure, доступна в Steam
A Vampyre Story - adventure, доступна в Steam

Подборка инди игр на itch.io

8181
28 комментариев

Мало картинок(

30
Ответить

Судя по списку сделанных игр, кривая сложности представлена не линейной, а сигма-функцией.

22
Ответить

Красноречиво.

9
Ответить

Комментарий недоступен

12
Ответить

Слишком много текста и слишком мало картинок, неплохобы привести примеры рендера, кода и тд а так не возникло желния качать движок даже что бы попробовать.

5
Ответить

Добавила минимальный пример и скриншотов.

3
Ответить

Разработчики пока не хотят пилить собранный в единое целое gui для работы с движком, а жаль. Панда могла бы конкурировать с годотом

5
Ответить