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

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

6 голосов
/ 26 октября 2011

Я следовал учебнику по XNA от Hazy Mind. У меня есть базовый объект, который имеет Позицию (Vector3) и Поворот (Quaternion).Объектная модель выглядит следующим образом Class Diagram

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

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 и вызывает метод рендеринга для каждого объекта 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) в правильном направлении.

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

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

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

Вопрос

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

Ура, с нетерпением жду вашего ввода:)

1 Ответ

2 голосов
/ 26 октября 2011

Что вы должны сделать, и вы упомянули об этом, сделать рендеринг объектов Quad зависимым от поворота родителя.

Это довольно легко сделать с такой иерархической системой, как ваша. Когда ваш рендерер отправляется на рендеринг блока, он должен хранить преобразование блока в матрице, назовем его BlockWorld . Когда вы собираетесь рендерить каждый квад, умножьте локальное преобразование квада на BlockWorld .

...