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

Posted

技术标签:

【中文标题】如何使用 BasicEffect 在 XNA 中绘制模型【英文标题】:How To Draw a Model in XNA with the BasicEffect 【发布时间】:2010-11-01 12:43:01 【问题描述】:

我想在 XNA 中绘制一个模型。我已经开始在 Blender 中制作它并将其导出为 fbx 文件格式,以便内容管道可以使用它。我应该在我的 WindowsGame() 的 Draw() 方法中添加什么代码?我尝试了以下但我得到的只是一个灰色屏幕(灰色而不是蓝色,这是清晰的颜色,请注意)模型是使用 content.Load 导入的,这不会引发错误,我称之为“碗” .

谁能告诉我为什么这里不起作用?

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);
        

我刚刚注意到这在效率方面相当于谋杀,但我尝试了很多东西,我只需要在优化它之前让它工作。

【问题讨论】:

请注意:不要在 Draw() 中添加“new BasicEffect...”,它会减慢渲染速度。将其作为全局变量,然后 Initialize()-d. 【参考方案1】:

第一次尝试渲染某些东西时,一个非常常见的问题是相机没有看到您认为它正在看到的东西。另一个可能的问题是该模型的规模不是您所期望的。例如,如果相机在 z 轴上 5 个单位,但模型是 10 个单位宽,那么您的相机实际上是在模型内部。

就渲染问题而言,微软在这方面有很好的文档:http://msdn.microsoft.com/en-us/library/bb203933.aspx

你可以使用这个 sn-p 作为助手:

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 兼容的效果,但我想不出它会在哪里找到,因为我没有添加:((它是由管道自动添加的吗?)跨度> 是的,当您通过内容管道导入时,它会自动创建一个基本效果。其实如果要使用自定义效果,可以在自定义管道中自定义内置效果:blogs.msdn.com/shawnhar/archive/2006/12/07/…

以上是关于如何使用 BasicEffect 在 XNA 中绘制模型的主要内容,如果未能解决你的问题,请参考以下文章

如何使用切线和纹理坐标从3DSMAX导出到FBX

使用自定义效果时缺少网格颜色,但使用 BasicEffect 时没有

如何使用maya创建的fbx文件在xna中导入约束

如何在 XNA 中指向内容中的文件

C# XNA - 如何使用 2 个矩形变量绘制动画纹理?

如何使用XNA编程动画FBX模型