вращение модели в XNA через 3d max кажется неправильным - PullRequest
0 голосов
/ 20 апреля 2011

я создал модель в 3d max и центрировал ее по всему миру ... тем не менее, когда я помещаю ее в XNA и применяю вращение через XNA, кажется, что ее центр вращения НЕ находится в реальном объекте, но немного удален от это выглядит так, как будто объект движется по кругу, а не вращается ... что раздражает любого1 знаете, как это исправить?

Ответы [ 3 ]

1 голос
/ 28 сентября 2011

Проблема в том, что точка поворота в 3D Studio Max не передается в XNA. Вы можете изменить точку поворота в течение всего дня, и костная трансформация и вершины останутся прежними. Это просто не экспортируется правильно.

У меня есть MAXScript на http://metlab.cse.msu.edu/xna.html, который решает эту проблему.

Charles

1 голос
/ 20 апреля 2011

Когда вы центрировали объект в мире 3ds, он не изменил положения вершин. Он только создал матрицу, которая может трансформировать вершины от того места, где они были, к месту их размещения.

Возможно, поскольку часто у вас нет визуальной ссылки на происхождение мира и вы не понимаете, что ваша модель смещена в XNA, может быть не очевидно, что вы не приняли эту матрицу во внимание.

Это делается с помощью Model.CopyAbsoluteBoneTransformsTo (), чтобы поместить эту матрицу (которая превратилась в преобразование «Кость» посредством процессора содержимого) в массив, который можно использовать при настройке эффекта.

Если это звучит так, как будто это может быть проблемой, и вы хотите быстрый пример кода, сообщите нам.

0 голосов
/ 21 апреля 2011

Просто чтобы немного расширить ответ @Steve H, вот несколько возможностей:

В вашем коде XNA вы не применяете преобразования кости к вашей модели.Как и большинство инструментов моделирования, Макс стремится модифицировать матрицу преобразования мира для модели, а не для самих вершин.Преобразование вершин имеет тенденцию вводить небольшие ошибки с плавающей запятой, т. Е. Вершина с поворотом Пи / 2 на 1,0,0 радиуса вокруг оси z может прийти 0,099999,0 вместо 0,1,0 - это просто природаматематика с плавающей точкой, а также причина того, что в вашей игре вы всегда выполняете преобразование из исходной геометрии.

Вот ссылка на пример преобразования кости в MSDN (из v3.1, но существует множество примеров v4): обратите внимание на присвоение myModel.CopyAbsoluteBoneTransformsTo(transforms) и effect.World.Этот пример для BasicEffect, но даже с вашим собственным эффектом вам нужно будет извлечь костные трансформации и применить их.Это можно сделать при загрузке модели, если, например, вы используете собственный шейдер.(Обратите внимание, что преобразования костей необходимы, даже если вы не определили кости в своей модели в Max.)

(Заимствовано из связанной статьи MSDN)

protected override void Draw(GameTime gameTime)
{
    graphics.GraphicsDevice.Clear(Color.CornflowerBlue);

    // Copy any parent transforms.
    Matrix[] transforms = new Matrix[myModel.Bones.Count];
    myModel.CopyAbsoluteBoneTransformsTo(transforms);

    // Draw the model. A model can have multiple meshes, so loop.
    foreach (ModelMesh mesh in myModel.Meshes)
    {
        // This is where the mesh orientation is set, as well 
        // as our camera and projection.
        foreach (BasicEffect effect in mesh.Effects)
        {
            effect.EnableDefaultLighting();
            effect.World = transforms[mesh.ParentBone.Index] * 
                Matrix.CreateRotationY(modelRotation)
                * Matrix.CreateTranslation(modelPosition);
            effect.View = Matrix.CreateLookAt(cameraPosition, 
                Vector3.Zero, Vector3.Up);
            effect.Projection = Matrix.CreatePerspectiveFieldOfView(
                MathHelper.ToRadians(45.0f), aspectRatio, 
                1.0f, 10000.0f);
        }
        // Draw the mesh, using the effects set above.
        mesh.Draw();
    }
    base.Draw(gameTime);
}

Другойвероятность того, что в Максе стержень объекта (центр, на котором основаны все преобразования поворота / масштабирования / преобразования) не центрируется в сетке. Это легко изменить .

...