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). Модель объекта выглядит следующим образом
Из реализации камеры в учебнике я сделал копию методов 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, чтобы сформировать текстурированный блок, выглядящий следующим образом:
И теперь у нас есть реальная проблема, вызов 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 object) правильным образом.
Правильное решение
В качестве альтернативы я мог бы сделать рендеринг Quad-объектов зависимым от вращения Block-объекта (их родителя), но я не знаю, как это сделать.
Третий и последний вариант - заставить метод Rotate обновлять вращение и положение каждого Quad-объекта до правильных значений, но и это я не знаю, как сделать.
Вопрос
Итак, что я прошу, это некоторые идеи или мысли по этому поводу, возможно, некоторые ссылки и/или учебники, объясняющие, как использовать кватернионы в XNA, желательно в наглядной форме.
Спасибо, с нетерпением жду ваших предложений :)