Unity 2019.3.1, Godot 3.2


Justo con el sismo que casi me echa la casa abajo, han salido Unity 2019.3 y Godot 3.2. No voy a detenerme en los cambios, porque ya otros han abundado a lo largo de los últimos meses al respecto. Unity, en mi opinión, se ha hecho esperar más de la cuenta, tanto, que ni siquiera he tenido mucho interés en probarlo. Esperaré a la 2019.3.1. En esta versión vienen cosas interesantes, como UIElements, pero la 2020.1 en mi opinión traerá mejoras más importantes, como la nueva API de redes. Como viene siendo habitual, debería salir en marzo o abril.
A pesar de los muchísimos cambios interesantes que trae Godot 3.2, tampoco es la versión que estoy esperando. Esa sería la 4.0, con el nuevo renderizador basado en Vulkan, por ahora bastante inestable. La rama Vulkan aún está en una etapa bastante temprana, según el último reporte de Juan Linietsky, en febrero debería completarse el proceso de portar las funcionalidades del 3.2 (ojo, muchas de las cuales han quedado mejor que antes, evidencia de que el cambio a Vulkan fue una decisión acertadísima), para entonces pasar a las nuevas. Aquí sí es más difícil hacer predicciones, ya saben que no tengo una bola de cristal (solo dos de las normales), pero según el calendario, entre mediados y fin de año es la fecha de lanzamiento oficial. Y no esperen estabilidad antes de mayo, cuando todo lo que funcionaba antes funcione correctamente en la nueva rama. Aunque según tengo entendido, hay valientes que se han atrevido a hacer juegos completos con la 4.0. No digo que no se pueda, si te tomas el trabajo de salvar cada vez que hagas un cambio.
De momento, pienso ir moviéndome a la 3.2 con los dos proyectos serios que tengo entre manos (portar el Laberinto del Saber a Godot es uno de ellos), en espera de que la 4 mejore lo suficiente como para ser usable.

No puedo hacer retargeting en Godot, pero sí otras cosas

Ayer tenía planificado dedicar un rato a escribir, pero primero quise quitarme la duda de una vez por todas. Se ve que soy un poco testarudo a veces, pues según mis consultas, el retargeting, en la forma en que yo quería hacerlo, no es posible en Godot. Para entrar en contexto, lo que pretendía era utilizar una animación descargada de Mixamo en un modelo exportado sin animaciones, con el propósito final de compartir las animaciones entre todos los modelos con el mismo esqueleto. 
Luego de echarle un vistazo al editor, probé el enfoque más obvio: exportar el modelo desde Blender e importar la animación en el editor. Eso, claro, no sirve de nada, no hay forma de hacer que el modelo utilice esa animación. Pero resulta que si abres la animación como una escena, la puedes guardar y desde el modelo, la puedes cargar. Había encontrado el Santo Grial! Pero no. Eso tampoco funciona. Lo intenté exportando a todos los formatos compatibles y nada. A propósito, los modelos importados desde FBX no incluyen un AnimationPlayer si no contienen animaciones, en cambio, los importados desde Collada sí lo tienen. En general, el exportador BetterCollada que provee Godot funciona mucho mejor en todos los aspectos.
Lo único que logré fue que el modelo se sacudiera un poco, pero la animación no funciona. Incluso probé usando la rama Vulkan, pero nada. ¿Por qué mi insistencia en conseguir esto? No es esencial para hacer un juego, pero creo que es más óptimo tener una sola animación y reutilizarla que tenerla repetida en todos los modelos.
Una vez que me había convencido de la imposibilidad de hacerlo, me pregunté si podría equipar items en el modelo del personaje. Y a esta duda sí encontré respuesta positiva casi de inmediato. Exportando el objeto, en este caso unos guantes, con su esqueleto (igual que lo hacía en Unity), y salvando la malla de su MeshInstance:





Hice otra copia de la malla de las manos, que en este caso serían las reemplazadas siguiendo el mismo procedimiento. Atentos, para que sea más simple, no abran el archivo importado como escena heredada o les dará un error al guardar diciendo que el objeto debe ser único. El cambio de uno por otro es simple: miren este script que añadí al nodo raíz del modelo del personaje:

extends Spatial

var gloves = "res://Models/male-alejandro-dae/iron_gloves_anim.tres"
var hands = "res://Models/male-alejandro-dae/male-hands.tres"
var equip:bool

# Called when the node enters the scene tree for the first time.
func _ready():
    equip=false


# Called every frame. 'delta' is the elapsed time since the previous frame.
func _process(delta):
    if Input.is_key_pressed(KEY_SPACE):
        if !equip:
            var res = load(gloves)
            get_node("varsoi_male/Skeleton/varsoiM_hands").mesh = res
            equip = true
        else:
            var res = load(hands)
            get_node("varsoi_male/Skeleton/varsoiM_hands").mesh = res
            equip = false

No es para nada lo más civilizado, pero consideren que soy bastante nuevo en esto. Presionando Espacio, se montan y desmontan los guantes, los cuales siguen la animación del modelo correctamente.


A continuación me surgió la duda de si podría hacer lo mismo con un objeto sin animar, montado encima del cuerpo del personaje, por ejemplo, una armadura. ¿Seguiría la animación del personaje? La respuesta es sí. Utilizando un BoneAttachment, logré equipar la armadura más o menos donde debía ir. Aquí me encontré con dificultades, a diferencia de los guantes, la armadura no tenía la escala y rotación correctas. Raro, porque ambos provenían del mismo archivo blend (que si no recuerdo mal, pueden encontrar en OpenGameArt, cortesía del viejo equipo de The Key of the World), quizás se deba a la prsencia o falta del esqueleto. Pero la prueba demostró que es factible, pese a los detalles que surgieron. La armadura seguía los movimientos de traslación y rotación del torso del personaje bastante bien.
Aunque utilicé para casi todas las pruebas la rama 4.0, estoy seguro de que funcionaría todo igual en la 3.2 pues ahora mismo son muy parecidas. Excepto que la 4.0 es bastante inestable.
Supongo que después de todo valió la pena no trabajar en mi novela anoche (después de todo, ¿quién necesita la literatura?).

The road so far (aunque no estamos a final de temporada aún)


Es genial cuando todas las cosas te salen bien a la primera: creas código que funciona y las cosas se ven como debe ser. No es mi caso ahora, claro. No obstante, tengo que reconocer que algo he logrado avanzar en estos días de lidiar con Godot.
Luego de rastrear tutoriales por todo Youtube y preguntar mucho, he conseguido resolver algunos problemas y ganar experiencias. Por ejemplo, si quieren ver cómo usar raycasting en una escena 3D para desplazar el personaje, definitivamente lo mejor es el demo Navmesh oficial. De paso, ese mismo demo les ayudará en la parte de usar el camino calculado para mover al personaje. En cambio, no le presten mucha atención a la escena. Es cierto que funciona, pero la forma más correcta de hacerlo es crear un nodo de tipo Navigation y colgar de él todos los elementos (en el demo, la cosa está invertida, el Navigation cuelga de la malla que funge como escena).
A pesar de que la mayoría de los tutoriales y demos están orientados a juegos 2D, siempre aparecen algunas perlas. Evidentemente, que Godot tenga una comunidad de cierta envergadura ayuda muchísimo a encontrar alguien que haya intentado con anterioridad lo mismo que tú y haya sobrevivido para documentarlo. Yo mismo estoy pensando crear mi tutorial acerca de la vista isométrica en 3D, porque ya saben que no sé hacer otra cosa. Pero en comparación con lo que falta, esto es nada.
Uno de los experimentos que tengo pendientes es probar el soporte de red, crer un sistema de inventario y habilidades (pospuesto hasta que aprenda más GDScript) y cacharrear la rama Vulkan. Esto último sí podría probarlo pronto, en cuanto habilite los drivers Vulkan en Linux, porque el código fuente ya está descargado y compilado. Es más una cuestión de curiosidad que para uso real, porque no sé en qué estado estará esa rama, donde los cambios son drásticos. En caso de que no lo sepan, la rama Vulkan, o 4.0, debería venir detrás de la 3.2, a mediados o finales de año. Si no he entendido mal, en ella se reimplementa el gestor de memoria, viene el nuevo renderizador basado en Vulkan (obvio), nuevo método de iluminación global, y se arreglan (o arreglarán) muchas cosas.
Conclusión: lento, pero seguro, se van haciendo cosas. Recuerden que en casa yo no puedo acudir a Google, tengo que esperar a la mañana siguiente para consultar internet. Si tengo suerte, en la tarde ya tengo respuesta. Si no, hay que esperar al otro día. Veremos si para fines de este año ya tengo un mejor dominio de Godot o si la paciencia se me ha agotado y me he ido con otro (con otro motor dejuegos, no sean mal pensados).

Cacharreando 3d en Godot

Primer post del año, que espero que haya empezado por todo lo alto para ustedes, con mucha prosperidad y dinero. A ver si así al fin se deciden a gastarse unos dólares en comprar mi novela.
Aunque me tomé unos días de descanso no planificados para terminar de ver The Boys y The Witcher, ya he vuelto al trabajo. Más o menos. Sigo experimentando con Godot, aprendiendo y chocando con dificultades. El gran problema es venir de un motor profesional con un excelente soporte 3d, donde puedes hacer casi cualquier cosa que se te ocurra. Algo tan trivial como guardar la animación en un archivo y utilizarla en un modelo exportado a otro archivo es un lío complicado. Tanto, que justo ahora no sé decirles a ciencia cierta si es posible o no.
Solo ayer conseguí entenderme con las animaciones de los modelos, aunque en el caso específico en que las mismas están todas incluidas dentro del archivo exportado desde Blender. Y ya que hablamos de exportar e importar, tal como me esperaba, el importador basado en Assimp funciona bastante bien, pero no perfecto. Lo usual es que cuando falle, se lleve por delante al editor completo. Como todo software, incluso en los comerciales, la solución está en esperar a que mejore. Comparada con la de hace unos años, la biblioteca Assimp de hoy es una maravilla, créanme.
En cambio, mi experiencia exportando a glFT no fue tan buena. Había pequeñas deformaciones en el modelo y otros detalles que ahora mismo no recuerdo. Al final, el formato FBX producido por Blender probó ser un poco más confiable.
A continuación pienso dedicarme a mover el modelo por un mapa sencillo, quizás probar la navegación, para terminar con algunas pruebas de red. En la parte 2D, pienso hacer una prueba simple portando un nivel del Laberinto, en cuanto salga Godot 3.2. Al menos en 2D Godot no está tan atrasado, lo cual no quita que haya un montón de código que reescribir y otro montón de cosas que aprender.