0

我将模拟汽车在道路网络上的移动。首先,我使用 userindexedprimitives 绘制道路,它工作正常。之后在特定时刻,我将模型添加到场景中。这些模型正在路上,而且似乎还可以。从后面看它们看起来不错,因为它们大致按照创建顺序相互跟随。但是在前视图中,应用程序总是先绘制最后一次添加的车辆,依此类推,因此它们是相互绘制的,没有封面。也许它可以在图像上识别(链接已删除,请参阅更新)。我使用的效果文件是THIS, CurrentTechnique 是“ColoredNoShading”。首先我认为问题可能是这个设置,但其他可能性是抛出关于丢失顶点信息(COLOR0 或 NORMAL 等)的异常,我没有处理它们......也许解决方案很简单,只是我没有不知道...

有人可以帮我吗?

提前致谢

代码基于此方案:

private void DrawModel(Model model, Matrix world, Matrix view, Matrix projection)
{
foreach (ModelMesh mesh in model.Meshes)
{
    foreach (BasicEffect effect in mesh.Effects)
    {
        effect.World = world;
        effect.View = view;
        effect.Projection = projection;
    } 
    mesh.Draw();
}
}

与视图和投影矩阵相关:

viewMatrix = Matrix.CreateLookAt(new Vector3(0, 170, 0), new Vector3(0, 0, 0), new Vector3(0, 0, -1));
projectionMatrix = Matrix.CreatePerspectiveFieldOfView(MathHelper.PiOver4, graphics.GraphicsDevice.Viewport.AspectRatio, 1.0f, 30000.0f);

effect.CurrentTechnique = effect.Techniques["ColoredNoShading"];
effect.Parameters["xProjection"].SetValue(projectionMatrix);
effect.Parameters["xView"].SetValue(viewMatrix); 

更新:

使用 DepthStencilState 属性会更好,但是在这张新图像上,问题是可见的……通过车辆的眼镜,我们只能看到由 userindexedprimitives 绘制的顶点,而看不到模型。

4

1 回答 1

0

我认为可能导致您出现问题的一件事是您是否GraphicsDevice.RenderState.DepthBufferEnable设置为true. (如果您正在绘制 spritebatches,这很可能是问题所在。)我会检查一下,因为我有类似的绘图问题,并且每次绘制的设置GraphicsDevice.RenderState.DepthBufferEnabletrue在我绘制模型之前)解决了这个问题。如果您使用的是 XNA 4.0,而不是使用上面的代码,则必须执行以下操作:

DepthStencilState depthBufferState = new DepthStencilState(); 
depthBufferState.DepthBufferEnable = true;
GraphicsDevice.DepthStencilState = depthBufferState;

这是一个可能有用的链接。XNA - 以正确的顺序绘制四边形(和基元)

编辑:

要回答您关于汽车窗户未正确绘制的问题,要解决此问题,您需要以正确的顺序绘制汽车:首先是最远的汽车,然后是较近的汽车。你可以尝试这样的事情:

游戏逻辑:

List<Model> modellist;
Public Override Void Update
{
    //Update Logic
    foreach (Model m in n)
    {
         m.Update(cameraPosition);
    }
} 
Public Override Void Draw(GameTime gametime)
{
    //Draw Primitives and then sort models by distance from camera
    List<Model> n = modellist.OrderByDescending(x => x.DistanceFromCamera).ToList<Model>();
    foreach (Model m in n)
    {
        //Draw Model m
    }
}

模型类

class Model
{
    private int distanceFromCamera = 0;
    public int DistanceFromCamera
    {
        get { return distanceFromCamera; }
        set { distanceFromCamera = value; }
    }

    public Vector3 Position;

    public void Update(Vector3 CameraPos)
    {
        //...
        distanceFromCamera = Vector3.Distance(CameraPos, this.Position);
    }
}

您也可以在 Update void 中调用 OrderByDescending();这可能会更有效。但希望这将为您指明正确的方向。高温高压

于 2013-08-17T18:29:01.020 回答