多个模型与XNA

本文关键字:XNA 模型 | 更新日期: 2023-09-27 18:11:58

嗨,首先我想让你知道,我是XNA的新手。

我为Surface创建了一个XNA应用程序。在我的应用程序中,我正在绘制一个fbx模型。我的问题是,我不知道如何绘制多个模型。这是我的代码,所以你可以看到我是如何绘制的:

protected override void Draw(GameTime gameTime)
    {
        if (!applicationLoadCompleteSignalled)
        {
            // Dismiss the loading screen now that we are starting to draw
            ApplicationServices.SignalApplicationLoadComplete();
            applicationLoadCompleteSignalled = true;
        }
        graphics.GraphicsDevice.Clear(Color.CornflowerBlue);
        rot += 0.0005f;
        foreach(Model model in modelList)
        {
            DrawModel(model);
        }
        graphics.GraphicsDevice.DepthStencilState = DepthStencilState.Default;
        base.Draw(gameTime);
    }
    private void DrawModel(Model myModel)
    {
        foreach (ModelMesh mesh in myModel.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.EnableDefaultLighting();  // Beleuchtung aktivieren
                effect.World = Matrix.CreateRotationZ(rot) * worldMatrix;
                effect.View = viewMatrix;
                effect.Projection = projectionMatrix;
            }
            mesh.Draw();
        }
    }

首先显示的模型只是一个平面。现在我想添加一个立方体,所以我在我的Update:

中调用它
if(Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.A))
        {
            LoadModel("cube");
        }

LoadModel(String)只是加载模型并将其添加到modelist中。但是没有显示立方体。

谢谢你的帮助

多个模型与XNA

看起来像上面的代码片段一样,没有错误。看看LoadModel方法就好了。

而只有建议:

  1. 在调试模式下看看发生了什么:立方体根本不存在(未加载)或者它是否加载,但未绘制。可能是shader或object相对于camera的正确位置

  2. 不是最好的选择,所以只是在按钮被按下的情况下调用一个方法。在这种情况下,当您按住按钮时,它将运行几次,因为检查经常发生(通常每秒60次)。如果它们确实不在LoadModel方法中,则必须添加一个标志或检查。

编辑

代码似乎是正确的,但在这种情况下有一些奇怪的。如果调用LoadModel方法,如果集合中的model或null出现问题,应该会出现异常。我认为由于某种原因,你的方法根本无法执行。尝试直接在LoadContent方法中加载你的模型,然后尝试从LoadContent调用LoadModel。

提示:单独的代码行。例如,使用

Model model = Content.Load<Model>(name);
modelList.Add(model);
不是

modelList.Add(Content.Load<Model>(name));

我改变了我的代码,它看起来像这样:

if(Keyboard.GetState().IsKeyDown(Microsoft.Xna.Framework.Input.Keys.A))
        {
            if (pressKey)
            {
                LoadModel("cube");
                pressKey = false;
            }
        }
        if (Keyboard.GetState().IsKeyUp(Microsoft.Xna.Framework.Input.Keys.A))
        {
            pressKey = true;
        }

我的LoadModel是这样的:

private void LoadModel(String name)
    {
        modelList.Add(Content.Load<Model>(name));
    }

如果我在将立方体添加到列表后进行控制台输出,则仍然只有平面。我不知道问题出在哪里。