【问题标题】:Can anyone spot why my XNA model doesn't render correctly?谁能发现为什么我的 XNA 模型不能正确渲染?
【发布时间】:2014-05-16 12:58:31
【问题描述】:

我的最后一个问题被搁置了,因为我只是试图提供我所有的源代码(这实际上是一个非常小的示例)。我的问题是我能够绘制一个四边形并定位我的相机并将其面向 {0,0,0}。无论出于何种原因,当我绘制应该是站在最中心的士兵的模型时,我看不到它。在调试时,我看到模型加载正确,有它的骨骼/网格等,所以我不确定为什么我看不到它。

我的相机是这样设置的:

public class CameraManager : GameComponent
{

    private GraphicsDeviceManager fGraphicsDeviceManager;
    public Matrix ViewMatrix { get; private set; }
    public Matrix ProjectionMatrix { get; private set; }

    public Vector3 CameraPosition { get; set; }
    public Vector3 CameraTarget { get; set; }

    public float AspectRatio { get; set; }
    public float NearClip { get; set; }
    public float FarClip { get; set; }
    public float ViewAngle { get; set; }


    public CameraManager(Game pGame, GraphicsDeviceManager pGraphicsDeviceManager) : base(pGame)
    {
        fGraphicsDeviceManager = pGraphicsDeviceManager;

        CameraPosition = new Vector3(500, 300, 100);
        CameraTarget = Vector3.Zero;

        Viewport vViewPort = pGraphicsDeviceManager.GraphicsDevice.Viewport;

        AspectRatio = (float)vViewPort.Width / (float)vViewPort.Height;
        NearClip = 1.0f;
        FarClip = 2000.0f;
        ViewAngle = MathHelper.PiOver4;
    }

    public override void Update(GameTime pGameTime)
    {
        ViewMatrix = Matrix.CreateLookAt(CameraPosition, CameraTarget, Vector3.Up);
        ProjectionMatrix = Matrix.CreatePerspectiveFieldOfView(ViewAngle, AspectRatio, NearClip, FarClip);
        base.Update(pGameTime);
    }
}

请注意,相机并没有改变,它只是在世界上静止不动,看着零。

现在是模型类:

public class Soldier : DrawableGameComponent
{
    Game1 fGame;
    Model fModel;

    public Vector3 Forward { get; set; }
    public Vector3 Position { get; set; }

    public Soldier(Game1 pGame)
        : base(pGame)
    {
        fGame = pGame;
        Forward = Vector3.Forward;
        Position = Vector3.Zero;
    }

    protected override void LoadContent()
    {
        fModel = fGame.Content.Load<Model>(@"Models\Human\Soldier\MP_US_Support");
        //fModel = fGame.Content.Load<Model>(@"Models\Vehicles\Planes\model_plane");
    }

    public override void Update(GameTime pGameTime)
    {
        base.Update(pGameTime);
    }

    public override void Draw(GameTime pGameTime)
    {
        foreach (ModelMesh vMesh in fModel.Meshes)
        {
            foreach (BasicEffect vBasicEffect in vMesh.Effects)
            {
                vBasicEffect.Projection = fGame.fCameraManager.ViewMatrix;
                vBasicEffect.View = fGame.fCameraManager.ProjectionMatrix;
                vBasicEffect.World = Matrix.Identity;
            }
            vMesh.Draw();
        }
        base.Draw(pGameTime);
    }
}

同样,模型加载良好(我认为)。我将 Projection/View 设置为 Camera 的 ViewMatrix/ProjectionMatrix。

最后在我的 Game1.cs 中,我将这些添加为组件:

protected override void Initialize()
{
    //Initialize Camera
    fCameraManager = new CameraManager(this,fGraphicsDeviceManager);
    this.Components.Add(fCameraManager);

    //Initialize Map
    fMap = new FlatMap(this);
    this.Components.Add(fMap);

//Initialize a Soldier
fSoldier = new Soldier(this);
this.Components.Add(fSoldier);

this.IsMouseVisible = true; 
base.Initialize();

}

如果有人对完整的源代码感兴趣,可以在这里找到: http://www.filedropper.com/worldexplorergame(26mb由于一个模型,否则源代码量超小)。

【问题讨论】:

    标签: c# xna xna-4.0


    【解决方案1】:

    你已经交换了投影和视图变换:

    vBasicEffect.Projection = fGame.fCameraManager.ProjectionMatrix;
    vBasicEffect.View = fGame.fCameraManager.ViewMatrix;
    

    顺便说一句,你的模型似乎有点太详细了。如果你想拥有多个士兵并想保持实时性,你应该考虑简化模型。

    【讨论】:

    • 哇,我觉得自己像个白痴,它就在我的脸上。这就是我发展到晚上太晚的结果:)谢谢先生!
    猜你喜欢
    • 1970-01-01
    • 2022-06-15
    • 2021-08-06
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-06
    • 1970-01-01
    相关资源
    最近更新 更多