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. Godot tiene soporte completo para formato de texto y binario.
  • DAE (COLLADA), un formato viejo que está completamente soportado.
  • Formatos OBJ (Wavefront). También está totalmente soportado, pero bastante limitado (sin soporte para pivotes, esqueletos, etc).
  • 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.

Nota

Blender no exporta texturas emisivas con el archivo glTF. Si tu modelo las usa, deben ser agregadas de manera separada.

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.

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.

Keep On Reimport

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 utilicen 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 arreglos de tangentes (tangent arrays). Esta opción garantiza que se generen si no están presentes en la escena de origen. Godot usa Mikktspace 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 Baked lightmaps.

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.

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 nodos que no se usan en el motor del juego (como luces específicas usadas para modelar)

Para simplificar este flujo de trabajo, Godot ofrece algunos sufijos que se pueden añadir a los nombres de los objetos en su software de modelado 3D. Cuando se importan, Godot los detecta y realiza acciones automáticamente:

Eliminar nodos (-noimp)

Los nombres de nodos que tengan este sufijo se eliminarán en el momento de la importación, independientemente de su tipo. No aparecerán en la escena importada.

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

La opción "-col" funcionará sólo para los nodos Mesh. Si se detecta, se añadirá un nodo hijo de colisión estática, utilizando la misma geometría que la malla.

Sin embargo, a menudo se da el caso de que la geometría visual es demasiado compleja o irregular para las colisiones, que terminan por no funcionar bien.

Para resolver esto, existe el modificador "-colonly", que eliminará la malla al importarla y creará una colisión StaticBody en su lugar. Esto ayuda a separar la malla visual de la colisión real.

La opción "-convcolonly" creará ConvexPolygonShape en lugar de ConcavePolygonShape.

La opción "-colonly" también se puede utilizar con los objetos vacíos de Blender. Al importarlo creará un StaticBody con el nodo de colisión como hijo. El nodo de colisión tendrá una de las formas predefinidas, dependiendo del tipo de dibujo vacío del Blender:

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

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

Crear navigation (-navmesh)

Un nodo de malla con este sufijo se convertirá en una malla de navegación. Se eliminará el nodo Mesh original.

Crea un VehicleBody (-vehicle)

Un nodo mesh con este sufijo se importará como un hijo a un nodo VehicleBody.

Crea un VehicleWheel (-wheel)

Un nodo mesh con este sufijo se importará como un hijo a un nodo VehicleWheel.

Rigid Body (-rigid)

Crea un rigid body a partir de esta malla.

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

Los clips de animación en el documento de COLLADA que comienzan o terminan con el token "loop" o "cycle" se importarán como una animación de Godot con la marca de loop establecida. Esto distingue entre mayúsculas y minúsculas y no requiere un guión.

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