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

O Blender não exporta texturas emissivas com o arquivo glTF. Se o seu modelo usa uma, ela deve ser trazida separadamente.

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.

Exportando arquivos ESCN do Blender

O mais poderoso, chamado godot-blender-exporter. Ele usa um arquivo .escn, o qual é uma espécie de arquivo .tscn (arquivo Godot Scene); ele retém o máximo de informações possível sobre uma Blender Scene.

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.

Import options

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

The scale of the root node.

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.

Manter ao Reimportar

Uma vez que materiais são editados para usar as ferramentas da 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:

  • Adicionando detecção de colisão a objetos
  • Definindo objetos com malhas de navegação
  • Excluindo nós que não são usados no motor do jogo (como luzes específicas usadas para modelagem)

Para simplificar esse fluxo de trabalho, a Godot oferece alguns sufixos que podem ser adicionados aos nomes dos objetos em seu software de modelagem 3D. Quando importado, Godot irá detectá-los e executar ações automaticamente:

Remover os Nós (-noimp)

Nomes de nó que tenham esse sufixo serão removidos no horário de importação, não importa qual seja o seu tipo. Eles não aparecerão na cena importada.

Criar colisões (-col, -colionly, -convcolonly)

Opção “-col” funcionará apenas para os nós de malha. Se for detectado, um nó filho de colisão estática será adicionado, usando a mesma geometria que a malha.

No entanto, muitas vezes é o caso de que a geometria visual é muito complexa ou muito irregular para colisões, o que acaba não funcionando bem.

Para resolver isso, existe o modificador “-colonly”, que removerá a malha na importação e criará uma colisão de StaticBody ao invés. Isso ajuda a malha visual e a colisão atual a serem separadas.

A opção “-convcolonly” criará um class_convexpolygonshap em vez de um ConcavePolygonShape.

Opção “-colonly” também pode ser usada com os objetos vazios do Blender. Na importação, criará um StaticBody com um nó de colisão como filho. O nó de colisão terá uma das várias formas predefinidas, dependendo do tipo de desenho vazio do Blender:

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

Para uma melhor visibilidade no editor do Blender, o usuário pode definir a opção “X-Ray” em colisão vazias e definir alguma cor distinta para eles em User Preferences / Themes / 3D View / Empty.

Criar navegação (-navmesh)

Um nó de malha com este sufixo será convertido em uma malha de navegação. O nó original da Malha será removido.

Cria um Veículo (-vehicle)

Um nó de malha com este sufixo será importado como um filho de um nó VeículoBody.

Crie uma Roda de Veículo (-wheel)

Um nó de malha com este sufixo será importado como um filho de um nó VehicleWheel.

Rigid Body (-rigid)

Cria um corpo rígido a partir desta malha.

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

Clipes de animação no documento COLLADA que começam ou terminam com o token “loop” ou “cycle” serão importados como uma Animação Godot com a flag de loop marcada. Isso é case-sensitive e não requer um hífen.

No Blender, isso requer o uso do Editor NLA e nomear a Ação com o prefixo ou sufixo “loop” ou “cycle”.