Stratos: Punto de Encuentro de Desarrolladores

¡Bienvenido a Stratos!

Acceder

Foros





Md5 Y Meshes De Dx

Iniciado por Hastur, 05 de Octubre de 2005, 06:50:50 PM

« anterior - próximo »

Hastur

 Buenas!

Estoy liado creandome un parser para los MD5 del doom 3 con MDX, la cosa esta en que ya parseo (creo que bien) el .md5mesh, el problema viene a la hora de parsear las animaciones, no entiendo demasiado bien que es lo que deberia leer ni como, por ejemplo, los valores que tiene cada bone en hierarchy, que son?
Deduzco que despues del nombre, viene el numero de bone, pero los demas ni idea :S
hierarchy {
"origin" -1 0 0 //
"Body" 0 6 0 // origin ( Ty Tz )
"Hips" 1 3 2 // Body ( Tx Ty )
"Lupleg" 2 56 4 // Hips ( Qx Qy Qz )
...


Despues, que son los valores que salen para cada fotograma? Supongo que la posicion/rotacion, pero al haber un numero diferente de valores por linea no se como tratarlos:
frame 0 {
 51.5447387695 -3.0239832401
 1.0195504427 5.3025918007
 0.7355086803 -0.3889687657 0.4772257507
 0.0189839788 0.0578746125 -0.5245873928
 -0.8296036124 0.3866359591 0.0100788241
 0.488070637 -0.3712677062 0.7295016646
 -0.0142540894 -0.0333928876 -0.5200206041
 0.8724460602 -0.4404397309 0.1936372519
 1.0421460867 2.7552113533
 ...



Pense en dibujar todo esto como Meshes de MDX para facilitarme un poco la vida, pero todos los ejemplos que he visto crean meshes desde ficheros .x, hay alguna forma de crear meshes desde mis propias estructuras? Las animaciones como se las tendria que pasar al Mesh?

Muchas gracias desde ya :)

BeRSeRKeR

 A ver si me acuerdo...

Cita de: "Hastur"Estoy liado creandome un parser para los MD5 del doom 3 con MDX, la cosa esta en que ya parseo (creo que bien) el .md5mesh, el problema viene a la hora de parsear las animaciones, no entiendo demasiado bien que es lo que deberia leer ni como, por ejemplo, los valores que tiene cada bone en hierarchy, que son?
Deduzco que despues del nombre, viene el numero de bone, pero los demas ni idea :S
hierarchy {
"origin" -1 0 0 //
"Body" 0 6 0 // origin ( Ty Tz )
"Hips" 1 3 2 // Body ( Tx Ty )
"Lupleg" 2 56 4 // Hips ( Qx Qy Qz )
...

Por ejemplo, cojamos el bone "origin". Las componentes son:

  • El nombre del bone
  • El índice del bone padre. -1 significa que no tiene padre. Por ejemplo "Body" tiene de indice 0, lo que quiere decir que el bone padre es "origin". Se da por hecho que este índice hace referencia a un bone que está por encima (ya se habría cargado) del bone actual.
  • Componentes animadas. En este caso el 0 significa que ninguna componente (ni posición ni rotación), está animada. Los posibles valores son:

    • 1   -> Componente de posición X animada
    • 2   -> Componente de posición Y animada
    • 4   -> Componente de posición Z animada
    • 8   -> Componente de rotación X animada
    • 16 -> Componente de rotación Y animada
    • 32 -> Componente de rotación Z animada
    • Una combinación de estos bits hará que tengas varias componentes animadas. Por ejemplo, en el bone "Lupleg" pone 56, que se saca de sumar 8 + 16 + 32. Si te fijas entre paréntesis, en forma de comentario, ya te está indicando las componentes animadas ( Qx Qy Qz ), donde Q viene de quaternion.
  • Finalmente tenemos el offset donde comienzan las componentes animadas del bone. Por ejemplo, "origin" tiene un offset de 0, pero como no tiene componentes animadas pues pasamos. Luego viene "Body" que tiene dos componentes animadas y un offset de 0, o sea que por ejemplo nos vamos a la lista de componentes del frame 0 (el que has puesto más abajo) y leemos a partir de la componente 0, 2 componentes (51.5447387695 y -3.0239832401). Ahora viene "Hips" con 2 componentes animadas y offset 2. ¿Por qué el offset es 2?, pues porque el bone anterior tenía dos componentes animadas, es decir, el offset se va incrementando tantas unidades como componentes animadas tenga el bone anterior. Espero que lo hayas pillado. :)
Cita de: "Hastur"Despues, que son los valores que salen para cada fotograma? Supongo que la posicion/rotacion, pero al haber un numero diferente de valores por linea no se como tratarlos:
frame 0 {
 51.5447387695 -3.0239832401
 1.0195504427 5.3025918007
 0.7355086803 -0.3889687657 0.4772257507
 0.0189839788 0.0578746125 -0.5245873928
 -0.8296036124 0.3866359591 0.0100788241
 0.488070637 -0.3712677062 0.7295016646
 -0.0142540894 -0.0333928876 -0.5200206041
 0.8724460602 -0.4404397309 0.1936372519
 1.0421460867 2.7552113533
 ...
Con lo que te he explicado antes supongo que esto requiere poca explicación. Por ejemplo, "Body" dice que tiene dos componentes animadas a partir del elemento 0 del array de componentes (en este caso del frame 0). Pues nada, eso es 51.5447387695 y -3.0239832401. ¿pero qué significan realmente estas componentes?. Pues bien, lo que significa es que, por ejemplo en el caso de "Body", las componentes Ty y Tz (las que nos indican los bits de animación) del frame base (baseframe), serán sustituídas por estas nuevas componentes. Es decir, si el frame base tenia para el bone "Body" una traslación de (20, 10, -5), ahora pasará a tener una traslación de (20, 51.5447387695, -3.0239832401).

Cita de: "Hastur"Pense en dibujar todo esto como Meshes de MDX para facilitarme un poco la vida, pero todos los ejemplos que he visto crean meshes desde ficheros .x, hay alguna forma de crear meshes desde mis propias estructuras? Las animaciones como se las tendria que pasar al Mesh?
Es totalmente posible crear un mesh sin necesidad de cargarlo desde un archivo. De hecho nosotros lo hacemos así. Cualquier objeto (ya sea Haddd o MD5) lo almacenamos en los meshes de DX. Si cuentro algún tutorial lo pongo por aqui.

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

Hastur

 Wah! muchisimas gracias! Ahora lo tengo todo mucho mas claro :D

Hastur

 Encontre un tutorial cojonudo sobre la creacion de Meshes a partir de tu propia geometria, aqui, estuve dandome de patadas con el ayer y al final consegui renderizar la malla del md5mesh :D ahora tendria que hacerme una clase camara o algo para poder moverme y verla por todos los lados, de momento la voy rotando con esto xD
           float angle = Environment.TickCount / 500.0F;
           device.Transform.World = Matrix.RotationYawPitchRoll(angle, angle / 3.0F, 0);
           device.Transform.View = Matrix.LookAtLH(new Vector3(100,0,1000),
               new Vector3(0, 0.5F, 0), new Vector3(0, 1, 0));
           device.Transform.Projection = Matrix.PerspectiveFovLH((float)Math.PI / 400.0F, 1.0F, 900.0F, 1100.0F);
           device.RenderState.FillMode = FillMode.WireFrame;


Se que puede ser una tonteria, pero me hace mucha ilusion ver que hay algo en pantalla programado por mi :P






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.