Вращение кватерниона вокруг точки поворота в XNA - PullRequest
1 голос
/ 15 марта 2012

Ситуация: у меня есть 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, но если я попытаюсь повернуть все три, вращение будет перекошено, и перо карандашей покинуть опорную точку.

Буду признателен за любой свет, который вы сможете пролить на эту ситуацию. У меня такое чувство, что я неправильно использую Матрицы, но не могу найти заказ, который работает.

Заранее спасибо.

...