Ситуация: у меня есть 3d модель, которую я пытаюсь вращать и вращаться вокруг точки поворота. Давайте пока скажем, что модель - это карандаш, а его точка поворота - Vector3 (0, 0, 0). Карандашный наконечник всегда должен касаться точки поворота и вращаться вокруг каждой оси в зависимости от нажатия кнопки пользователя. Начальное смещение карандаша к точке поворота - Vector3 (0, 10, 0).
Я использовал кватернионы для того, чтобы избежать блокировки карданного подвеса, хотя я думаю, что могу испытывать это из-за неправильного использования кватернионов.
Мой текущий код:
public void UpdateRotation(Vector3 pivotPoint)
{
KeyboardState keyboardState = Keyboard.GetState();
Vector3 tempPos = pivotPoint - position;
if (keyboardState.IsKeyDown(Keys.X))
{
// Rotate around X axis.
Vector3 temp = position - pivotPoint;
temp = Vector3.Transform(temp, Matrix.CreateRotationX(rotateSpeed));
position = pivotPoint + temp;
// Update the direction the object is oriented.
rotation *= Quaternion.CreateFromAxisAngle(
Vector3.Right, rotateSpeed);
}
if (keyboardState.IsKeyDown(Keys.Y))
{
// Update the direction the object is oriented.
rotation *= Quaternion.CreateFromAxisAngle(
Vector3.Up, rotateSpeed);
}
if (keyboardState.IsKeyDown(Keys.Z))
{
// Rotate around Z axis.
Vector3 temp = position - pivotPoint;
temp = Vector3.Transform(temp, Matrix.CreateRotationZ(rotateSpeed));
position = pivotPoint + temp;
// Update the direction the object is oriented.
rotation *= Quaternion.CreateFromAxisAngle(
Vector3.Backward, rotateSpeed);
}
}
и это в функции DrawModel ():
effect.World = Matrix.CreateScale(gameobject.scale) *
Matrix.CreateFromQuaternion(gameobject.rotation) *
Matrix.CreateTranslation(gameobject.position);
В основном модель будет вращаться вокруг одной оси, и я могу даже сделать так, чтобы она вращалась вокруг x или z и оси y, но если я попытаюсь повернуть все три, вращение будет перекошено, и перо карандашей покинуть опорную точку.
Буду признателен за любой свет, который вы сможете пролить на эту ситуацию. У меня такое чувство, что я неправильно использую Матрицы, но не могу найти заказ, который работает.
Заранее спасибо.