Вращение в XNA - PullRequest
       40

Вращение в XNA

4 голосов
/ 18 марта 2011

У меня вопрос по поводу ротации моделей в XNA. Вопрос в том, что мне делать (какие значения нужно изменить и как), чтобы повернуть зеленую модель таким образом (красные стрелки):

http://img843.imageshack.us/i/question1.jpg/

Код, используемый для рисования:

DrawModel(elementD, new Vector3(-1, 0.5f, 0.55f), 0,-90,0);

private void DrawModel(Model model, Vector3 position, float rotXInDeg, float rotYInDeg, float rotZInDeg)
    {
        float rotX = (float)(rotXInDeg * Math.PI / 180);
        float rotY = (float)(rotYInDeg * Math.PI / 180);
        float rotZ = (float)(rotZInDeg * Math.PI / 180);

        Matrix worldMatrix = Matrix.CreateScale(0.5f, 0.5f, 0.5f) * Matrix.CreateRotationY(rotY) *Matrix.CreateRotationX(rotX)*Matrix.CreateRotationZ(rotZ)* Matrix.CreateTranslation(position);
        Matrix[] xwingTransforms = new Matrix[model.Bones.Count];
        model.CopyAbsoluteBoneTransformsTo(xwingTransforms);
        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.EnableDefaultLighting();

                effect.View = cam.viewMatrix;
                effect.Projection = cam.projectionMatrix;
                effect.World = (xwingTransforms[mesh.ParentBone.Index] * worldMatrix);
            }
            mesh.Draw();
        }

    }

Поэтому я попытался применить ваше решение, слегка изменив код:

Matrix worldMatrix = Matrix.CreateScale(0.5f, 0.5f, 0.5f) * Matrix.CreateRotationY(rotY) * Matrix.CreateRotationX(rotX)  * Matrix.CreateTranslation(position)
                * Matrix.CreateRotationX((float)(45 * Math.PI / 180)) * Matrix.CreateRotationZ(rotZ) * Matrix.CreateRotationX((float)(-45 * Math.PI / 180)); 

Изменяя параметр rotZ, я действительно мог вращать модель. Однако эффект не тот, чего я хотел достичь http://img225.imageshack.us/i/questionau.jpg/,, он изменил свою позицию. Это из-за неисправной модели или какой-то другой ошибки? Я хочу, чтобы «цилиндр» оставался на своем месте. Вы знаете, как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 18 марта 2011

Другой вариант - использовать кватернион для генерации матрицы вращения. Кватернион - это, в основном, ось и вращение вокруг него. Что может быть легче манипулировать в этом случае?

1 голос
/ 18 марта 2011

Вращение с матрицами вращения является кумулятивным. Таким образом, вы, вероятно, можете рассчитать матрицу вращения, повернув модель на 45 градусов «вниз», затем примените вращение вокруг нужной оси, а затем снова поверните модель на 45 градусов «вверх». Произведение этих трех матриц должно дать вам желаемую матрицу.

...