0

我有一个项目很快就要到期了,我在尝试加载我在 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;

加载内容()

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

平局(游戏时间游戏时间)

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 加载模型时,它只是加载窗口中的一个大块。

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

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

谢谢,杰克!

4

1 回答 1

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

相机总是倒置的,因为向左移动世界向右移动,向左移动世界向右移动等等。

于 2013-04-22T10:18:22.610 回答