Почему XNA рисует модели в порядке создания?

Я собираюсь смоделировать движение автомобилей по дорожной сети. Сначала я рисую дороги с помощью userindexedprimitives, и это работает нормально. После этого в определенные моменты добавляю моделей на сцену. Эти модели передвигаются по дороге, и вроде бы все в порядке. Глядя на них сзади, выглядит хорошо, потому что они следуют друг за другом примерно в порядке создания. Но при виде спереди приложение всегда отрисовывает последний добавленный автомобиль первым и т. д., поэтому они отрисовываются друг на друге, покрытия нет. Возможно, его можно узнать на изображении (ссылка удалена, см. обновление). Я использую файл эффекта ЭТО, а 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 это лучше, но на ЭТОМ новом изображении проблема видно... через очки машины мы можем видеть только вершины, нарисованные пользовательскими индексированными примитивами, а не модели.


person sbuci    schedule 17.08.2013    source источник
comment
Можете ли вы добавить объявление View и Projection?   -  person pinckerman    schedule 17.08.2013


Ответы (1)


Я думаю, одна вещь, которая может быть причиной вашей проблемы, заключается в том, установлен ли ваш GraphicsDevice.RenderState.DepthBufferEnable на true. (Если вы рисуете пакеты спрайтов, скорее всего, проблема именно в этом.) Я бы проверил это, потому что у меня была аналогичная проблема с рисованием, и установка GraphicsDevice.RenderState.DepthBufferEnable на true при каждом рисовании (до того, как я рисовал модели) устранила проблему. Если вы используете 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);
    }
}

Вы также можете вызвать OrderByDescending() в Update void; это, вероятно, будет более эффективным. Но, надеюсь, это укажет вам правильное направление. ХТН

person davidsbro    schedule 17.08.2013
comment
Спасибо! На самом деле это решает мою проблему наполовину, но на показанном изображении обновления вы можете увидеть все еще существующую часть моей проблемы. - person sbuci; 18.08.2013
comment
Что вы рисуете первым, примитивы или модели? И действительно ли окно чистое (например, альфа установлена ​​на 0), или окно является дырой в модели? - person davidsbro; 19.08.2013
comment
Сначала я рисую примитивы, и окно не дыра. Его непрозрачность составляет около 10%... - person sbuci; 26.08.2013
comment
Попробуйте поменять порядок прорисовки примитивов и моделей. - person davidsbro; 26.08.2013
comment
Я думаю, что эта статья поможет вам: blogs.msdn.com/b/shawnhar/archive/2009/02/18/ Я считаю, что для решения вашей проблемы с окнами вы должны отсортировать свои автомобили по расстоянию от камеры, а затем нарисовать самый дальний автомобили первыми, а потерянный автомобиль последним. - person davidsbro; 26.08.2013
comment
На самом деле я еще пробовал, но результат сбивает с толку. Примитивы (дорожная сеть) всегда ДВИЖУТСЯ относительно последней созданной машины и становятся белыми. - person sbuci; 26.08.2013
comment
Спасибо, попробую описанный в статье способ, надеюсь поможет! - person sbuci; 26.08.2013
comment
Я отредактировал свой ответ, чтобы попытаться ответить на остальную часть вашего вопроса. - person davidsbro; 26.08.2013
comment
Ваше обновление - отличная идея! Я пробовал спускаться и подниматься тоже, и работает, но расстояния, которые я оцениваю, кажутся неверными. Через окна транспортные средства, расположенные на одном и том же расстоянии, видны только выборочно :D Моей лучшей идеей было проецировать/не проецировать вектор положения, но это не идеально. - person sbuci; 30.08.2013