Я следовал учебнику по XNA от Hazy Mind. У меня есть базовый объект, который имеет Позицию (Vector3) и Поворот (Quaternion).Объектная модель выглядит следующим образом
Из реализации камеры в учебном пособии я сделал копию методов 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 для формирования текстурированного блока, который выглядит следующим образом:
И теперь у нас естьФактическая проблема, вызов 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);
}
}
Однако это не произошлодайте мне ожидаемый результат, как показано здесь:
Неправильное решение
Следующее решение будет работать, но не будет очень общими будет ограничено: группа операторов if, которая проверяет, на какую ось я хочу вращаться, а затем вращает каждую сторону (объект Quad) в правильном направлении.
Правильное решение
В качестве альтернативы я мог бы сделать рендеринг объектов Quad зависимым от вращения объекта Block (их родителя), но я не уверен, каксделать это.
Третий и последний вариант заключается в том, чтобы метод Rotate обновлял каждое вращение Quad объектов и располагал их до правильных значений, в этом я не уверен, как это сделать.
Вопрос
Итак, я прошу некоторые идеи или мысли по этому поводу, возможно, некоторые ссылки и / или учебные пособия, объясняющие, как использовать кватернионы в XNA, предпочтительно визуально.
Ура, с нетерпением жду вашего ввода:)