2010-01-25 18 views
6

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".

Respuesta

6

En WPF, como en la mayoría de los sistemas 3D, se hace una suposición simplificadora de que se supone que un triángulo dado se encuentra completamente delante o completamente detrás de cualquier otro triángulo dado. Pero, de hecho, este no es siempre el caso. Específicamente, si dos triángulos se cruzan a lo largo de sus interiores (no solo en sus bordes) y no se ven a lo largo de su línea de intersección, una representación precisa pintaría el frente de cada triángulo para una parte de la ventana gráfica.

Debido a esta suposición, los motores 3D ordenan triángulos al considerar que el triángulo entero está a cierta distancia de la cámara. Puede elegir la esquina más cercana al triángulo, la esquina más alejada, promediar las esquinas o usar algún otro algoritmo, pero al final selecciona un punto representativo para calcular Z Order.

Supongo que sus triángulos están estructurados de forma tal que el punto representativo se usa para calcular Z. El orden hace que se muestren en un orden inesperado.

Editar

A partir de la información que proporcione en su edición, puedo ver que mi primera suposición era errónea. Lo dejaré en caso de que sea útil para otra persona, y daré algunas ideas más que he tenido. Con suerte, alguien más puede sonar aquí. Nunca tuve este tipo de problema de profundidad, así que estas son solo conjeturas.

Estas son mis ideas:

  1. Puede ser que su BackMaterial no se establece o transparente, provocando que se ve sólo triángulos cuyos orden de liquidación es en sentido horario desde su punto de vista. Dependiendo de su malla real, los triángulos invisibles que faltan podrían hacer parecer que los que están en la parte trasera se superponen cuando en realidad son simplemente visibles a través de ellos. Esto también podría suceder si su Material no estaba configurado o era transparente.

  2. Algo está determinando claramente el orden en que se muestran los triángulos. ¿Podría ser el orden de su matriz TriangleIndices? Si reordena aleatoriamente la matriz TriangleIndices (en conjuntos de tres por supuesto) sin realizar ningún otro cambio, ¿cambia la visualización?Si es así, has aprendido algo sobre el problema y quizás hayas encontrado una solución (si usas el orden TriangleIndices, puedes hacer la clasificación tú mismo).

  3. Si está utilizando ProjectionCamera u OrthoGraphicCamera, ¿NearPlaneDistance y FarPlaneDistance están configurados correctamente? Una NearPlaneDistance incorrecta especialmente podría hacer que los triángulos más cercanos a usted sean invisibles, haciendo que parezca que los triángulos más alejados están siendo dibujados en la parte superior. Las distancias incorrectas también podrían afectar la granularidad del buffer de profundidad, lo que podría darle el efecto que está experimentando.

  4. ¿Su modelo es extremadamente grande o extremadamente pequeño? Si escala el modelo y la posición de la cámara, ¿hace una diferencia? Los búferes de profundidad generalmente son enteros de 32 bits, por lo que es posible en modelos extremadamente pequeños tener dos triángulos redondeados al mismo valor de búfer de profundidad. Esto también causaría el efecto que describes.

  5. Es posible que se encuentre con un error. Puede probar algunos cambios para ver si afectan el problema, por ejemplo, puede intentar renderizar solo software, diferentes tipos de iluminación (difusa vs especular, etc.), diferentes tipos de cámara, una tarjeta gráfica de un proveedor diferente, etc.

Espero que algunas de estas ideas ayuden.

+0

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? –

+0

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. –

+0

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! –

Cuestiones relacionadas