如何使用BasicEffect在XNA中绘制模型

4
我想在XNA中绘制一个模型。我已经使用Blender制作了它并将其导出为fbx文件格式,以便Content Pipeline可以处理它。我应该向WindowsGame()的Draw()方法添加什么代码?我尝试过以下代码,但是我得到的只是一个灰色屏幕(请注意,这不是蓝色,这是清除颜色)。模型是通过content.Load导入的,这没有引发任何错误,并且我将其命名为“Bowl”。有人能告诉我为什么这里不起作用吗?
protected override void Draw(GameTime gameTime)
        {
            GraphicsDevice.Clear(Color.CornflowerBlue);
            BasicEffect b = new BasicEffect (graphics.GraphicsDevice, new EffectPool ( ));
            foreach (ModelMesh m in Bowl.Meshes)
            {
                b.View = Cam.mView;
                b.Projection = Cam.mProj;
                b.World = mWorld;
                b.EnableDefaultLighting ( );
                b.Begin ( );
                m.Draw ( );
                b.End ( );
            }

            base.Draw(gameTime);
        }

我刚刚注意到这等效于效率上的谋杀,但我已经尝试了很多事情,我只需要在优化它之前让它工作。


1
只是一个提醒:不要在Draw()函数中放置"new BasicEffect...",这会减慢渲染速度。最好将其作为全局变量,在Initialize()函数中初始化。 - Zéiksz
1个回答

5
尝试首次渲染时,一个非常普遍的问题是相机并没有朝向你认为的方向。另一个可能的问题是模型的比例与你预期的不同。例如,如果相机沿着z轴向后5个单位,但模型宽度为10个单位,那么你的相机实际上处于模型内部。
至于渲染问题,Microsoft 提供了非常好的文档:http://msdn.microsoft.com/en-us/library/bb203933.aspx 你可以使用这段代码作为助手:
private void DrawModel(Model m)
{
    Matrix[] transforms = new Matrix[m.Bones.Count];
    float aspectRatio = graphics.GraphicsDevice.Viewport.Width / graphics.GraphicsDevice.Viewport.Height;
    m.CopyAbsoluteBoneTransformsTo(transforms);
    Matrix projection = Matrix.CreatePerspectiveFieldOfView(MathHelper.ToRadians(45.0f),
        aspectRatio, 1.0f, 10000.0f);
    Matrix view = Matrix.CreateLookAt(new Vector3(0.0f, 50.0f, Zoom), Vector3.Zero, Vector3.Up);

    foreach (ModelMesh mesh in m.Meshes)
    {
        foreach (BasicEffect effect in mesh.Effects)
        {
            effect.EnableDefaultLighting();

            effect.View = view;
            effect.Projection = projection;
            effect.World = gameWorldRotation * transforms[mesh.ParentBone.Index] * Matrix.CreateTranslation(Position);
        }
        mesh.Draw();
    }
}

在Blender中制作的任何模型 - 导出为FBX - 导入到XNA中,是否自动包含基本效果?听起来好像这段代码将寻找与BasicEffect兼容的效果,但我不知道它会在哪里找到,因为我没有添加它 :( (管线是否会自动添加?) - wsd
是的,当您通过内容管道进行导入时,它会自动创建一个基本效果。实际上,如果您想使用自定义效果,可以在自定义管道中自定义内置效果:http://blogs.msdn.com/shawnhar/archive/2006/12/07/rendering-a-model-with-a-custom-effect.aspx - Joel Martinez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接