Вращение 6 сторон блока

I've been following a XNA tutorial by The Hazy Mind I have a base object that has a Position (Vector3) and a Rotation (Quaternion). Модель объекта выглядит следующим образом Class Diagram

Из реализации камеры в учебнике я сделал копию методов Rotation и Revolve и реализовал их на объекте

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);
}

Мой объект Block создает 6 экземпляров Quad и вызывает метод render на каждом объекте Quad, я назначил смещения и вращения на каждом Quad, чтобы сформировать текстурированный блок, выглядящий следующим образом: Block rendered by 6 Quad objects

И теперь у нас есть реальная проблема, вызов Rotate на моем объекте Block заставляет сам объект изменить вращение, а мои объекты Quad не вращаются, поэтому я реализовал новую функцию Rotate на моем объекте 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);
    }
}

Однако это не дало ожидаемого результата, как показано здесь:

Block object rotated

Неправильное решение

Следующее решение будет работать, но оно не будет очень общим и будет ограниченным: Куча операторов if, которые проверяют, вокруг какой оси я хочу вращаться, а затем поворачивают каждую сторону (Quad object) правильным образом.

Правильное решение

В качестве альтернативы я мог бы сделать рендеринг Quad-объектов зависимым от вращения Block-объекта (их родителя), но я не знаю, как это сделать.

Третий и последний вариант - заставить метод Rotate обновлять вращение и положение каждого Quad-объекта до правильных значений, но и это я не знаю, как сделать.

Вопрос

Итак, что я прошу, это некоторые идеи или мысли по этому поводу, возможно, некоторые ссылки и/или учебники, объясняющие, как использовать кватернионы в XNA, желательно в наглядной форме.

Спасибо, с нетерпением жду ваших предложений :)

6
задан thmsn 25 October 2011 в 21:51
поделиться