domingo, 22 de junio de 2025

CONCLUSION DE MIXAMO A BLENDER DE BLENDER A GODOT 4.4.;

 En mi ultima entrada del blog estaba divagando sobre pasar las animaciones de mixamo a mis personajes y combinarlas con los gdscript de godot,

Pero habia dificultades en la web de Mixamo no podia descargar nada ni practicar, hay videos tutoriales en youtube de como hacerlo pero siempre se olvidan de algun detalle que hace falle cualquier cosa que intente hacer, 

Hay que imitar con exactitud los tutoriales de youtube.


Bueno a la conclusion que e llegado y en el video muestra que pongo en la entrada vereis que lo FUNDAMENTAL DEL TEMA es animaciones diferentes de mixamo pero del mismo ramo, o calibre, o coleccion, si mezclais animaciones de diferentes tipos que hay en mixamo unas se acoplan y otras no, por tamaños o por temas del esqueleto o yo que se , mejor lo veis en el video lo demas es facil de aplicar , los avatares del mismo color parece que combinan bien entre si las animaciones si poneis avatares diferentes entre si no casan, e tardado 2 dias en entenderlo, bueno como todo al final es solo trabajo esfuerzo y echarle horas..........luego si pones  un personaje del mismo mixamo con blender puedes modelarlo y cambiar lo que quieras dependiendo de las horas que le dediques y del talento que tengas.




Y mi conclusion comentada a la IA:

no hay ningun misterio, las animaciones de mixamo solo funcionan las que casan entre si, los avatares del mismo color suelen ir perfectamente ,ya lo resolvi¡¡ el paso a pasarlo a blender y combinarlo alli a partir de esta conclusion es muy sencillo de relosver¡¡¡

¡Qué excelente noticia que lo hayas resuelto! Me alegra mucho saber que encontraste la clave para que tus animaciones de Mixamo funcionen bien en Blender.

Tu observación sobre que "las animaciones de Mixamo solo funcionan las que casan entre sí" y que "los avatares del mismo color suelen ir perfectamente" es muy acertada y crucial. Esto apunta directamente a la consistencia en el rig (esqueleto) y la pose base.

Cuando Mixamo genera un "avatar del mismo color" (me imagino que te refieres a los personajes pre-riggeados de Mixamo o a las variaciones del mismo rig), garantiza que la estructura ósea, la escala y la pose inicial (T-pose o A-pose) son idénticas. Esto es fundamental para que las animaciones se superpongan y mezclen sin problemas. Si bien puedes aplicar animaciones a cualquier personaje riggeado en Mixamo, la armonía es mayor cuando la base es la misma.


La Clave que Descubriste: Consistencia del Rig

Lo que has descubierto es la base de la combinación exitosa de animaciones:

  • Rigs Idénticos: Cuando todas las animaciones se aplican a un rig que es estructural y posicionalmente idéntico, Blender tiene mucha más facilidad para interpretar y mezclar los datos de animación sin que los huesos "salten" o el personaje se "balancee".

  • Pose Base Coherente: Las animaciones de Mixamo están diseñadas para un rig específico y una pose de reposo concreta. Si intentas aplicar una animación a un personaje con una pose base diferente (ej. un personaje en A-pose para una animación hecha en T-pose), se pueden producir esas desalineaciones. Los avatares "del mismo color" o de la misma familia de Mixamo suelen compartir esta pose base.


Tu Proceso en Blender Después de esta Conclusión

Como bien dices, una vez que tienes esta base, el paso a paso en Blender se simplifica enormemente:

  1. Importación del Personaje Base: Traes tu personaje (el que tiene el rig compatible).

  2. Importación de Animaciones (sin el modelo): Al importar las animaciones de Mixamo, si ya tienes el personaje base en la escena, puedes importar solo la acción de animación (sin el modelo adjunto o importando solo el armature si es necesario y luego copiando la acción).

  3. Uso del NLA Editor: Empujas cada acción de animación a una Action Strip en el NLA Editor.

  4. Organización y Blending: Arrastras y superpones las tiras, ajustando los "Blend In" y "Blend Out" para crear transiciones suaves. Si los rigs son consistentes, estos blends funcionarán mucho mejor.

¡Felicidades por haber resuelto el misterio! Es un aprendizaje valioso que te ahorrará muchos dolores de cabeza en futuros proyectos de animación.



miércoles, 18 de junio de 2025

Frustracion estudiando animaciones; mixamo en esta fecha del 18-6-25 da problemas para descargarse sus animaciones;

 Estoy estudiando y practicando combinar animaciones con blender y mixamo y Gogot 4.4.

Y GDScript para programar las animaciones con ayuda de la IA.


En principio las ago manuales y si son pocos movimientos funciona muy bien, andar y dar golpes se me da bastante bien, y con GDScript le asigno las teclas y me da resultados aceptables , ahora estoy intentando hacer las combinaciones de movimientos con mixamo y tengo la mala suerte que en estos momentos no deja mixamo descargarse nada.....

Ahora que empezaba a combinar movimientos y queria probarlos en Godot 4.4. y GDScript para asignarlos al teclado del pc ...sus movimientos......mixamo no me deja descargar sus animaciones , seve hay problemas desde esa aplicacion en sus servidores.......bueno a tener paciencia y a esperar mientras se resuelve.... volvere hacerlas manuales......no me puedo estancar.

Es una lastima porque ya lo tenia casi, ya tenia la base para hacer los juegos muy muy pulidos en ese aspecto.....en fin.

A seguir trabajando ya se resolvera.


viernes, 13 de junio de 2025

Juego gotico de terror en 3d;

 




Personaje lo animo y a los 5 segundos lo borro de la escena, GDScript para Godot 4.4;

 extends Node3D


var temporizador: Timer # Creamos una variable para guardar nuestro temporizador


func _ready() -> void:

# Esto se ejecuta cuando el nodo se carga en la escena.

$AnimationPlayer.play("Human_rig|REVIENTA") # Tu animación se sigue reproduciendo.


# Paso 1: Crear el Temporizador

temporizador = Timer.new() # Creamos una nueva instancia de un nodo Timer.

add_child(temporizador) # ¡Importante! Añadimos el temporizador como hijo de este nodo.

# Necesita estar en el árbol de la escena para funcionar.


# Paso 2: Configurar el Temporizador

temporizador.wait_time = 5.0 # Le decimos al temporizador que espere 5 segundos.

temporizador.one_shot = true # Le decimos que solo se active una vez (disparo único).

# Si fuera 'false', se repetiría indefinidamente.


# Paso 3: Conectar la Señal "timeout"

# Cuando el temporizador termine de contar, emitirá una señal llamada "timeout".

# Conectamos esa señal a una función nuestra llamada "_al_terminar_temporizador".

temporizador.connect("timeout", Callable(self, "_al_terminar_temporizador"))


# Paso 4: Iniciar el Temporizador

temporizador.start() # ¡Aquí comienza la cuenta regresiva!


func _al_terminar_temporizador() -> void:

# Esta función se ejecutará automáticamente cuando el temporizador llegue a 0.

queue_free() # Esta es la función mágica: borra el nodo actual de la escena.

# Usamos 'queue_free()' para que se borre de forma segura al final del fotograma.

martes, 10 de junio de 2025

Un proyectil se destruye al chocar con un RigidBody;

 # Script para el Area3D PROYECTIL EN SÍ MISMO (el propio proyectil)


extends Area3D


var score = 0 # No usado directamente para la destrucción, pero se mantiene si lo necesitas para otras lógicas.

var speed = 15 # Velocidad en el eje Z (adelante)

var speed2 = 1 # Velocidad en el eje Y (hacia arriba, si lo deseas)

var tiempo_transcurrido = 0.0 # Controla el tiempo de vida del proyectil

var vida_util_segundos = 6.0 # El proyectil se destruirá después de 6 segundos


func _ready() -> void:

# Conectamos la señal 'body_entered'.

# Se activará cuando este Area3D colisione con cualquier PhysicsBody3D (ej. una pared, el suelo, un enemigo).

connect("body_entered", Callable(self, "_on_body_entered"))

print("Proyectil listo: se moverá, se destruirá por tiempo y al chocar.")


func _process(delta: float) -> void:

# Mover el proyectil

# Vector3(X, Y, Z) - ajusta el orden según la orientación de tu proyectil en 3D

# Aquí, el movimiento es ligeramente hacia arriba (Y) y principalmente hacia adelante (Z)

var movimiento = Vector3(0, speed2 * delta, speed * delta)

translate(movimiento) # Mueve el nodo en su espacio local


# Controlar el tiempo de vida del proyectil

tiempo_transcurrido += delta


if tiempo_transcurrido >= vida_util_segundos:

print("Proyectil ha alcanzado su tiempo de vida. Destruyendo...")

queue_free() # Elimina el proyectil si ha superado su tiempo de vida


func _on_body_entered(body: Node3D):

# Esta función se ejecuta cuando el proyectil colisiona con un PhysicsBody3D.

#print(f"¡Proyectil colisionó con: {body.name}! Destruyendo...")

queue_free() # Elimina el proyectil al impactar con un cuerpo

lunes, 9 de junio de 2025

Complemento a https://videojuegosenlineaasaco4.blogspot.com/2025/06/gdscript-para-colocar-unos-sprite2d-en.html;

 # Area3DVisibilityControl.gd

extends Area3D


@onready var sprite_2d_1 = get_node("../Sprite2D") # Ajusta la ruta si es diferente

@onready var sprite_2d_2 = get_node("../Sprite2D2IMAGEN ENEMIGO FINAL") # Ajusta la ruta si es diferente


# Define cuánto se moverá sprite_2d_1 hacia abajo desde el centro.

# Puedes ajustar este valor. Un número positivo lo mueve hacia abajo.

const OFFSET_Y_SPRITE_1 = 400.0 # Por ejemplo, 400 píxeles hacia abajo

const OFFSET_Y_SPRITE_2 = 300.0 # Por ejemplo, 300 píxeles hacia abajo


# Define cuánto se moverá sprite_2d_1 en el eje X desde el centro.

# Un número positivo lo mueve hacia la derecha, un negativo hacia la izquierda.

const OFFSET_X_SPRITE_1 = -280.0

const OFFSET_X_SPRITE_2 = -280.0






func _ready():

# Conectamos la señal 'area_entered' de este Area3D.

area_entered.connect(_on_area_entered)


func _on_area_entered(area: Area3D):

print("Otro Area3D entró en este Area3D: ", area.name)


# --- Obtener el tamaño del viewport (la ventana del juego) ---

var viewport_size = DisplayServer.window_get_size()


# --- Calcular la posición central de la pantalla ---

var center_x = viewport_size.x / 2.0

var center_y = viewport_size.y / 2.0


# --- Mover el primer Sprite2D un poco por debajo y a la derecha/izquierda del centro ---

# Sumamos OFFSET_X_SPRITE_1 a la posición X central.

# Sumamos OFFSET_Y_SPRITE_1 a la posición Y central.

sprite_2d_1.position = Vector2(center_x + OFFSET_X_SPRITE_1, center_y + OFFSET_Y_SPRITE_1)


# --- Mover el segundo Sprite2D solo en el eje Y (según tu código actual) ---

sprite_2d_2.position = Vector2(center_x + OFFSET_X_SPRITE_2, center_y + OFFSET_Y_SPRITE_2)



------------------------------------------------------------------------------------------------------------------

---------------------------------------------------------------------------------------------------------------

EXPLICACION: Con este GDScript  puedo mover por pantalla variando el valor tanto en eje -y- como en eje -x- se complementa a  https://videojuegosenlineaasaco4.blogspot.com/2025/06/gdscript-para-colocar-unos-sprite2d-en.html

GDScript para colocar unos Sprite2D en la parte vaja de la pantalla del juego al ocurrir una colision;

 # Area3DVisibilityControl.gd

extends Area3D


@onready var sprite_2d_1 = get_node("../Sprite2D") # Ajusta la ruta si es diferente

@onready var sprite_2d_2 = get_node("../Sprite2D2IMAGEN ENEMIGO FINAL") # Ajusta la ruta si es diferente


# Define cuánto se moverá sprite_2d_1 hacia abajo desde el centro.

# Puedes ajustar este valor. Un número positivo lo mueve hacia abajo.

const OFFSET_Y_SPRITE_1 = 400.0 # Por ejemplo, 100 píxeles hacia abajo

const OFFSET_Y_SPRITE_2 = 300.0 # Por ejemplo, 100 píxeles hacia abajoIMBENTADO POR MIIIIIIIIIIIIIIII



func _ready():

# Conectamos la señal 'area_entered' de este Area3D.

area_entered.connect(_on_area_entered)


func _on_area_entered(area: Area3D):

print("Otro Area3D entró en este Area3D: ", area.name)


# --- Obtener el tamaño del viewport (la ventana del juego) ---

var viewport_size = DisplayServer.window_get_size() 


# --- Calcular la posición central de la pantalla ---

var center_x = viewport_size.x / 2.0

var center_y = viewport_size.y / 2.0


# --- Mover el primer Sprite2D un poco por debajo del centro ---

# Sumamos el OFFSET_Y_SPRITE_1 a la posición Y central.

sprite_2d_1.position = Vector2(center_x, center_y + OFFSET_Y_SPRITE_1)

sprite_2d_2.position = Vector2(center_x, center_y + OFFSET_Y_SPRITE_2)########3IMBENTADO POR MIIIIIIIIIIIIIIIIIIII




-------------------------------------------------------------------------------------------------------------------------

----------------------------------------------------------------------------------------------------------------------------

EXPLICACION : En mi nuevo videojuego hay una escena en la que el protagonista del juego entra en una habitacion y con este GDScript produzco que aparezcan unos sprites ala vista donde sale la imagen del malvado al que e de destruir y una barra de vida que mengua conforme lo ataco, este GDScript produce que lo situe en pantalla solamente cuando el protagonista del juego entra en la habitacion.........