Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Rotar un nodo para encarar un punto

Iniciado por pacomix, 14 de Agosto de 2007, 06:20:43 PM

« anterior - próximo »

pacomix

Hola a todos. Después de estar bastante tiempo intentándolo y como no doy con la tecla he decidido poner aquí un post para ver si alguien podría hecharme un cable u orientarme mejor.

El caso es que estoy intentando modificar un nodo de una animación en tiempo de ejecución para lograr que este encare un punto arbitrario en el espacio tridimensional.

Pongamos que yo quiero que mientras la animación del modelo se está reproduciendo, seleccione uno de los nodos, como por ejemplo la cabeza, ojos, etc... y se cree en tiempo de ejecución su matriz de rotación para apunte a donde yo quiera.

Esto mismo lo he realizado para modelos enteros, pero claro, lo que realmente me interesa es para un nodo.

¿Cuál es la mejor forma de realizarlo y la teoría?

Un saludo a todos.
=El verdadero guerrero de la luz se levanta cuando todos los demás han caído=-

BeRSeRKeR

Hola.

Calcula el vector que va desde la cabeza hasta el punto en cuestión (vector Z). Ahora escoge un vector "up" (vector Y) arbitrario (0,1,0 podría ser, aunque no te puedes confiar, no sea que  Z e Y sean coincidentes/paralelos) y calcula el producto vectorial entre Z e Y. Eso te dará un vector perpendicular a ambos, el vector X. No olvides normalizar los vectores.

Con eso ya tienes la base para construir la matriz de rotación (si no me falla la memoria):


X.x    X.y    X.z   0
Y.x    Y.y    Y.z   0
Z.x    Z.y    Z.z   0
P.x    P.y    P.z   1


Eso en nomenclatura row-major ala Direct3D. Si fuera column-major (OpenGL), tendrías que trasponer la matriz. P sería el vector posición de la cabeza (en teoría P debería ser 0 puesto que se supone que esta matriz de rotación la multiplicarás por la matriz de transformación del bone que ya llevará la traslación incluída).

Si utilizas la librería D3DX, puedes utilizar la función D3DXMatrixLookAtLH o D3DXMatrixLookAtRH, dependiendo del sistema de coordenadas que utilices (left-handed o right-handed).

Ahora bien, seguramente eso es sólo una de las tareas que tengas que llevar a cabo. Es posible que también quieras mezclar la animación "precalculada" del modelo (cabeza incluída :)) y la rotación recién calculada.

Y también es posible que quieras restringir la rotación (no sea que el personaje se nos desnuque :lol:) y a la vez hacer que el resto de la jerarquía se vea afectada por dicha rotación. Para ello deberás mirar el tema de la cinemática inversa (IK).

Como nota informativa, existen librerías para manejar la animación de personajes. Una muy conocida es Cal3D. Yo no la he utilizado nunca pero creo que debería tener esas cosas que he mencionado.

Saludos.

PD: todo esto suponiendo que utilices algún sistema de bones ó tags.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!






Stratos es un servicio gratuito, cuyos costes se cubren en parte con la publicidad.
Por favor, desactiva el bloqueador de anuncios en esta web para ayudar a que siga adelante.
Muchísimas gracias.