【问题标题】:Multiple Models with XNAXNA 的多种型号
【发布时间】:2014-07-07 10:57:30
【问题描述】:

您好,首先我想让您知道,我是 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();
        }
    }

首先显示的模型只是一个平面。现在我想添加一个立方体,所以我在我的更新中调用它:

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

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

感谢您帮助我。

【问题讨论】:

  • 看起来您将模型存储在 modelList 中。您应该能够绘制该列表中的所有内容。所以只需将更多模型添加到模型列表中。我猜在 LoadContent() 中。
  • 我想在按下 A 键时使用 LoadModel 将新模型添加到列表中。但没有任何改变。但问题不在 LoadModel() 中,因为在开始时使用此函数加载了飞机。即使我在开始时(在 LoadContent() 中)在平面之后加载多维数据集,也不会显示多维数据集。
  • 您必须向您的问题添加更多信息,以便其他人能够分析您的问题。您的 LoadModel() 方法如何?你想画什么,程序实际画什么?您的整个 Game-Class 看起来如何?
  • 此外,创建单独的类来加载、绘制和更新您想要绘制的不同模型/形状的逻辑可能是一个好主意。

标签: c# visual-studio-2010 xna xna-4.0


【解决方案1】:

看起来上面的代码sn-p,没有错误。看看 LoadModel 方法就好了。

虽然只是建议:

  1. 在调试模式下查看发生了什么:立方体根本不存在(未加载)或者它是否已加载但未绘制。可能是着色器或对象相对于相机正确定位。

  2. 不是最好的选择,所以只需在按下按钮的情况下调用一个方法。在这种情况下,它会在您按住按钮时运行几次,因为检查非常频繁(通常每秒 60 次)。必须添加一个标志或检查它们是否肯定不在方法 LoadModel 中。

编辑

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

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

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

而不是

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

它使调试代码变得非常容易。

【讨论】:

  • 第 2 点似乎是一个很好的提示。也许他只需要创建和设置一个标志,比如 isDrawn = true;什么的。
  • 它起作用了,立方体放在飞机下面(不知道为什么它放在那里......它应该在上面)。当然,这很明显会发生,但我没想到会出现这种情况,因为如果我在控制台中输出模型列表,似乎列表中只有一个元素。并感谢第 2 点。很好的提示!
  • 谢谢,@user3707057。立方体可能位于平面下方,例如,如果 3d 编辑器中的轴排列方式与 XNA 中的不同(如在 3DMax 中)。例如,如果 Y 向上查找并且立方体占据从 (0, 0, 0) 到 (1, 1, 1) 的体积,它会旋转 90 度并且会像在零平面下方一样。轴 Z 变为 Y,Y 变为 -Z。我称之为“脸朝下倒在地板上”:D
【解决方案2】:

我将代码更改为如下所示:

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

如果我在将多维数据集添加到列表后进行控制台输出,则仍然只有飞机。我不知道问题是什么。代码对我来说似乎是正确的。

【讨论】:

  • 好吧对不起,我解决了。模特们正躺在飞机下面。很抱歉没有认识到这一点,但我仍然感到困惑,因为它们在那里,但如果我让 Console.WriteLine(modelList) 列表中只有一个模型。
猜你喜欢
  • 1970-01-01
  • 2013-06-23
  • 1970-01-01
  • 1970-01-01
  • 2012-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-02-03
相关资源
最近更新 更多