WPF 3D проблема перекрытия треугольников - PullRequest
6 голосов
/ 25 января 2010

Я рендерил сцену в 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;

РЕДАКТИРОВАТЬ: Ни один из треугольников не пересекается (за исключением краев), и иногда треугольник, который появляется сверху, на самом деле ПУТЬ позади другого, поэтому я не думаю, что это двусмысленность с 3D-сортировкой треугольников как предположил Рэй Бернс.

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

1 Ответ

6 голосов
/ 26 января 2010

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

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

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

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

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

Вот мои идеи:

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...