Импорт 3D сцен

Импортёр сцены Godot

При работе с 3D-активами Godot имеет гибкий и настраиваемый импортёр.

Godot работает со сценами. Это означает, что вся сцена, над которой вы работаете в вашем любимом 3D DCC, будет перенесена как можно ближе.

Godot поддерживает следующие 3D форматы файлов сцен:

  • glTF 2.0 (рекомендовано). Godot полностью поддерживает текстовый (.gltf) и двоичный (.glb) форматы.

  • DAE (COLLADA), более старый формат, который полностью поддерживается.

  • Формат OBJ (Wavefront) + их файлы материалов MTL. Также полностью поддерживается, но довольно ограничен (без поддержки точек привязки, скелетов, анимаций, PBR материалов,...).

  • ESCN, специфический формат Godot, который Blender может экспортировать с помощью плагина.

  • FBX поддерживается через Open Asset Import library. Однако FBX является проприетарным, поэтому мы рекомендуем использовать другие форматы, перечисленные выше, если они подходят для вашего рабочего процесса.

Просто скопируйте файл сцены вместе с текстурой в репозиторий проекта, и Godot выполнит полный импорт.

Важно, чтобы при экспорте сетка не деформировалась костями. Перед экспортом с помощью вашего любимого 3D-редактора убедитесь, что скелет сброшен в Т-образную позу или позу покоя по умолчанию.

Экспорт файлов DAE из Maya и 3DS Max

Autodesk добавил встроенную поддержку COLLADA в Maya и 3DS Max, но по умолчанию она не работает и не должна использоваться. Лучший способ экспортировать этот формат - использовать плагины OpenCollada. Они работают хорошо, хотя и не всегда обновлены до последней версии программного обеспечения.

Экспорт файлов glTF 2.0 из Blender

Есть три способа экспортировать файлы glTF из Blender. В виде двоичного файла glTF (файл .glb), встроенного glTF (файл .gltf) и с текстурами (gltf + .bin + текстуры).

Двоичные файлы glTF являются наименьшими из трех вариантов. Они включают сетку и текстуры, созданные в Blender. При переносе в Godot текстуры являются частью файла материала объекта.

Встроенные файлы glTF работают так же, как двоичные файлы. Они не предоставляют дополнительных функций в Godot и не должны использоваться, поскольку имеют больший размер файла.

Есть две причины использовать glTF с отдельными текстурами. Один из них - иметь описание сцены в текстовом формате и двоичные данные в отдельном двоичном файле. Это может быть полезно для контроля версий, если вы хотите просмотреть изменения в текстовом формате. Во-вторых, вам нужны файлы текстуры отдельно от файла материала. Если вам не нужен ни один из этих двоичных файлов glTF, всё в порядке.

Примечание

Blender не экспортирует излучающие (emissive) текстуры с файлом glTF. Если в вашей модели они есть, их нужно добавить отдельно.

Экспорт файлов DAE из Blender

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

Godot предоставляет `плагин Blender <https://github.com/godotengine/collada-exporter> `_, который будет правильно экспортировать сцены COLLADA для использования в Godot. Он не работает в Blender 2.8 или новее, но есть планы обновить его в будущем.

Экспорт файлов ESCN из Blender

Самый мощный из них называется godot-blender-exporter. Он использует файл .escn, который является своего рода другим именем для файла .tscn (файл сцены Godot); он хранит как можно больше информации из сцены Blender. Однако это считается экспериментальным.

У экспортера ESCN есть подробный документ, описывающий его функции и использование.

Экспортирование текстур раздельно

Хотя текстуры можно экспортировать вместе с моделью в определенных форматах файлов, таких как glTF 2.0, вы также можете экспортировать их отдельно. Godot использует PBR (физически основанный рендеринг) для своих материалов, поэтому если программа текстурирования может экспортировать PBR текстуры, они могут работать в Godot. К ним относятся Substance suite, ArmorPaint (open source), и Material Maker (open source).

Примечание

Для получения дополнительной информации о материалах Godot, посмотрите Spatial Material.

Размышления о экспорте

Поскольку графические процессоры могут отображать только треугольники, сетки, содержащие квадраты или N-угольники, должны быть триангулированы, прежде чем их можно будет визуализировать. Godot может триангулировать сетки при импорте, но результаты могут быть непредсказуемыми или неверными, особенно с N-угольниками. Независимо от целевого приложения, триангуляция перед экспортом сцены приведет к более согласованным результатам и должна выполняться по возможности.

Чтобы избежать проблем с неправильной триангуляцией после импорта в Godot, рекомендуется выполнять триангуляцию объектов в 3D-пакете самостоятельно. В Blender это можно сделать, добавив к вашим объектам модификатор Триангулировать и убедившись, что Применить Модификаторы ** отмечен в диалоговом окне экспорта. В качестве альтернативы, в зависимости от экспортера, вы можете найти и включить параметр **Триангулировать грани в диалоговом окне экспорта.

Чтобы избежать проблем с 3D-выбором в редакторе, рекомендуется применить преобразование объекта в 3D-пакете перед экспортом сцены.

Рабочие процессы импорта

Импортёр сцены Godot позволяет использовать различные рабочие процессы, касающиеся импорта данных. В зависимости от множества параметров, можно импортировать сцену с:

  • Внешние материалы (по умолчанию): Каждый материал сохраняется в ресурс файла. Модификации к ним сохраняются.

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

  • Внешняя анимация: позволяет изменять и объединять сохраненные анимации при изменении источников.

  • Внешние сцены: сохраните каждый из корневых узлов импортированных сцен как отдельную сцену.

  • Одиночная сцена: один файл сцены со всем содержимым.

../../../_images/scene_import1.png

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

Опции импорта

У импортера есть несколько вариантов, речь о которых пойдет ниже:

../../../_images/scene_import2.png

Узлы (ноды)

Root Type (тип корня)

По умолчанию, тип корневого узла в импортированных сценах - "Spatial", но его можно изменить.

Root Name (имя корня)

Позволяет задать определенное имя для сгенерированного корневого узла.

Основной, "коренной" масштаб

Масштаб корневого узла.

Custom Script (пользовательский скрипт)

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

Создайте скрипт похожий на:

tool # Needed so it runs in the editor.
extends EditorScenePostImport


func post_import(scene):
    # Do your stuff here.
    return scene # remember to return the imported scene

Функция post_import принимает импортированную сцену в качестве аргумента (параметр фактически является корневым узлом сцены). Сцена, которая в конечном итоге будет использована, должна быть возвращена. Она может быть другой.

Хранение

По умолчанию, Godot импортирует одну сцену. Этот параметр позволяет указать, что каждый узел ниже корня будет отдельной сценой и будет вставлен в импортированную.

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

Материалы

Расположение

Godot поддерживает материалы в сетках или узлах. По умолчанию материалы будут помещены на каждый узел.

Хранение

Материалы могут храниться внутри сцены или во внешних файлах. По умолчанию они хранятся во внешних файлах, поэтому их можно редактировать. Это связано с тем, что большинство 3D DCC не имеют таких же материалов, как в Godot.

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

Примечание

Godot не будет повторно импортировать материалы, которые хранятся во внешних файлах, если вы не удалите связанный файл с расширением .material перед повторным импортом.

Чтобы принудительно повторно импортировать материалы каждый раз при повторном импорте 3D-сцены, измените режим хранения материалов в 3D-сцене, выбрав его в доке FileSystem, перейдя в док-станцию Import и установив Material > Storage на Built-In вместо Files.

Keep On Reimport

После того, как материалы отредактированы для использования функций Godot, импортер сохранит отредактированные и проигнорирует те, которые поступают из исходной сцены. Эта опция присутствует, только если материалы сохранены в виде файлов.

Меши

Сжатие

Заставляет сетки использовать менее точные числа для нескольких аспектов сетки в целях экономии места.

К ним относятся:
  • Матричная трансформация (расположение, вращение и масштабирование): 32-битное float в 16-битное знаковое целое.

  • Вершины: 32-битное с плавающей запятой в 16-битное знаковое целое.

  • Нормали: 32-битное с плавающей запятой в 16-битное знаковое целое.

  • Касательные: 32-битное с плавающей запятой в 32-битное без знаковое целое.

  • Цвета вершин: 32-битное с плавающей запятой в 32-битное без знаковое целое.

  • UV: 32-битное с плавающей запятой в 32-битное без знаковое целое.

  • UV2: 32-битное с плавающей запятой в 32-битное без знаковое целое.

  • Веса вершин: 32-битное с плавающей запятой в 16-битное без знаковое целое.

  • Кости арматуры: 32-битное число с плавающей запятой в 16-битное целое число без знака.

  • Индекс массива: 32-битное или 16-битное без знаковое целое в зависимости от количества элементов.

Дополнительная информация:
  • UV2 = Второй UV-канал для детальных текстур и запеченных текстур карт освещения.

  • Индекс массива = Массив чисел, пронумеровывающих каждый элемент массивов выше; т.е. нумеруют вершины и нормали.

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

Ensure Tangents

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

Хранение

Меши могут храниться в отдельных файлах (ресурсах) вместо встроенных. Это не имеет большого практического применения, если только кто-то не хочет строить объекты напрямую с ними.

Эта опция предназначена для тех, кто предпочитает работать непосредственно с мешами вместо сцен.

Light Baking (запекание источников освещения)

Используется ли сетка в запеченных световых картах или нет.

  • Disabled (отключено): Сетка не используется в запеченных картах освещения.

  • Enable (включено): Сетка используется в запеченных картах освещения.

  • **Gen Lightmaps (генерация карт совещения): ** Сетка используется в запеченных световых картах и разворачивает второй UV-слой для карт освещения.

Примечание

Для получения дополнительной информации об "запекании света" прочтите Baked lightmaps.

External Files (внешние файлы)

Сгенерированные сетки и материалы, при желании, можно сохранить в подкаталоге с именем сцены.

Параметры анимации

Godot предоставляет множество вариантов обработки данных анимации. Некоторые программы экспорта (например, Blender) могут создавать множество анимаций в одном файле. Другим, таким как 3DS Max или Maya, нужно разместить много анимаций на одной временной шкале или, в худшем случае, поместить каждую анимацию в отдельный файл.

../../../_images/scene_import3.png

Импорт анимации включен по умолчанию.

Внимание

Чтобы изменить анимацию из импортированной 3D-сцены, вам необходимо изменить параметр хранения анимации с Встроенный на Файлы в доке «Импорт». В противном случае изменения, внесенные в анимацию из Godot, будут потеряны при запуске проекта.

FPS

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

Filter Script (скрипт фильтра)

Можно указать скрипт фильтра в специальном синтаксисе, чтобы решить, какие дорожки и из каких анимаций следует сохранить.

Сценарий фильтра выполняется для каждой импортированной анимации. Синтаксис состоит из двух типов операторов: первый для выбора анимации для фильтрации, а второй для фильтрации отдельных треков в согласованной анимации. Все шаблоны имен выполняются с использованием совпадения выражений без учета регистра, с использованием подстановочных знаков ? и * (с использованием String.matchn() под капотом).

Скрипт должен начинаться с оператора фильтра анимации (обозначенного строкой, начинающейся с символа @). Например, если мы хотим применить фильтры ко всем импортированным анимациям, имена которых заканчиваются на "_Loop":

@+*_Loop

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

@+*_Loop, +Arm_Left*, -*Attack

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

Важно отметить, что операторы фильтра дорожек применяются по порядку для каждой дорожки в анимации; это означает, что одна строка может включать дорожку, а более позднее правило может ее отбросить. Точно так же трек, исключенный более ранним правилом, может быть затем снова включен правилом фильтрации ниже в сценарии фильтрации.

Например: включить в анимацию все дорожки с именами, заканчивающимися на "_Loop", но отбросить все дорожки, затрагивающие "Skeleton" и заканчивающиеся на "Control", если только они не имеют в их имени "Arm":

@+*_Loop
+*
-Skeleton:*Control
+*Arm*

В приведенном выше примере такие треки, как "Skeleton:Leg_Control" будут отброшены, а треки, такие как "Skeleton:Head" или "Skeleton:Arm_Left_Control" будут сохранены.

Любые строки фильтра трека, которые не начинаются со знака + или -, игнорируются.

Хранение

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

Оптимизатор

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

Клипы

Можно указать несколько анимаций из одной временной шкалы как клипы. Для того, чтобы это работало, модель должна иметь только одну анимацию с именем default. Чтобы создать клипы, измените размер клипа на значение больше нуля. Затем вы можете дать клипу имя, указать, на каких кадрах он начинается и на каких заканчивается, и выбрать, будет ли анимация повторяться или нет.

Наследование сцен

Во многих случаях может потребоваться внести изменения в импортированную сцену. По умолчанию это невозможно, потому что при изменении исходного ресурса (исходный файл .dae, .gltf, .obj, повторно экспортированный из приложения для 3D-моделирования), Godot повторно импортирует всю сцену.

Однако возможно внести локальные изменения, используя Scene Inheritance (наследование сцены). Попробуйте открыть импортированную сцену, и появится следующий диалог:

../../../_images/scene_import4.png

В унаследованных сценах единственными ограничениями для модификаций являются:

  • Узлы нельзя удалить (но можно добавить куда угодно).

  • Внутренние ресурсы не могут быть изменены (сохраните их извне как описано выше)

Кроме этого, разрешено все!

Подсказки по импорту

Часто при редактировании сцены есть общие задачи, которые необходимо выполнить после экспорта:

  • Добавление обнаружения столкновений объектов.

  • Настройка объектов в качестве навигационной сетки.

  • Удаление узлов, которые не используются в игровом движке (например, специфические источники света, используемые для моделирования).

Чтобы упростить этот рабочий процесс, Godot предлагает несколько суффиксов, которые можно добавлять к именам объектов в вашем программном обеспечении для 3D-моделирования. При импорте Godot обнаружит суффиксы в именах объектов и выполнит действия автоматически.

Примечание

Все описанные ниже суффиксы чувствительны к регистру.

Удаление узлов (-noimp)

Объекты с суффиксом`` -noimp`` будут удалены во время импорта независимо от их типа. Они не появятся в импортированной сцене.

Создание столкновений (-col, -convcol, -colonly, -convcolonly)

Параметр -col будет работать только для объектов Mesh. Если это обнаружено, будет добавлен дочерний статический узел столкновения, использующий ту же геометрию, что и сетка. Это создаст форму столкновения треугольной сетки, которая является медленным, но точным вариантом для обнаружения столкновений. Этот параметр обычно подходит для геометрии уровня (но см. также -colonly ниже).

Параметр -convcol создаст ConvexPolygonShape вместо ConcavePolygonShape. В отличие от треугольных сеток, которые могут быть вогнутыми, выпуклая форма может точно представлять только ту форму, которая не имеет вогнутых углов (пирамида является выпуклой, а полый прямоугольник вогнутым). Из-за этого выпуклые формы столкновения обычно не подходят для геометрии уровня. При представлении достаточно простых сеток выпуклые формы столкновения могут обеспечить лучшую производительность по сравнению с треугольной формой столкновения. Этот вариант идеально подходит для простых или динамических объектов, для которых требуется наиболее точное обнаружение столкновений.

Однако в обоих случаях визуальная геометрия может быть слишком сложной или недостаточно гладкой для столкновений. Это может привести к сбоям в физике и без надобности замедлить работу движка.

Чтобы решить эту проблему, существует модификатор -colonly. Он удалит сетку при импорте и вместо этого создаст столкновение StaticBody. Это помогает разделить визуальную сетку и фактическое столкновение.

Параметр -convcolonly работает аналогичным образом, но вместо этого создаст ConvexPolygonShape.

Опцию -colonly также можно использовать с пустыми объектами Blender. При импорте он создаст StaticBody с узлом столкновения в качестве дочернего. Узел столкновения будет иметь одну из нескольких предопределенных форм, в зависимости от типа отрисовки пустого Blender:

../../../_images/3dimp_BlenderEmptyDrawTypes.png
  • Одиночная стрелка создаст RayShape.

  • Куб создаст форму BoxShape.

  • Изображение создаст PlaneShape.

  • Сфера (и другие, не указанные в списке) создадут SphereShape.

По возможности, попробуйте использовать несколько примитивных форм столкновения вместо треугольной сетки (triangle mesh) или выпуклых фигур (convex shapes). Примитивные формы часто имеют лучшую производительность и надёжность.

Примечание

Для лучшей видимости в редакторе Blender вы можете установить опцию "X-Ray" для пустых полей столкновений и установить для них определенный цвет в Blender User Preferences > Themes > 3D View > Empty.

См.также

См. Collision shapes (3D) для исчерпывающего обзора форм столкновения.

Создание навигации (-navmesh) (создание навигации)

Узел сетки с суффиксом -navmesh будет преобразован в сетку навигации. Исходный объект Mesh будет удален во время импорта.

Создать VehicleBody (-vehicle) (тело-транспортное средство)

Узел сетки с суффиксом -vehicle будет импортирован как дочерний для узла VehicleBody.

Создать VehicleWheel (-wheel) (колесо транспортного средства)

Узел сетки с суффиксом -wheel будет импортирован как дочерний узел VehicleWheel.

Твердое тело (-rigid)

Узел сетки с суффиксом -rigid будет импортирован как RigidBody.

Цикл анимации (-loop, -cycle)

Анимационные клипы в документе COLLADA, которые начинаются или заканчиваются маркером loop или cycle, будут импортированы как Godot Animation с установленным флагом цикла. В отличие от других суффиксов, описанных выше, для этого не требуется дефис.

В Blender для этого требуется использование NLA редактора и именование Действия (Action) с суффиксом или префиксом loop или cycle.