Импорт модели XNA — все сетки отображаются друг над другом

Я создал сцену в 3DS Max со стандартной моделью двигателя и кое-что добавил себя, самолет и кнопку.

http://i.stack.imgur.com/R2iva.png

Независимо от того, как я экспортирую сцену, будь то .X с использованием Panda Exporter или .fbx с использованием 2012.2 fbx exporter, при загрузке в XNA и рендеринге все они отображаются друг над другом.

http://i.stack.imgur.com/6gdMb.png

Поскольку все отдельные части движка остаются там, где они должны быть (и разделены в 3ds max), я почти уверен, что есть что-то, что я неправильно настроил в 3ds max с расположением остальных моих объектов.

Обновление 1: код, который я использую для загрузки моделей в xna, выглядит следующим образом.

        Matrix[] transforms = new Matrix[model.Bones.Count];
        model.CopyAbsoluteBoneTransformsTo(transforms);

        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (BasicEffect be in mesh.Effects)
            {
                be.EnableDefaultLighting();
                be.Projection = camera.projection;
                be.View = camera.view;
                be.World = GetWorld() * mesh.ParentBone.Transform;
                // adding the additional * transforms[i]; didnt do anything  

            }
            mesh.Draw();
        }

Этот код отлично работает для моделей других людей, но не для тех, которые делаю я. Это похоже на то, что 3ds max не экспортирует позиции объектов, которые я создаю в сцене, относительно источника сцены.


person jordanrs    schedule 18.01.2012    source источник
comment
Просто чтобы вы знали, экспортер Panda X иногда неправильно работает с XNA.   -  person annonymously    schedule 19.01.2012
comment
Вы пытались загрузить модель из Интернета и использовать ее для проверки, является ли это вашим кодом или моделью?   -  person annonymously    schedule 20.01.2012


Ответы (1)


Вам нужно объединить все матрицы преобразования из родительских костей и дочерних костей следующим образом:

Matrix[] transforms = new Matrix[model.Bones.Count];
model.CopyAbsoluteBoneTransformsTo(transforms);

foreach (ModelMesh mesh in model.Meshes) {
    foreach (BasicEffect ef in mesh.Effects) {
        ef.World = transforms[mesh.ParentBone.Index];
        //Also do other stuff here, set projection and view matrices
    }
}

Вероятно, есть лучший способ, но этот код должен работать.

person annonymously    schedule 18.01.2012
comment
Я не думаю, что вам нужен дополнительный * transforms[i] - person Neil Knight; 19.01.2012
comment
@Neil Если вы можете это подтвердить, я удалю это. - person annonymously; 19.01.2012
comment
Обновлен мой ответ кодом, который я использую, чтобы показать, как я загружаю модели. - person jordanrs; 19.01.2012
comment
@анонимно Нил прав. Нет необходимости в дополнительных '* transforms[i]', достаточно transforms[m.pb.i]. Но это хорошее место для преобразования мира, которое вы хотели бы применить ко всем мешам модели. - person Steve H; 19.01.2012