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

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

На всякий случай это помогает, вот мой 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 сортировкой треугольников, как Ray Burns предположил.

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

6
задан Dave Clemmer 17 September 2011 в 00:43
поделиться

1 ответ

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

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

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

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

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

Вот мои идеи:

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

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

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

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

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

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

6
ответ дан 17 December 2019 в 02:28
поделиться
Другие вопросы по тегам:

Похожие вопросы: