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