Importando escenas 3D

Importador de escenas de Godot

Cuando se trata de recursos 3D, Godot tiene un importador flexible y configurable.

Godot trabaja con escenas. Esto significa que toda la escena en la que se está trabajando en su DCC 3D favorito se transferirá lo más fielmente posible.

Godot soporta los siguientes formatos de archivo de escena 3D:

  • glTF 2.0 (recomendado). Godot tiene soporte completo para formatos de texto (.gltf) y binarios (.glb).

  • DAE (COLLADA), un formato viejo que está completamente soportado.

  • Formato OBJ (Wavefront) + sus archivos de material MTL. Esto también es totalmente compatible, pero bastante limitado (sin soporte para pivotes, esqueletos, animaciones, materiales PBR, ...).

  • ESCN, un formato específico de Godot que puede ser exportado por Blender con un plugin.

  • FBX es compatible a través de la biblioteca Open Asset Import. Sin embargo, FBX es propietario, por lo que recomendamos utilizar otros formatos enumerados anteriormente, si son idóneos para su flujo de trabajo.

Simplemente copia el archivo de escena junto con la textura al repositorio del proyecto, y Godot hará una importación completa.

Es importante que la malla no se deforme por los huesos al exportarla. Asegúrate que el esqueleto se restablezca a su posición T o posición de reposo predeterminada antes de exportarlo con tu editor 3D favorito.

Exportación de archivos DAE desde Maya y 3DS Max

Autodesk agregó soporte integrado para COLLADA a Maya y 3DS Max, pero está roto por defecto y no debería ser usado. La mejor manera de exportar este formato es usando los plugins OpenCollada. Funcionan bien, aunque no siempre están actualizados con las últimas versiones del software.

Exportación de archivos glTF 2.0 desde Blender

Existen tres modo de exportar archivos glTF desde blender. Como un glTF binario (archivo .glb), glTF embebido (archivo .gltf), y con texturas (gltf + .bin + texturas).

Archivos binarios glTF es la opción más pequeña de las tres. Incluyen las mallas y texturas asignadas en Blender. Cuando los llevas a Godot, las texturas son parte del archivo de material del objeto.

Archivos glTF embebidos funcionan igual que archivos binarios. No proveen funcionalidad extra en Godot y no deben ser usados ya que son archivos de gran tamaño.

Existen dos razones para usar glTF con texturas por separado. Una es tener la descripción de la escena en formato texto y el binario en un archivo separado, esto puede ser útil para control de versiones si quieres revisar cambios en un formato de texto. El segundo es que necesitas las texturas separadas del archivo de material. Si no necesitas nada de eso, los archivos glTF binarios están bien.

Advertencia

Las animaciones de blend shape no se pueden importar, requieren animación manual dentro de Godot.

Nota

Las versiones anteriores a 3.2 de Blender no exportan texturas emissive con el archivo glTF. Si tu modelo utiliza una y estás utilizando una versión anterior de Blender, deberás importarla por separado.

Por defecto, Blender tiene la opción de culling (ocultación de caras posteriores) desactivada en los materiales y exportará los materiales para que coincidan con cómo se renderizan en Blender. Esto significa que los materiales en Godot tendrán su modo de culling establecido en Disabled. Esto puede disminuir el rendimiento ya que las caras posteriores se renderizarán incluso cuando estén siendo ocultadas por otras caras. Para resolver esto, habilita Backface Culling (ocultación de caras posteriores) en la pestaña de Materiales de Blender y luego exporta la escena nuevamente a glTF.

Exportación de archivos DAE desde Blender

Blender también tiene integrado soporte para COLLADA, pero no funciona correctamente para las necesidades de motores de juegos y no debe ser usado.

Godot proporciona un plugin para Blender que exportará correctamente las escenas COLLADA para ser usados en Godot. De momento no funciona con la version de blender 2.8 y posteriores, pero hay planes de actualizarlo en un futuro.

Exportar archivos ESCN desde Blender

El más poderoso, llamado godot-blender-exporter. Utiliza archivos .escn que es otro tipo de archivo .tscn (archivo de escena Godot) con otro nombre, este guarda la mayor cantidad de información posible de una escena de Blender. De todas formas, se considera experimental.

El exportador ESCN tiene un documento detallado ` <escn_exporter/index.html>`__ que describe su funcionalidad y uso.

Exportando texturas por separado

Si bien las texturas se pueden exportar con un modelo en ciertos formatos de archivo, como glTF 2.0, también puede exportarlas por separado. Godot usa PBR (physically based rendering) para sus materiales, por lo que si un programa de texturizado puede exportar texturas PBR, pueden funcionar en Godot. Esto incluye Substance suite <https://www.substance3d.com/> __, ArmorPaint (código abierto) <https://armorpaint.org/> __, y `Material Maker (código abierto) <https : //github.com/RodZill4/material-maker> `__.

Nota

Para obtener más información sobre los materiales de Godot, consulte Material Spatial.

Consideraciones de exportación

Dado que las GPU solo pueden renderizar triángulos, las mallas que contienen quads o N-gons deben * triangularse * antes de poder renderizarse. Godot puede triangular mallas al importar, pero los resultados pueden ser impredecibles o incorrectos, especialmente con N-gons. Independientemente de la aplicación de destino, triangular * antes * de exportar la escena conducirá a resultados más consistentes y debe hacerse siempre que sea posible.

Para evitar problemas con la triangulación incorrecta después de importar en Godot, se recomienda hacer los objetos triangulares 3D DCC por sí solo. En Blender, esto se puede hacer agregando un modificador triangular a sus objetos y asegurándose de que ** Aplicar modificadores ** esté marcado en el cuadro de diálogo de exportación. Alternativamente, dependiendo del exportador, es posible que pueda encontrar y habilitar una opción ** Triangular caras ** en el cuadro de diálogo de exportación.

Para evitar problemas con la selección 3D en el editor, se recomienda aplicar la transformación de objeto en el DCC 3D antes de exportar la escena.

Flujos de trabajo de importación

El importador de escenas Godot permite diferentes flujos de trabajo con respecto a cómo se importan los datos. Dependiendo de muchas opciones, es posible importar una escena con:

  • Materiales externos (por defecto): Donde cada material se guarda en un archivo de recursos. Se mantienen las modificaciones.

  • Mallas externas: Donde cada malla se guarda en un archivo diferente. Muchos usuarios prefieren trabajar con mallas directamente.

  • Animaciones externas: Permitir que las animaciones guardadas se modifiquen y combinen cuando cambien las fuentes.

  • Escenas externas: Guarda los nodos raíz de las escenas importadas, cada uno como una escena separada.

  • Una sola escena: Un único archivo de escena con todo integrado.

../../_images/scene_import1.png

Como los distintos desarrolladores tienen necesidades diferentes, este proceso de importación es altamente personalizable.

Opciones de Importación

El importador tiene varias opciones, que se analizarán más adelante:

../../_images/scene_import2.png

Nodos

Tipos de Raíz

Por defecto, el tipo de nodo raíz en las escenas importadas es "Spatial", pero puede modificarse.

Nombre de la Raíz

Permite establecer un nombre específico para el nodo raíz generado.

Escala de la raíz

La escala del nodo raíz.

Script Personalizado

Se puede proporcionar un script especial para procesar toda la escena después de la importación. Esto es ideal para post-procesamiento, cambio de materiales, hacer cosas divertidas con la geometría, etc.

Crea un script como este:

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

La función post_import toma la escena importada como argumento (el parámetro es en realidad el nodo raíz de la escena). La escena que será utilizada debe ser devuelta. Puede ser una diferente.

Almacenamiento

Por defecto, Godot importa una sola escena. Esta opción permite especificar que los nodos debajo de la raíz serán cada uno una escena separada e instanciada en la importada.

Por supuesto, instanciar estas escenas importadas en otros lugares manualmente también funciona.

Materiales

Localización

Godot soporta materiales en mallas o nodos. Por defecto, los materiales se colocarán en cada nodo.

Almacenamiento

Los materiales pueden almacenarse dentro de la escena o en archivos externos. Por defecto, se almacenan en archivos externos, por lo que es posible editarlos. Esto se debe a que la mayoría de los DCC 3D no tienen las mismas opciones de materiales que las presentes en Godot.

Cuando los materiales están integrados, se perderán cada vez que se modifique y se vuelva a importar la escena de origen.

Nota

Godot no reimportará materiales almacenados en archivos externos a menos que elimine el archivo .material asociado antes de reimportarlo.

Para forzar la reimportación de materiales cada vez que se reimporta la escena 3D, cambie el modo de almacenamiento de material en la escena 3D seleccionándolo en el dock del Sistema de Archivos, yendo al dock de Importación y estableciendo Material > Almacenamiento en Interno en lugar de Archivos.

Continuar con la Reimportación

Una vez que los materiales son editados para usar las características de Godot, el importador mantendrá los editados e ignorará los que vienen de la escena fuente. Esta opción sólo está presente si los materiales se guardan como archivos.

Modelos

Compresión

Hace que las mallas usen números menos precisos para múltiples aspectos de la malla con el fin de ahorrar espacio.

Estos son:
  • Matriz de Transformación (Ubicación, rotación y escala): flotante de 32 bits a entero con signo de 16 bits.

  • Vértices: Flotante de 32 bits a un entero con signo de 16 bits.

  • Normal: Flotante de 32 bits a un entero sin signo de 32 bits.

  • Tangentes: Flotante de 32 bits a un entero sin signo de 32 bits.

  • Colores de vértices: Flotante de 32 bits a un entero sin signo de 32 bits.

  • UV: Flotante de 32 bits a un entero sin signo de 32 bits.

  • UV2: Flotante de 32 bits a un entero sin signo de 32 bits.

  • Pesos de los vértices: Flotante de 32 bits a un entero sin signo de 16 bits.

  • Huesos del armazón: Flotante de 32 bits a un entero sin signo de 16 bits.

  • Índice del array: entero sin signo de 32 o 16 bits en función de cuántos elementos contiene.

Información adicional:
  • UV2 = El segundo canal UV para texturas de detalle y texturas lightmap preparadas.

  • Índice de array = Un array de números que numeran cada elemento de los arrays anteriores; es decir, numeran los vértices y normales.

En algunos casos, esto podría provocar una pérdida de precisión, por lo que puede ser conveniente desactivar esta opción. Por ejemplo, si una malla es muy grande o se están importando múltiples mallas que cubren una gran área, la compresión de la importación de esta(s) malla(s) puede llevar a que los espacios en la geometría o los vértices no estén exactamente donde deberían estar.

Asegurar Tangentes

Si se van a utilizar texturas con normal mapping, las mallas deben tener arrays de tangentes (tangent arrays). Esta opción garantiza que se generen si no están presentes en la escena de origen. Godot usa :ref:`Mikktspace <http://www.mikktspace.com/>`__ para esto, pero siempre es mejor tenerlos generados en el exportador.

Almacenamiento

Las mallas se pueden almacenar en archivos separados (recursos) en lugar de integrados. Esto no tiene una gran utilidad a menos que uno quiera construir objetos con ellas directamente.

Esta opción se ofrece para ayudar a aquellos que prefieren trabajar directamente con mallas en lugar de escenas.

Bakeo de iluminación

Indica si la malla será o no usada en bakeo de lightmaps.

  • Deshabilitado: La malla no será usada en lightmaps bakeados.

  • Activado: La malla será usada en bakeo de lightmaps.

  • Gen Lightmaps: La malla será usada en lightmaps bakeados, y desenvolverá una segunda capa UV para lightmaps.

Nota

Para más información sobre bakeo de iluminación, ver Horneo de mapas de luces.

Archivos Externos

Las mallas y los materiales generados se pueden almacenar opcionalmente en un subdirectorio con el nombre de la escena.

Opciones de animación

Godot proporciona muchas opciones con respecto a cómo se tratan los datos de animación. Algunos exportadores (como Blender), pueden generar muchas animaciones en un solo archivo. Otros, como 3DS Max o Maya, necesitan muchas animaciones en la misma línea de tiempo o, en el peor de los casos, poner cada animación en un archivo separado.

../../_images/scene_import3.png

La importación de animaciones está activada de forma predeterminada.

Atención

Para modificar animaciones de una escena 3D importada, debe cambiar la opción de almacenamiento de animación de ** Integrado ** a ** Archivos ** en la barra de Importación. De lo contrario, los cambios realizados en las animaciones de Godot se perderán cuando se ejecute el proyecto.

FPS

La mayoría de los formatos de exportación 3D almacenan la línea de tiempo de la animación en segundos en lugar de fotogramas. Para garantizar que las animaciones se importan lo más fielmente posible, especifica los fotogramas por segundo utilizados para editarlas. Si no se hace esto, el resultado puede ser una animación temblorosa.

Filtro de Script

Es posible especificar un filtro de script en una sintaxis especial para decidir qué pistas de qué animaciones se deben mantener.

El filtro de script es ejecutado en cada animación importada. La sintaxis consta de dos tipos de sentencias, la primera es para seleccionar qué animación filtrar, la segunda para filtrar pistas individuales en la animación seleccionada. Todos los patrones de nombre son realizados usando una expresión de coincidencias sensible a mayúsculas, usando comodines ? y * (utiliza String.matchn() por detrás).

El script deberá comenzar con una sentecia de filtro de animación (como denota la línea comenzada con una @). Por ejemplo, si vamos a aplicar filtros a todas las animaciones importadas que tengan un nombre terminado en "Loop":

@+*_Loop

Similarmente, se pueden agregar patrones adicionales a la misma línea, separados por comas. Aquí está un ejemplo modificado para incluir todas las animaciones cuyos nombres comiencen con "Arm_Left", y también excluir todas las animaciones que terminen con "Attack":

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

Siguiendo a la sentencia de filtro de selección de animación, podemos agregar patrones de filtro de pistas para indicar qué pistas de animación deben mantenerse o descartarse. Si no hay patrón de filtro de animación especificado, entonces todas las pistas dentro de la animación que coinciden con el filtro serán descartadas!

Es importante notar que las sentencias de filtro de pista son aplicadas en orden para cada pista de la animación, esto significa que una línea puede incluir una pista, y una regla posterior descartarla. De manera similar, una pista excluida tempranamente puede ser re-incluída nuevamente por una regla de filtro más adelante en el script.

Por ejemplo: incluye todas las pistas en animaciones con nombres terminados en "_Loop", pero descarta cualquier track que afecta un "Skeleton" que terminan en "Control", a menos que tengan "Arm" en su nombre:

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

En el ejemplo anterior, pistas como "Skeleton:Leg_Control" serán descartadas, mientras que pistas como "Skeleton:Head" o "Skeleton:Arm_Left_Control" serán retenidas.

Cualquier filtro de pista que no comience con un + o - son ignorados.

Almacenamiento

Por defecto, las animaciones se guardan como integradas. En su lugar, es posible guardarlas en un archivo. Esto permite añadir pistas personalizadas a las animaciones y mantenerlas después de una reimportación.

Optimizador

Cuando se importan animaciones, se ejecuta un optimizador que reduce considerablemente el tamaño de la animación. En general, esto siempre debe estar activado, a menos que sospeches que una animación puede estar rota debido a este proceso.

Clips

Es posible especificar animaciones múltiples desde una única línea de tiempo como clips. Para que esto funcione, el modelo debe contener una única animación llamada default. Para crear clips, cambia la cantidad de clips a algo más grande que cero. Entonces puedes nombrar un clip, especificar en qué frames comienza y termina y elegir si la animación es cíclica o no.

Herencia de escenas

En muchos casos, es posible que prefieras hacer modificaciones en la escena importada. Por defecto, esto no es posible porque si el recurso de origen cambia (archivo``.dae``, .gltf, .obj re-exportado desde la aplicación de modelado 3D), Godot reimportará toda la escena.

Sin embargo, es posible hacer modificaciones locales utilizando la Herencia de Escenas. Intenta abrir la escena importada y aparecerá el siguiente cuadro de diálogo:

../../_images/scene_import4.png

En las escenas heredadas, las únicas limitaciones para las modificaciones son:

  • Los nodos no pueden ser eliminados (pero pueden ser agregados en cualquier parte).

  • Los Sub-Recursos no pueden ser editados (guárdalos externamente como se describe arriba para este caso)

Aparte de eso, ¡todo está permitido!

Consejos para la Importación

Muchas veces, al editar una escena, hay tareas comunes que deben realizarse después de la exportación:

  • Añadiendo detección de colisiones a los objetos.

  • Configurar objetos como mallas de navegación.

  • Eliminar los nodos que no se utilizan en el motor del juego (como las luces específicas utilizadas para el modelado).

Para simplificar este flujo de trabajo, Godot ofrece varios sufijos que pueden añadirse a los nombres de los objetos de su software de modelado 3D. Al ser importado, Godot detectará los sufijos en los nombres de los objetos y realizará las acciones automáticamente.

Nota

Todos los sufijos descritos a continuación son sensibles a las mayúsculas.

Eliminar nodos (-noimp)

Los objetos que tienen el sufijo -noimp se eliminarán en el momento de la importación sin importar cuál sea su tipo. No aparecerán en la escena importada.

Crear colisiones (-col, -convcol, -colonly, -convcolonly)

La opción -col funcionará sólo para los objetos de Malla. Si se detecta, se agregará un nodo de colisión estática hijo, usando la misma geometría de la malla. Esto creará una forma de colisión de malla triangular, que es una opción lenta, pero precisa para la detección de colisiones. Esta opción es normalmente la que quieres para la geometría del nivel (pero mira también -colonly más abajo).

La opción``-convcol`` creará una "ref:class_convexpolygonshape en lugar de una ConcavePolygonShape. A diferencia de las mallas de triángulos que pueden ser cóncavas, una forma convexa sólo puede representar con precisión una forma que no tiene ángulos cóncavos (una pirámide es convexa, pero una caja hueca es cóncava). Debido a esto, las formas de colisión convexas generalmente no son adecuadas para la geometría de nivel. Cuando se representan mallas suficientemente simples, las formas de colisión convexas pueden dar lugar a un mejor rendimiento en comparación con una forma de colisión triangular. Esta opción es ideal para objetos simples o dinámicos que requieren una detección de colisiones mayormente precisa.

Sin embargo, en ambos casos, la geometría visual puede ser demasiado compleja o no lo suficientemente suave para las colisiones. Esto puede crear fallas físicas y ralentizar el motor innecesariamente.

Para solucionar esto, existe el modificador -colonly. Eliminará la malla al importar y creará una colisión StaticBody en su lugar. Esto ayuda a separar la malla visual y la colisión real.

La opción -convcolonly funciona de manera similar, pero creará una ConvexPolygonShape en su lugar.

La opción -colonly también se puede usar con los objetos vacíos de Blender. En la importación, creará un StaticBody con un nodo de colisión como hijo. El nodo de colisión tendrá una de varias formas predefinidas, dependiendo del tipo de dibujo vacío de Blender:

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

Cuando sea posible, trata de usar unas cuantas formas de colisión primitivas en lugar de mallas triangulares o formas convexas. Las formas primitivas a menudo tienen el mejor rendimiento y fiabilidad.

Nota

Para una mejor visibilidad en el editor de Blender, puede configurar la opción "X-Ray" en los vacíos de colisión y establecer un color distinto para ellos en Blender User Preferences > Themes > 3D View > Empty.

Ver también

Ver Formas de colisión (3D) para una visión general de las formas de colisión.

Crear navigation (-navmesh)

Un nodo de malla con el sufijo -navmesh se convertirá en una malla de navegación. El objeto Mesh original se eliminará en el momento de la importación.

Crea un VehicleBody (-vehicle)

Un nodo de malla con el sufijo -vehicle se importará como hijo a un nodo VehicleBody.

Crea un VehicleWheel (-wheel)

Un nodo de malla con el sufijo -wheel se importará como hijo a un nodo VehicleWheel.

RigidBody (-rigid)

Un nodo de malla con el sufijo -rigid se importará como RigidBody.

Bucle de animación (-loop, -cycle)

Los clips de animación en el documento COLLADA que empiezan o terminan con el token loop o cycle serán importados como una Animación de Godot con la marca loop establecida. A diferencia de los otros sufijos descritos anteriormente, este no requiere un guión.

En Blender, esto requiere usar el Editor NLA y nombrar la Acción con el prefijo o sufijo bucle o ciclo.