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?).

Comentarios