Introducción al 3D

Crear un juego en 3D puede ser todo un reto. Esa coordenada Z extra hace que muchas de las técnicas comunes que ayudaron a hacer juegos 2D simples ya no funcionen. Para ayudar en esta transición, vale la pena mencionar que Godot utiliza APIs similares para 2D y 3D. La mayoría de los nodos son iguales y están presentes en las versiones 2D y 3D. De hecho, vale la pena comprobar el tutorial de plataformas 3D, o los tutoriales de personajes cinemáticos 3D, que son casi idénticos a sus homólogos 2D.

En 3D las matemáticas son un poco más complejas que en 2D, así que revisar la sección Matemáticas vectoriales de la wiki (que fue creada especialmente para desarrolladores de juegos, no para matemáticos o ingenieros) ayudará a allanar el camino hacia el desarrollo eficiente de juegos 3D.

Nodo Spatial

Node2D es el nodo base para 2D. Control es el nodo base para todo el GUI. Siguiendo este razonamiento, el motor 3D utiliza el nodo Spatial para todo lo que es 3D.

../../_images/tuto_3d1.png

Spatial nodes have a local transform, which is relative to the parent node (as long as the parent node is also of or inherits from the type Spatial). This transform can be accessed as a 4x3 Transform, or as 3 Vector3 members representing location, Euler rotation (x,y and z angles) and scale.

../../_images/tuto_3d2.png

Contenido 3D

A diferencia de 2D, donde la carga de contenido y dibujo de imágenes es directa, 3D es un poco más difícil. El contenido debe crearse con una herramienta 3D especial (normalmente denominada DCC) y exportarse a un formato de archivo de intercambio para poder importarse en Godot (los formatos 3D no están tan estandarizados como las imágenes).

Modelos creados por DCC

Hay dos vías para importar modelos 3D en Godot. La primera y más común es a través del importador Importando escenas 3D, que permite importar escenas completas (tal y como se ven en el DCC), incluyendo animaciones, rigs esqueléticos, blend shapes, etc.

El segundo modo es importando archivos .OBJ como Resources para mallas (mesh), las que pueden ser colocadas dentro de un nodo MeshInstance para su visualización.

Geometría generada

Es posible crear geometría personalizada usando el recurso ArrayMesh directamente. Simplemente crea tus arrays y usa la función ArrayMesh.add_surface_from_arrays(). También está disponible una clase de utilidad, SurfaceTool, que proporciona una API más sencilla y ayuda para indexar, generar normales, tangentes, etc.

En cualquier caso, este método está destinado a generar geometría estática (modelos que no se actualizarán con frecuencia), ya que la creación de arrays de vértices y su envío a la API 3D tiene un coste de rendimiento significativo.

Geometría inmediata

En cambio, si se requiere generar una geometría simple que se actualice con frecuencia, Godot proporciona un nodo especial, ImmediateGeometry, que proporciona una API de modo inmediato estilo OpenGL 1.x para crear puntos, líneas, triángulos, etc.

2D en 3D

Mientras que Godot cuenta con un potente motor 2D, muchos tipos de juegos utilizan 2D en un entorno 3D. Utilizando una cámara fija (ya sea ortogonal o perspectiva) que no gira, nodos como Sprite3D y AnimatedSprite3D pueden ser usados para crear juegos 2D que se aprovechan de la mezcla con fondos 3D, parallax más realistas, efectos de iluminación/sombra, etc.

La desventaja es, por supuesto, que la complejidad añadida y el rendimiento reducido en comparación con 2D simple, así como la falta de referencia de trabajo en píxeles.

Entorno

Además de editar una escena, a menudo es común editar el entorno. Godot proporciona un nodo WorldEnvironment que permite cambiar el color de fondo, el modo (como por ejemplo, poner un skybox), y aplicar varios tipos de efectos de post-procesamiento incorporados. Los entornos también se pueden anular en la cámara.

Vista 3D

La edición de escenas 3D se realiza en la pestaña 3D. Esta pestaña se puede seleccionar manualmente, pero se habilitará automáticamente cuando se seleccione un nodo Spatial (espacial).

../../_images/tuto_3d3.png

Los controles de navegación de escena 3D predeterminados son similares a Blender (con el objetivo de tener algún tipo de consistencia entre software libre usado para el desarrollo…), pero se incluyen opciones para personalizar los botones y el comportamiento del mouse para que sean similares a otras herramientas en Ajustes del Editor:

../../_images/tuto_3d4.png

Sistema de coordenadas

Godot usa el sistema métrico para todo. La Física 3D y otras áreas están preparadas para esto, por lo que intentar usar una escala diferente suele ser una mala idea (a menos que sepas lo que estás haciendo).

Al trabajar con recursos 3D, siempre es mejor trabajar en la escala correcta (ajusta el DCC a métrico). Godot permite escalar después de la importación y, aunque esto funciona en la mayoría de los casos, en situaciones poco frecuentes puede presentar problemas de precisión de coma flotante (y por lo tanto, errores o defectos) en áreas delicadas como el renderizado o la física. Por lo tanto ¡asegúrate de que tus artistas siempre trabajen en la escala correcta!

La coordenada Y se usa para «arriba», pensado para la mayoría de los objetos que necesitan alineación (como luces, cámaras, colisionador de cápsula, vehículo, etc.), el eje Z se usa como una dirección «apuntando al frente». Esta convención significa aproximadamente que:

  • X es los lados
  • Y es arriba/abajo
  • Z es adelante/atrás

Gizmos de espacio y manipulación

El movimiento de objetos en la vista 3D se realiza a través de los gizmos del manipulación. Cada eje está representado por un color: Rojo, Verde, Azul representan X, Y, Z respectivamente. Esta convención se aplica también a la cuadrícula y a otros gizmos (y también al lenguaje de shaders, el orden de los componentes para Vector3, Color, etc.).

../../_images/tuto_3d5.png

Algunos keybindings útiles:

  • To snap placement or rotation, press the «Ctrl» key while moving, scaling or rotating.
  • Para centrar la vista en el objeto seleccionado, pulsar la tecla «f».

Menú Ver

Las opciones de visualización se controlan mediante el menú «Ver» en la barra de herramientas la vista 3D.

../../_images/tuto_3d6.png

You can hide the gizmos in the 3D view of the editor through this menu:

../../_images/tuto_3d6_1.png

To hide a specific type of gizmos, you can toggle them off in the «View» menu.

../../_images/tuto_3d6_2.png

Entorno por defecto

Cuando se crea desde el Administrador de Proyectos, el entorno 3D tiene un cielo por defecto.

../../_images/tuto_3d8.png

Dada la forma en que funciona la renderización basada en la física, se recomienda intentar siempre trabajar con un entorno predeterminado para proporcionar luz indirecta y reflejada a los objetos.

Cámaras

No importa cuántos objetos se coloquen en el espacio 3D, no se mostrará nada a menos que se añada un nodo :ref: Camera <class_Camera> a la escena. Las cámaras pueden trabajar en proyecciones ortogonales o en perspectiva:

../../_images/tuto_3d10.png

Las cámaras están asociadas y sólo se muestran en el Viewport de un padre o abuelo. Dado que la raíz del árbol de escenas es un viewport, las cámaras se mostrarán en él de forma predeterminada, pero si se desean sub-viewports (ya sea como objetivo de render o como imagen-en-imagen), estos necesitan sus propias cámaras hijas para que se muestre su contenido.

../../_images/tuto_3d11.png

Cuando se trata de varias cámaras, se siguen las siguientes reglas para cada viewport:

  • Si no hay cámaras en el árbol de escenas, la primera que entre en él se convertirá en la cámara activa. Otras cámaras que entren en la escena serán ignoradas (a menos que estén configuradas como actual).
  • Si una cámara tiene la propiedad «actual» establecida, se utilizará independientemente de cualquier otra cámara de la escena. Si la propiedad está configurada, se activará, sustituyendo a la cámara anterior.
  • Si una cámara activa deja el árbol de escena, la primera cámara en orden de árbol tomará su lugar.

Luces

No hay limitación en el número de luces ni de tipos de luces en Godot. Se pueden añadir tantos como se desee (siempre que el rendimiento lo permita).