Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Jerarquía De Bones

Iniciado por BeRSeRKeR, 11 de Agosto de 2004, 02:41:07 PM

« anterior - próximo »

BeRSeRKeR

 Hola.

Recurro a vosotros porque me va a dar algo. Algo que en principio parecía que iba a ser coser y cantar me está matando.

A ver. Imaginad que tengo una jerarquía de bones tal como ésta:



Lo que yo quiero es, conociendo la posición (relPos) y rotación (relRot) relativa de cada bone en relación a su bone padre, calcular las posiciones absolutas (en world-space) de cada bone (AbsPos).

Pues bien. Yo tan contento me he creado una función (es MAXScript pero no creo que tengáis problemas en entenderlo) que crea, para cada bone, una matriz que en teoría debería pasar la posición relativa de un bone a coordenadas absolutas. Esta es la función:

fn setupJoints joints =
(
-- Recorremos todos los bones
for i = 1 to joints.count do
(
 -- Referencia al bone actual
 joint = joints[i]

 -- Creamos la matriz de transformación relativa al bone padre
 -- relRot es un quaternion por lo que lo convertimos a matriz
 -- y lo almacenamos en la parte que representa la rotación
 joint.mRelative = joint.relRot as Matrix3
 -- En la parte de la posición (fila 4) almacenamos la posición
 -- relativa al bone padre
 joint.mRelative.row4 = joint.relPos

 -- Si el bone actual tiene padre...
 if joint.parent != undefined then
 (
  -- Calculamos la matriz de transformación absoluta
  joint.mAbsolute = joint.mRelative
  joint.mAbsolute = joint.parent.mAbsolute * joint.mRelative
 )
 else
 (
  -- El bone actual no tiene padre (es el root) por lo que su matriz
  -- de transformación absoluta es igual a la relativa
  joint.mAbsolute = joint.mRelative
 )
)
)


Una vez que tengo toda la jerarquía construída. Un simple:

absPos = bone5.relPos * bone5.mAbsolute

debería darme la posición absoluta de ese bone, pero no, en ciertas situaciones sí pero en otras no y eso es lo que me está volviendo loco. (uoh)

A ver si vosotros me podéis echar un cable.

Por si sentís curiosidad de a qué viene todo esto, es que estoy haciendo un importador para MAX de modelos de Doom3 (la versión definitiva). Ya tengo prácticamente terminado la parte que importa la malla con sus pesos y todo, pero ahora que estoy en la parte que importa la animación es cuando estoy empezando a tener problemas.

Aquí tenéis un pequeño video (1MB) de "Imp" haciendo lumbares/abdominales. Un poco tieso eso sí. Es una chorrada pero bueno, a ver si así os motiva. :P

Gracias.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

ethernet

 Si lo calculas asi, no deberias avanzar en la jerarquia de padres a hijos? no se si lo haces asi, nunca he trabajado con bones, pero si multiplicas la matriz relativa del bone cno la absoluta del padre, la absoluta del padre debe estar ya calculada.

un saludo

BeRSeRKeR

 Si, la absoluta del padre ya está calculada porque los bones están por orden de forma que siempre el padre ya se ha cargado antes que el hijo.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Zaelsius

 Como dice ethernet, creo que deberias recorrer la jerarquía de huesos desde los nodos terminales hasta el raíz... No veo manera de hacerlo correctamente en un bucle de N huesos/pasos.

Citar
Si, la absoluta del padre ya está calculada porque los bones están por orden de forma que siempre el padre ya se ha cargado antes que el hijo.

¿A qué te refieres con que se han cargado antes que el hijo? Para el sistema que has puesto en la foto no habria problema con el bucle.. pq están ordenados.. en fin no sé si me pierdo algo.

Edit: lo he dicho mal, seria desde la raiz hasta los terminales..  (nooo)  

BeRSeRKeR

 Yo creo que las matrices absolutas se crean bien porque si hago lo mismo pero sólo con esferas enlazadas (no existe rotación) formando una jerarquía como la de los bones, me calcula bien las posiciones en coordenadas absolutas. El problema debe estar en las rotaciones.

Tened en cuenta que el bucle empieza en el bone raiz. La matriz absoluta de la raiz es su propia matriz relativa (no tiene padre). Despues pasa al segundo bone de la jerarquía y multiplica su matriz relativa por la absoluta del padre lo cual nos da una matriz que acumula la transformación del bone padre y el bone actual. Si continuamos el bucle vemos que efectivamente, para cada bone se construye una matriz absoluta que es la acumulación de los bones que están por encima suya en la jerarquía.

Si podéis poned el pseudocódigo de cómo solventaríais vosotros el problema éste de calcular las posiciones absolutas de la jerarquía.

Gracias.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

ethernet

 Si dices que va asi no tengo nada mas que aportar, solamente una pregunta sobre esto:


-- Calculamos la matriz de transformación absoluta
 joint.mAbsolute = joint.mRelative
 joint.mAbsolute = joint.parent.mAbsolute * joint.mRelative


por que pones  joint.mAbsolute = joint.mRelative y despues la "aplastas". Supongo q sera un codigo residuo XD (fruto de tu vagueria :P)

BeRSeRKeR

Cita de: "ethernet"por que pones  joint.mAbsolute = joint.mRelative y despues la "aplastas". Supongo q sera un codigo residuo XD (fruto de tu vagueria :P)
Es que estuve haciendo modificaciones en esa parte y después se me olvidó quitar esa línea (aunque lo de la vaguería también cuenta). :D

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Haddd

 ¿no estás haciéndolo al revés? Debería ser absoluta=hijo*padre

BeRSeRKeR

Cita de: "Haddd"¿no estás haciéndolo al revés? Debería ser absoluta=hijo*padre
Así tampoco funciona.

La verdad es que no sé donde puede estar el fallo. Porque no hay más que eso. MAX me da la posición y rotación de cada bone relativa al bone padre (por lo que ahí no hay fallo, los datos deben ser correctos) y con eso, en teoría, debería poder calcular las posiciones absolutas.

Saludos.
¡Si te buscan en nombre de la ley, huye en nombre de la libertad!!

Pogacha

 La rotacion es previa a la posicion relativa o posterior a la rotacion relativa?

main {  Raiz->Calcular(Matriz_Identidad); }

TBone::Calcular_Posicion_Absoluta (Matriz m)
{  
  m *= Posicion_Relativa
  Posicion_Absoluta= m[FILA4];
  m *= Rotacion_Relativa;

  para cada hijo
      Hijo->Calcular_Posicion_Absoluta(m);
}



sino seria

main {  Raiz->Calcular(Matriz_Identidad); }

TBone::Calcular_Posicion_Absoluta (Matriz m)
{  
  m *= Posicion_Ralativa
  m *= Rotacion_Relativa;
  Posicion_Absoluta= m[FILA4];

  para cada hijo
      Hijo->Calcular_Posicion_Absoluta(m);
}

Pogacha

 Para saber el Hijo debes conocer al padre, por ende si quieres aprovechar dinamica, el ataque debe de ser de Padre a Hijo.

Pogacha

 Quiero un video del imp haciendo sentadillas!!

BeRSeRKeR

 Bueno, creo que el problema va a estar en que internamente MAX utiliza un sistema right-handed mientras que las matrices de rotación están como left-handed. Voy a probar unas cuantas cosas. Ya os contaré.

Por cierto, el video del Imp lo puse en el pimer mensaje. De todas formas, aquí lo tienes:

http://www.arrakis.es/~jonathan01/d3w/imp_test.avi

Como dije es una tontería pero bueno. :)

Gracias por vuestra ayuda.
¡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.