Проблема перекрытия треугольника WPF 3D

Я рендеринг сцены с WPF 3D, сделав MeshGeometry3D и добавив к нему вершины и нормали. Все выглядит хорошо в визуализированной сцене (свет есть, материал выглядит отлично), но там, где сетчатые треугольники перекрываются, треугольник ближе к камере не обязательно отображается сверху. Похоже, их рисуют в случайном порядке. Есть ли способ убедиться, что треугольники сетки отображаются в "правильном" порядке?

на всякий случай, если это поможет, вот мой XAML:

<Viewport3D>
    <ModelVisual3D>
        <ModelVisual3D.Content>
            <Model3DGroup>
                <AmbientLight Color="#FF5A5A5A" />
                <GeometryModel3D x:Name="geometryModel">
                    <GeometryModel3D.Material>
                         <DiffuseMaterial Brush="DarkRed"/>
                    </GeometryModel3D.Material>
                </GeometryModel3D>
             </Model3DGroup>
         </ModelVisual3D.Content>
     </ModelVisual3D>
 </Viewport3D>

и в коде я генерирую сетку примерно так:

var mesh = new MeshGeometry3D();

foreach (var item in objectsToTriangulate) {
    var triangles = item.Triangulate();
    foreach (var triangle in triangles) {
        mesh.Positions.Add(triangle.Vertices[0]);
        mesh.Positions.Add(triangle.Vertices[1]);
        mesh.Positions.Add(triangle.Vertices[2]);
        mesh.Normals.Add(triangle.Normal);
        mesh.Normals.Add(triangle.Normal);
        mesh.Normals.Add(triangle.Normal);
    }
}

geometryModel.Geometry = mesh;

EDIT: ни один из треугольников не пересекается (кроме краев), и иногда треугольник, который появляется сверху, на самом деле намного отстает от другого, поэтому я не думаю, что это двусмысленность с 3D-сортировкой треугольников, как предложил Рэй Бернс.

другое поведение, которое я заметил, заключается в том, что порядок отображения треугольников, похоже, не меняется при перемещении вокруг сцены. Т. е. если я просматриваю проблемную область с другой стороны, треугольники отображаются в том же, теперь "правильном", порядке.

1 ответов


в WPF, как и в большинстве 3D-систем, делается упрощающее предположение, что любой данный треугольник предполагается лежать полностью перед или полностью позади любого другого данного треугольника. Но на самом деле это не всегда так. В частности, если два треугольника пересекаются по их интерьеров (не только по краям) и не смотреть на нее вдоль их линии intesection, точный перевод будет рисовать каждый треугольник для передней части просмотра.

из-за этого предположение, 3D-движки сортируют треугольники, считая, что весь треугольник находится на определенном расстоянии от камеры. Он может выбрать ближайший угол треугольника, самый дальний угол, усреднить углы или использовать какой-либо другой алгоритм, но в конце концов он выбирает репрезентативную точку для вычисления порядка Z.

Я предполагаю, что ваши треугольники структурированы таким образом, что репрезентативная точка используется для вычисления порядка Z вызывает их отображение в неожиданном порядок.

редактировать

из информации, которую вы предоставляете в своем редактировании, я вижу, что моя первая догадка была неправильной. Я оставлю его на случай, если он пригодится кому-то еще, и дам еще несколько идей, которые у меня были. Надеюсь, кто-нибудь еще сможет позвонить сюда. У меня никогда не было такой проблемы с глубиной, поэтому все это просто образованные догадки.

вот мои идеи:

  1. возможно, ваш BackMaterial не установлен или прозрачный, заставляя вас видеть только треугольники, порядок намотки которых по часовой стрелке с вашей точки зрения. В зависимости от вашей фактической сетки отсутствующие невидимые треугольники могут показаться, что те, которые находятся сзади, перекрывают их, когда на самом деле они просто видны через них. Это также может произойти, если ваш материал не был установлен или был прозрачным.

  2. Что-то явно определяет порядок отображения треугольников. Может, это приказ? из массива TriangleIndices? Если вы случайно переупорядочиваете массив TriangleIndices (в наборах из трех, конечно) без каких-либо других изменений, меняет ли он отображение? Если это так, вы узнали что-то о проблеме и, возможно, нашли обходной путь (если он использует порядок TriangleIndices, вы можете сделать сортировку самостоятельно).

  3. Если вы используете ProjectionCamera или OrthoGraphicCamera, установлены ли NearPlaneDistance и FarPlaneDistance соответствующим образом? Зло NearPlaneDistance особенно может сделать треугольники ближе к вам невидимыми, делая вид, что треугольники дальше на самом деле рисуются сверху. Неправильные расстояния также могут повлиять на гранулярность буфера глубины, что может дать вам эффект, который вы испытываете.

  4. ваша модель очень большая или очень маленькая? Если вы масштабируете модель и положение камеры, имеет ли это значение? Буферы глубины обычно представляют собой 32-битные целые числа, поэтому возможно, в чрезвычайно крошечных моделях два треугольника округляются до одного и того же значения буфера глубины. Это также вызовет эффект, который вы описываете.

  5. возможно, вы столкнулись с ошибкой. Вы можете попробовать некоторые изменения, чтобы увидеть, влияют ли они на проблему, например, вы можете попробовать рендеринг только для программного обеспечения, разные типы освещения (диффузный против зеркального и т. д.), разные типы камер, графическую карту от другого поставщика и т. д.

I надеюсь, некоторые из этих идей помогут.