Estoy representando una escena con WPF 3D haciendo un MeshGeometry3D y añadiéndole vértices y normales. Todo se ve bien en la escena renderizada (las luces están allí, el material se ve bien), pero cuando los triángulos de malla se superponen, el triángulo más cercano a la cámara no se representa necesariamente en la parte superior. Parece que están siendo dibujados en un orden aleatorio. ¿Hay alguna forma de garantizar que los triángulos de malla se representan en el orden "correcto"?WPF Problema de superposición de triángulos 3D
Sólo en caso de que ayuda, aquí está mi 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>
y en el código, yo estoy generando el algo similar a una malla esto:
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: Ninguno de los triángulos se cruzan (excepto en los bordes), y algunas veces el triángulo que aparece en la parte superior está MUY BIEN detrás del otro, así que no creo que sea una ambigüedad con la clasificación 3D de los triángulos, como ha sugerido Ray Burns.
El otro comportamiento que he notado es que el orden en que se representan los triángulos no parece cambiar a medida que avanzo por la escena. Es decir. si veo un área problemática desde el otro lado, los triángulos se renderizan en el mismo orden, ahora "correcto".
Gracias por la ayuda. No creo que este sea el problema, como expliqué en una edición de la pregunta. ¿Alguna idea más? Acerca de su nota al margen: soy consciente de la capacidad de especificar vértices únicos y luego invocar 'TriangleIndices.Add (...)', pero no lo he hecho porque quiero que todas mis facetas de malla tengan su propios Normals (generalmente estoy renderizando elementos con superficies planas y no quiero una malla lisa). ¿Es malo tener vértices duplicados, o no hay nada que hacer, dado mi deseo de diferentes normales? –
Saqué el comentario sobre compartir vértices, ya que tienes razón sobre la necesidad de tener vértices separados si quieres controlar las normales. También agregué varias otras ideas que tenía. Esperemos que alguien más toque aquí también. –
Bueno, ¡el # 3 lo era! Tenía mi NearPlaneDistance configurado en 0, y supongo que eso hace que WPF sea más informal con el buffer de profundidad. Establecerlo en 0.5 hace que todo se vea bien. ¡Muchas gracias por toda la ayuda! –