0

我有一个 3D FBX 模型,我想在 XNA 4.0 windows 游戏中绘制它。是 FBX 查看器中的模型:

但是当我运行项目时,它显示如下

这是我的绘图方法:

private void DrawModel(Model model, Matrix worldMatrix, string name)
    {
        Matrix[] modelTransforms = new Matrix[model.Bones.Count];
        model.CopyAbsoluteBoneTransformsTo(modelTransforms);
        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.EnableDefaultLighting();
                effect.World = Matrix.CreateWorld(position, new Vector3(0, 0, 1), Vector3.Up) * worldMatrix;
                effect.View = viewMat;
                effect.Projection = projectionMat;
            }
            mesh.Draw();
        }
    }

这是基本绘制方法:

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

        graphics.GraphicsDevice.BlendState = BlendState.Opaque;
        graphics.GraphicsDevice.DepthStencilState = DepthStencilState.Default;
        graphics.GraphicsDevice.SamplerStates[0] = SamplerState.LinearWrap;


        DrawModel(house, houseWorld, "house");


        base.Draw(gameTime);
    }

谢谢你的帮助

4

1 回答 1

0

很可能,问题出在您的 effect.World 属性上。通过创建一个矩阵,然后将它与worldMatrix. 更奇怪的是,您创建了一组绝对变换 ( modelTransforms),但您不使用它们。

通常,它看起来像这样:

effect.World = modelTransforms[mesh.ParentBone.Index] * worldMatrix;

Matrix.CreateWorld(position, Vector3.Backward, Vector3.Up)看起来像是一种简单地添加一些翻译(position)的方式。通常,您会在将位置添加worldMatrix到 draw() 之前添加位置。但是,以下可能对您有用:

effect.World = modelTransforms[mesh.ParentBone.Index] * worldMatrix * Matrix.CreateWorld(position, Vector3.Backward, Vector3.Up);

我把CreateWorld()最后一个,因为它似乎只保存翻译信息,并且使用 row majore 矩阵,你最后翻译。

于 2014-07-20T19:12:08.790 回答