Importando cenas 3D

Importador de cena Godot

Ao lidar com assets 3D, Godot tem um flexível e configurável importador.

Godot trabalha com cenas. Isso significa que a cena inteira sendo trabalhada no seu DCC 3D favorito será transferida o mais próximo possível.

Godot supports the following 3D scene file formats:

  • glTF 2.0. Godot tem suporte total para formatos de texto e binários.
  • DAE (COLLADA), um formato mais antigo que é totalmente suportado.
  • Formatos OBJ (Wavefront). Também é oferecido suporte completo, mas bastante limitado (sem suporte para pivots, esqueletos, etc).
  • ESCN, um formato específico do Godot que o Blender pode exportar com um plugin.
  • FBX, supported via the Open Asset Import library. However, FBX is proprietary, so we recommend using other formats listed above, if suitable for your workflow.

Simplesmente copie o arquivo todo da cena com a textura para o repositório do projeto, e o Godot fará uma importação completa.

É importante que a malha não esteja deformada pelos ossos quando for exportar. Tenha certeza que o esqueleto esteja setado em pose tipo T ou pose de descanso padrão antes de exportar usando seu editor 3D favorito.

Exportando arquivos DAE do Maya e 3DS Max

A Autodesk adicionou suporte nativo ao formato COLLADA no Maya e no 3DS Max, mas ele não funciona por padrão e não deveria ser utilizado. A menlhor maneira de exportar esse formado é usando os plugins OpenCollada. Eles funcionam bem, apesar de que nem sempre estão atualizados com a última versão do software.

Exporting glTF 2.0 files from Blender

Há três maneiras de exportar arquivos glTF do Blender. Como um binário glTF (arquivo .glb), glTF embedded (arquivo .gltf), e com texturas (gltf + .bin + texturas).

arquivos binários glTF são as menores das três opções. Eles incluem a malha e texturas configuradas no Blender. Quando trazidas para Godot, as texturas fazem parte do arquivo do material do objeto.

arquivos embedded glTF funcionam da mesma forma que arquivos binários. Eles não fornecem funcionalidade extra em Godot, e não devem ser usados, pois têm um tamanho de arquivo maior.

Existem duas razões para usar glTF com texturas separadas. Uma delas é ter a descrição da cena em um formato baseado em texto e os dados binários em um arquivo binário separado. Isso pode ser útil para o controle da versão se você quiser rever as alterações em um formato baseado em texto. A segunda é que você precisa dos arquivos de textura separados do arquivo do material. Se você não precisa de nenhum desses arquivos, tudo bem usar glTF binários.

Nota

Blender does not export emissive textures with the glTF file. If your model uses one, it must be brought in separately.

Exportando arquivos DAE no Blender

Blender has built-in COLLADA support, but it does not work properly for the needs of game engines and should not be used as is.

Godot provides a Blender plugin that will correctly export COLLADA scenes for use in Godot. It does not work in Blender 2.8 or newer, but there are plans to update it in the future.

Exportando arquivos ESCN do Blender

The most powerful one, called godot-blender-exporter. It uses a .escn file, which is kind of another name for a .tscn file (Godot scene file); it keeps as much information as possible from a Blender scene. However, it is considered experimental.

O exportador ESCN tem um detalhado document descrevendo seu uso e funcionalidade.

Importar fluxos de trabalho

O importador de cenas do Godot permite diferentes fluxos de trabalho a respeito de como os dados são importados. Dependendo de muitas opções, é possível importar a cena usando:

  • Materiais externos (padrão): Onde cada material é salvado em um arquivo. Modificações serão mantidas.
  • Malhas externas: Onde cada malha é salva em diferentes arquivos. Vários usuários preferem lidar com malhas diretamente.
  • Animações externas: Permitir que animações salvas sejam modificadas e mescladas quando fonte for alterada.
  • Cenas externas: Salve cada um dos nós raiz das cenas importadas em uma cena separada.
  • Cena única: Um único arquivo de cena com tudo configurado.
../../../_images/scene_import1.png

O processo de importação é altamente customizável, já que diferentes desenvolvedores possuem diferentes necessidades.

Opções de importação

O importador possui diversas opções, que serão discutidas logo abaixo:

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

Nós

Tipo da Raiz

Por padrão, o tipo do nó raiz nas cenas importadas é "Espacial", mas isso pode ser modificado.

Nome da Raiz

Permite setar um nome específico para o nó raiz gerado.

Root Scale

A escala do nó raiz.

Script Personalizado

Um script especial para processar a cena inteira após ser importada pode ser provido. Isso é ótimo para pós processamento, mudando materiais, fazendo coisas divertidas com geometrias, etc.

Crie um script dessa forma:

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

A função post_import recebe a cena importada como argumento (o parâmetro é o nó raiz da cena). A cena que será utilizada tem que ser retornada. Pode ser uma diferente.

Armazenamento

Por padrão, o Godot importa uma única cena. Essa opção permite especificar que cada um dos nós abaixo da raiz serão uma cena separada e a instancia na cena importada.

Claro, instanciar essas cenas importadas em outros lugares manualmente também funciona.

Materiais

Localização

Godot tem suporte a materiais em malha ou em nós. Por padrão, materiais serão colocados em cada um dos nós.

Armazenamento

Materiais podem ser armazenados na cena ou em um arquivo externo. Por padrão, eles são armazenados em arquivos externos para que seja possível editá-los. Isso acontece porquê a maioria dos DCCs 3D não possuem as mesmas opções de material que o Godot.

Quando os materiais são compilados, eles serão perdidos toda vez que a cena principal for modificada ou importada.

Nota

Godot will not reimport materials that are stored in external files unless you remove the associated .material file before reimporting.

To force reimporting materials every time the 3D scene is reimported, change the material storage mode in the 3D scene by selecting it in the FileSystem dock, going to the Import dock then setting Material > Storage to Built-In instead of Files.

Manter ao Reimportar

Uma vez que materiais são editados para usar as ferramentas do Godot, o importador vai manter os que foram editados e ignorar os que vieram da cena inicial. Essa opção está presente somente se os materiais são salvos como arquivos.

Malhas

Comprimir

Faz as malhas usarem números menos precisos para múltiplos aspectos da malha, a fim de economizar espaço.

Estes são:
  • Transform Matrix (Localização, rotação e escala) : 32-bit float para 16-bit signed integer.
  • Vértices : 32-bit float para 16-bit signed integer.
  • Normals : 32-bit float para 32-bit unsigned integer.
  • Tangentes : 32-bit float para 32-bit unsigned integer.
  • Cores dos Vértices : 32-bit float para 32-bit unsigned integer.
  • UV : 32-bit float para 32-bit unsigned integer.
  • UV2 : 32-bit float para 32-bit unsigned integer.
  • Pesos de Vertex : 32-bit float para 16-bit unsigned integer.
  • Ossos de Armature : 32-bit float para 16-bit unsigned integer.
  • Índice de Matriz : 32-bit ou 16-bit unsigned integer baseado em quantos elementos existem.
Informação adicional:
  • UV2 = O segundo canal UV para texturas detalhadas e texturas de mapa de luz baked.
  • Índice de Array = Uma matriz de números que numeram cada elemento das matrizes acima; Ou seja, eles numeram os vértices e normais.

Em alguns casos, isso pode levar à perda de precisão, por isso, desativar essa opção pode ser necessária. Por exemplo, se uma malha é muito grande ou há várias malhas sendo importadas que cobrem uma grande área, comprimindo a importação desta malha(s) pode levar a lacunas na geometria ou vértices não estarem exatamente onde deveriam estar.

Garanta tangentes

Se texturas com mapeamento de normal forem usadas, as malhas precisam ter matrizes tangentes. Essa opção garante que as tangentes sejam geradas se não estiverem presentes na cena de origem. Godot usa Mikktspace para isso, mas é sempre melhor ter gerado as tangentes no exportador.

Armazenamento

As malhas podem ser armazenadas em arquivos separados em vez de embutidos. Isso não tem muito uso prático a menos que se queira construir objetos diretamente com eles.

Esta opção é fornecida para ajudar aqueles que preferem trabalhar diretamente com malhas em vez de cenas.

Light Baking

Se a malha é ou não usada em mapas de luz baked.

  • Desativado: A malha não é usada em mapas de luz baked.
  • Habilitar: A malha é usada em baked lightmaps.
  • Gen Lightmaps: A malha é usada em mapas de luz pré-calculados, e desembrulha uma segunda camada UV para mapas de luz.

Nota

For more information on light baking see Baked lightmaps.

Arquivos Externos

As malhas e materiais gerados podem ser armazenados opcionalmente em um subdiretório com o nome da cena.

Animation options

Godot fornece muitas opções sobre como os dados de animação são tratados. Alguns exportadores (como Blender) podem gerar muitas animações em um único arquivo. Outros, como 3DS Max ou Maya, precisam de muitas animações colocadas na mesma linha do tempo ou, na pior das hipóteses, colocar cada animação em um arquivo separado.

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

A importação de animações é habilitada por padrão.

FPS

A maioria dos formatos de exportação 3D armazenam a linha do tempo de animação em segundos em vez de quadros. Para garantir que as animações sejam importadas da forma mais fiel possível, especifique os quadros por segundo usados para editá-los. Não fazer isso pode resultar em animações instáveis.

Script de filtro

É possível especificar um script de filtro em uma sintaxe especial para decidir quais faixas de quais animações devem ser mantidas.

O script de filtro é executado contra cada animação importada. A sintaxe consiste em dois tipos de declarações, a primeira para escolher quais animações filtrar e a segunda para filtrar faixas individuais dentro da animação combinada. Todos os padrões de nome são realizados usando uma partida de expressão insensível, usando ? e * curingas (usando String.matchn() de baixo do capô).

O script deve começar com uma declaração de filtro de animação (como denotado pela linha começando com um @). Por exemplo, se quisermos aplicar filtros a todas as animações importadas que tenham um nome terminando em ''_Loop'':

@+*_Loop

Da mesma forma, padrões adicionais podem ser adicionados à mesma linha, separados por vírgulas. Aqui está um exemplo modificado para adicionalmente incluir todas as animações com nomes que começam com ''Arm_Left'', mas também excluir todas as animações que têm nomes terminando em ''Attack'':

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

Seguindo a declaração do filtro de seleção de animação, adicionamos padrões de filtragem de faixa para indicar quais faixas de animação devem ser mantidas ou descartadas. Se nenhum filtro de faixa for especificado, todas as faixas dentro das animações encontradas serão descartadas!

É importante notar que as declarações do filtro de faixa são aplicadas para cada faixa dentro da animação, isso significa que uma linha pode incluir uma faixa, uma regra posterior ainda pode descartá-la. Da mesma forma, uma faixa excluída por uma regra inicial pode então ser reincluída mais uma vez por uma regra de filtro mais para baixo no script do filtro.

Por exemplo: inclua todas as faixas nas animações com nomes que terminam em ''_Loop'', mas descarte qualquer faixa que afete um ''Skeleton'' que termina em ''Control'', a menos que tenha ''Arm'' no nome:

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

No exemplo acima, faixas como ''Skeleton:Leg_Control'' seriam descartadas, enquanto faixas como ''Skeleton:Head'' ou ''Skeleton:Arm_Left_Control'' seriam retidas.

Todas as linhas de filtro de faixa que não começam com um + ou - são ignoradas.

Armazenamento

Por padrão, as animações são salvas embutidas. É possível salvá-los em um arquivo em vez disso. Isso permite adicionar faixas personalizadas às animações e mantê-las após uma reimportação.

Otimizador

Quando as animações são importadas, um otimizador é executado, o que reduz consideravelmente o tamanho da animação. Em geral, isso deve ser sempre ativado a menos que você suspeite que uma animação pode ser quebrada.

Clipes

It is possible to specify multiple animations from a single timeline as clips. For this to work, the model must have only one animation that is named default. To create clips, change the clip amount to something greater than zero. You can then name a clip, specify which frames it starts and stops on, and choose whether the animation loops or not.

Scene inheritance

Em muitos casos, pode ser desejado fazer modificações na cena importada. Por padrão, isso não é possível porque se o asset de origem mudar (arquivo fonte .dae, .gltf, .obj re-exportado do aplicativo de modelagem 3D), Godot reimportará toda a cena.

É possível, no entanto, fazer modificações locais usando Herança de Cena. Tente abrir a cena importada e o seguinte caixa de diálogo aparecerá:

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

Em cenas herdadas, as únicas limitações para modificações são:

  • Nós não podem ser removidos (mas podem ser adicionados em qualquer lugar).
  • Sub-Recursos não podem ser editados (salve-os externamente como descrito acima para isso)

Fora isso, tudo é permitido!

Import hints

Muitas vezes, ao editar uma cena, há tarefas comuns que precisam ser feitas após a exportação:

  • Adding collision detection to objects.
  • Setting objects as navigation meshes.
  • Deleting nodes that are not used in the game engine (like specific lights used for modelling).

To simplify this workflow, Godot offers several suffixes that can be added to the names of the objects in your 3D modelling software. When imported, Godot will detect suffixes in object names and will perform actions automatically.

Nota

All the suffixes described below are case-sensitive.

Remover os Nós (-noimp)

Objects that have the -noimp suffix will be removed at import-time no matter what their type is. They will not appear in the imported scene.

Create collisions (-col, -convcol, -colonly, -convcolonly)

The option -col will work only for Mesh objects. If it is detected, a child static collision node will be added, using the same geometry as the mesh. This will create a triangle mesh collision shape, which is a slow, but accurate option for collision detection. This option is usually what you want for level geometry (but see also -colonly below).

The option -convcol will create a ConvexPolygonShape instead of a ConcavePolygonShape. Unlike triangle meshes which can be concave, a convex shape can only accurately represent a shape that doesn't have any concave angles (a pyramid is convex, but a hollow box is concave). Due to this, convex collision shapes are generally not suited for level geometry. When representing simple enough meshes, convex collision shapes can result in better performance compared to a triangle collision shape. This option is ideal for simple or dynamic objects that require mostly-accurate collision detection.

However, in both cases, the visual geometry may be too complex or not smooth enough for collisions. This can create physics glitches and slow down the engine unneccesarily.

To solve this, the -colonly modifier exists. It will remove the mesh upon importing and will create a StaticBody collision instead. This helps the visual mesh and actual collision to be separated.

The option -convcolonly works in a similar way, but will create a ConvexPolygonShape instead.

The option -colonly can also be used with Blender's empty objects. On import, it will create a StaticBody with a collision node as a child. The collision node will have one of a number of predefined shapes, depending on Blender's empty draw type:

../../../_images/3dimp_BlenderEmptyDrawTypes.png

When possible, try to use a few primitive collision shapes instead of triangle mesh or convex shapes. Primitive shapes often have the best performance and reliability.

Nota

For better visibility in Blender's editor, you can set the "X-Ray" option on collision empties and set some distinct color for them in Blender's User Preferences > Themes > 3D View > Empty.

Ver também

See Collision shapes (3D) for a comprehensive overview of collision shapes.

Criar navegação (-navmesh)

A mesh node with the -navmesh suffix will be converted to a navigation mesh. The original Mesh object will be removed at import-time.

Cria um Veículo (-vehicle)

A mesh node with the -vehicle suffix will be imported as a child to a VehicleBody node.

Crie uma Roda de Veículo (-wheel)

A mesh node with the -wheel suffix will be imported as a child to a VehicleWheel node.

Rigid Body (-rigid)

A mesh node with the -rigid suffix will be imported as a RigidBody.

Loop de animação (-loop, -cycle)

Animation clips in the COLLADA document that start or end with the token loop or cycle will be imported as a Godot Animation with the loop flag set. Unlike the other suffixes described above, this does not require a hyphen.

In Blender, this requires using the NLA Editor and naming the Action with the loop or cycle prefix or suffix.