Model 为什么要按创建顺序绘制XNA模型?

Model 为什么要按创建顺序绘制XNA模型?,model,xna,mesh,vertex,Model,Xna,Mesh,Vertex,我将模拟汽车在道路网络上的移动。首先,我使用userindexedprimitives绘制道路,效果很好。之后,在特定的时刻,我将模型添加到场景中。这些模型正在路上行驶,看起来还不错。从后面看它们看起来不错,因为它们大致按照创造的顺序彼此跟随。但在前视图中,应用程序总是先绘制最后一次添加的车辆,依此类推,因此它们是相互绘制的,没有封面。也许可以在图像上识别它(链接已删除,请参阅更新)。我使用的效果文件是,当前的技术是“彩色无阴影”。首先,我认为问题可能在于此设置,但其他可能性是抛出有关缺少顶点信

我将模拟汽车在道路网络上的移动。首先,我使用userindexedprimitives绘制道路,效果很好。之后,在特定的时刻,我将模型添加到场景中。这些模型正在路上行驶,看起来还不错。从后面看它们看起来不错,因为它们大致按照创造的顺序彼此跟随。但在前视图中,应用程序总是先绘制最后一次添加的车辆,依此类推,因此它们是相互绘制的,没有封面。也许可以在图像上识别它(链接已删除,请参阅更新)。我使用的效果文件是,当前的技术是“彩色无阴影”。首先,我认为问题可能在于此设置,但其他可能性是抛出有关缺少顶点信息的异常(颜色0或法线等),我没有处理它们。。。也许解决办法很简单,只是我没有发现

有人能帮我吗

提前谢谢

代码基于此方案:

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属性会更好,但在新图像上问题是显而易见的。。。通过vechicle的眼镜,我们只能看到由userindexedprimitives绘制的顶点,而没有模型。

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

DepthStencilState depthBufferState = new DepthStencilState(); 
depthBufferState.DepthBufferEnable = true;
GraphicsDevice.DepthStencilState = depthBufferState;
这里有一个链接可能会有所帮助

编辑:

要回答您关于汽车车窗未正确绘制的问题,要解决此问题,您需要按照正确的顺序绘制汽车:首先是最远的汽车,然后是较近的汽车。您可以尝试以下方法:

游戏逻辑:

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
    }
}
您还可以在Update void中调用OrderByDescending();这可能会更有效。但希望这能为你指明正确的方向。
HTH

您能添加
视图
投影
的声明吗?谢谢!它实际上解决了我的问题,但在更新显示的图像中,你可以看到我的问题仍然存在的部分。你先画哪一个,原语还是模型?窗口是否真的是透明的(例如,alpha设置为0),或者窗口是模型中的“孔”吗?首先,我绘制基本体,窗口不是孔。它的不透明度约为10%…尝试切换基本体和模型的绘制顺序。我认为本文将帮助您:我认为要解决窗口问题,您应该根据距离摄影机的距离对车辆进行排序,然后首先绘制最远的车辆,最后绘制最差的车辆。
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);
    }
}