2011-10-25 18 views
6

He estado siguiendo un tutorial XNA de The Hazy Mind Tengo un objeto base que tiene una Posición (Vector3) y una Rotación (Quaternion). El modelo de objetos se parece a esto Class DiagramRotar 6 lados de un bloque

A partir de la aplicación de la cámara en el tutorial, he hecho una copia de la rotación y giran métodos y las implantó en el objeto

public virtual void Rotate(Vector3 axis, float angle) 
{ 
    axis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 
    Rotation = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(axis, angle) * Rotation); 
} 

public virtual void Revolve(Vector3 target, Vector3 axis, float angle) 
{ 
    Vector3 revolveAxis = Vector3.Transform(axis, Matrix.CreateFromQuaternion(Rotation)); 

    Quaternion rotate = Quaternion.Normalize(Quaternion.CreateFromAxisAngle(revolveAxis, angle)); 

    Position = Vector3.Transform(Position - target, Matrix.CreateFromQuaternion(rotate)) + target; 

    Rotate(axis, angle); 
} 

mi bloque objeto crea 6 casos de Quad y llama al método render en cada objeto Quad, que tienen desplazamientos y rotaciones asignadas en cada quad para formar un bloque de textura con este aspecto: Block rendered by 6 Quad objects

y ahora tenemos el problema real, llamando Girar en mi bloque obj ect hace que el objeto en sí cambie la rotación y mis objetos Quad no giren, así que implementé una nueva función de Girar en mi objeto Block.

public override void Rotate(Vector3 axis, float angle) 
{ 
    for (int i = 0; i < mySides.Length; i++) 
    { 
     Quad side = mySides[i]; 
     side.Revolve(this.Position, axis, angle); 
    } 
} 

Sin embargo, esto no me ha dado el resultado esperado, como se ve aquí:

Block object rotated

La solución equivocada

La siguiente solución funciona, pero no va a ser muy genérico y será limitado: Un montón de instrucciones if que comprueban en qué eje quiero girar y luego gira cada lado (objeto Quad) de la manera correcta.

La solución adecuada

alternativa que podría hacer la prestación del Quad objetos depende de la rotación del objeto del bloque (su padre), pero estoy seguro de cómo hacer esto.

La tercera y última opción es hacer que el método de rotación actualice cada rotación y posición de los objetos cuádruples con los valores correctos, esto no estoy seguro de cómo hacerlo.

La pregunta

Así que lo que estoy pidiendo es algunas ideas o pensamientos sobre esto, tal vez algunos enlaces y/o tutoriales que explican cómo usar cuaterniones en XNA, preferiblemente en una forma visual.

Saludos, mirando hacia adelante a la entrada :)

Respuesta

2

Lo que debe hacer, y que usted ha mencionado esto, hacen que la prestación del Quad objetos depende de la rotación de la matriz.

Esto es bastante fácil de hacer con un sistema hierachal como el tuyo. Cuando su renderizador va a renderizar el bloque, debe almacenar la transformación del bloque en una matriz, llamémoslo BlockWorld. Cuando vaya a renderizar cada Quad, multiplique la transformación local del Quad por BlockWorld.