3

最近我发布了同样的问题,即我的 FBX 模型在 XNA 中没有正确显示。我得到了这个问题的答案,模型显示得稍微好一些,但仍然无法正确显示。

它应该是这样的: https ://docs.google.com/open?id=0B54ow8GRluDUYTBubTQ4bjBramM 但它显示为: https ://docs.google.com/open?id=0B54ow8GRluDUNXR5bmJUMVJFTUk

我的绘图代码是:

public void Draw(Matrix projection, Matrix view)
{
   Matrix[] transforms = new Matrix[model.Bones.Count];
   model.CopyAbsoluteBoneTransformsTo(transforms);

   foreach (ModelMesh mesh in model.Meshes)
   {
      foreach (BasicEffect effect in mesh.Effects)
      {
         effect.EnableDefaultLighting();
         effect.View = view;
         effect.Projection = projection;
         effect.World = Matrix.CreateRotationX(-270) *
                        transforms[mesh.ParentBone.Index] *
                        Matrix.CreateTranslation(Position);
      }
   mesh.Draw();
   }
}

有人可以帮忙吗!谢谢。

4

2 回答 2

3

根据您之前的问题,Xna 渲染图像显示您正在渲染 2d 和 3d 项目,重置 2d 和 3d 之间的一些图形状态非常重要。

具体来说,在渲染 2d 内容后,添加以下行:

GraphicsDevice.BlendState = BlendState.Opaque;
GraphicsDevice.DepthStencilState = DepthStencilState.Default;

这些设置对于 3d 来说是必需的,但是在调用 SpriteBatch.Begin() 时它们会被更改,因此有必要在 3d 内容之前将它们改回。

这是解释它的博客文章:http: //blogs.msdn.com/b/shawnhar/archive/2010/06/18/spritebatch-and-renderstates-in-xna-game-studio-4-0.aspx

于 2012-11-12T18:11:40.067 回答
3

这是我的解决方案:

protected override void Draw(GameTime gameTime)
{

   GraphicsDevice.Clear(Color.CornflowerBlue);

   #region ResetGraphic

   ResetGraphic();

   #endregion
   #region render 3D
   BeginRender3D();
   //Render 3D here
   #endregion
   #region render 2D

   //Render 2D here
   #endregion

}

public void ResetGraphic()
{              
   GraphicsDevice.BlendState = BlendState.AlphaBlend;
   GraphicsDevice.DepthStencilState = DepthStencilState.None;
   GraphicsDevice.RasterizerState = RasterizerState.CullCounterClockwise;
   GraphicsDevice.SamplerStates[0] = SamplerState.AnisotropicWrap;

}

public void BeginRender3D()
{
   GraphicsDevice.BlendState = BlendState.Opaque;
   GraphicsDevice.DepthStencilState = DepthStencilState.Default;
}
于 2012-11-13T18:56:18.387 回答