我有一个3D FBX模型,我想在XNA 4.0 Windows游戏中绘制它。 Here是FBX查看器中的模型:
但是当我运行项目时,它显示为this
这是我的绘图方法:
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);
}
感谢您的帮助
答案 0 :(得分:0)
最有可能的问题是你的影响。世界财产。您通过创建矩阵,然后将其与worldMatrix
组合来做一些奇怪的事情。甚至更奇怪的是你创建了一组绝对变换(modelTransforms
),但你不能使用它们。
通常,它看起来像这样:
effect.World = modelTransforms[mesh.ParentBone.Index] * worldMatrix;
您的Matrix.CreateWorld(position, Vector3.Backward, Vector3.Up)
看起来像是一种简单地添加一些翻译(position
)的方式。通常,在将其置于draw()之前,您需要将位置添加到worldMatrix
。但是,以下内容可能对您有用:
effect.World = modelTransforms[mesh.ParentBone.Index] * worldMatrix * Matrix.CreateWorld(position, Vector3.Backward, Vector3.Up);
我将CreateWorld()
放在最后,因为它似乎仅包含翻译信息,并且包含行majore matricies,您最后翻译。