在XNA中正确加载地形+第一人称相机

时间:2013-04-20 19:42:05

标签: c# visual-studio-2010 xna 3dsmax

我很快就会有一个项目,我在尝试加载我在3D Studio Max中制作的模型时遇到了很多问题。我制作的模型就像我在XNA游戏中的地形一样。这是我到目前为止所做的:

方法:

    GraphicsDeviceManager graphics;
    SpriteBatch spriteBatch;

    Model terrainModel;
    Vector3 terrainPosition = Vector3.Zero;

    Vector3 cameraPosition = new Vector3(0.0f, 60.0f, 160.0f);
    Vector3 cameraLookAt = new Vector3(0.0f, 60.0f, 160.0f);
    Matrix cameraProjectionMatrix;
    Matrix cameraViewMatrix;

LoadContent()

        spriteBatch = new SpriteBatch(GraphicsDevice);

        cameraViewMatrix = Matrix.CreateLookAt(
            cameraPosition,
            Vector3.Zero,
            Vector3.Up);

        cameraProjectionMatrix = Matrix.CreatePerspectiveFieldOfView(
            MathHelper.ToRadians(80.0f),
            graphics.GraphicsDevice.Viewport.AspectRatio,
            1.0f,
            1000.0f);

        terrainModel = Content.Load<Model>("alphastreet");

Draw(GameTime gameTime)

GraphicsDevice.Clear(Color.CornflowerBlue);

        DrawModel(terrainModel, terrainPosition);

        // TODO: Add your drawing code here

        base.Draw(gameTime);

然后我想画画:

void DrawModel(Model model, Vector3 modelPosition)
    {
        foreach (ModelMesh mesh in model.Meshes)
        {
            foreach (BasicEffect effect in mesh.Effects)
            {
                effect.EnableDefaultLighting();
                effect.PreferPerPixelLighting = true;

                effect.World = Matrix.CreateTranslation(modelPosition);
                effect.Projection = cameraProjectionMatrix;
                effect.View = cameraViewMatrix;
            }
            mesh.Draw();
        }
    }

其他所有内容都与XNA文件一样。它自己的模型看起来像一条相当简单的街道。但是,在XNA加载模型时,它只是加载窗口中的一个大块。

我不知道我在做什么让这样的模型加载,但它让我把头发拉出来。任何帮助,将不胜感激。

此外,任何人都可以指导我走过/导游或创建第一人称射击相机的课程,因为那是我要去的游戏。我可能不应该选择那个,但是现在改变已经太晚了,所以如果你能在那里帮助你真的会拯救我的皮肤!

谢谢,杰克!

1 个答案:

答案 0 :(得分:0)

模型中是否有多个网格,如果是,您是否尝试过分别渲染每个网格? 您是否尝试过使用身份矩阵进行世界和视图以确保这些不是问题? 我假设您没有对xna / directx进行任何其他状态更改,如果是这样,请尝试禁用这些。

对于FPS相机,您只需跟踪浮点变量中的x和y旋转,并根据鼠标在x和y中的移动距离更新每帧。从这些中你可以生成一个摄像机视图矩阵;如下所示:

var mx = Matrix.CreateRotationX(xangle);
var my = Matrix.CreateRotationY(yangle);
var pos = Matrix.CreateTranslation(position);
var view = mx * my * pos; // These might be in the wrong order, not sure off the top of my head
view.Invert();

相机始终处于倒置状态,因为向左移动会向右移动世界,向左转动可以使世界向右移动等等。