Mayavi: ERROR: Opacidad de las líneas de flujo que interactúan con el orden visual de los módulos de visualización

Creado en 6 mar. 2017  ·  10Comentarios  ·  Fuente: enthought/mayavi

Cambiar la opacidad de las líneas de corriente a cualquier otro valor que no sea su valor predeterminado (1.0) trae las líneas de corriente al frente de la escena incluso cuando hay otros objetos que deberían oscurecerlas.

Por ejemplo, le remito al ejemplo de línea de campo magnético que se da aquí: http://docs.enthought.com/mayavi/mayavi/auto/example_magnetic_field_lines.html.

Ejecutar el código tal como está da la siguiente escena:
test_bug_1

Sin embargo, si cambiamos la opacidad de las líneas de campo para que sea diferente a su valor predeterminado de 1.0 (ya sea agregando field_lines.actor.property.opacity = 0.99 o ajustando manualmente la opacidad en la tubería de Mayavi) obtenemos algo como la siguiente escena:
test_bug_2
Las líneas de campo están ahora al frente de la escena, sin embargo, los isocontornos aún deberían oscurecerse como en la imagen anterior.

Comentario más útil

Con las versiones recientes de VTK, esto funciona bien para mí:

from mayavi import mlab
f = mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
f.scene.renderer.use_depth_peeling = True

Además, hay un f.scene.renderer.maximum_number_of_peels que podría usar potencialmente. Es 4 de forma predeterminada, pero puede establecerlo en cero sin límite, aunque esto ralentizará el renderizado. Podrías jugar con esto.

¿Puedo cerrar este problema? Creo que esto parece solucionar muchos problemas que he visto antes.

Todos 10 comentarios

¿Es este un problema que se solucionará en un futuro próximo? Si no es así, agradecería saberlo para poder encontrar otra forma de solucionar mi problema. Gracias

Esto parece aplicarse también a otros objetos. Estoy usando contour3d con points3d y establecer la opacidad de los puntos en cualquier otro valor que no sea 1.0 hace que la superficie ya no los oscurezca.

Veo lo que creo que es el mismo problema con dos objetos points3d. Aquí hay algunos ejemplos que muestran cómo la apariencia de 2 esferas renderizadas depende del orden de renderización si la opacidad se establece en .99, pero no si la opacidad se establece en 1.

mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)

2

mlab.figure()
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)

4

mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100)

1

mlab.figure()
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100)
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100)

3

El problema no parece depender de la elección de luces o light_manager ('vtk' o 'raymond').

Supongo que una solución puede ser primero ordenar los objetos que se van a renderizar por su profundidad a lo largo de un eje dentro o fuera de la pantalla.

Probablemente necesite activar la opción de selección de la cara frontal. Prueba esto:

mlab.figure()
g1 = mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
g2 = mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
g1.actor.property.frontface_culling = True
g2.actor.property.frontface_culling = True

Gracias Prabhu --- Creo que frontface_culling mejoró las imágenes, pero el orden de renderizado todavía era un factor solo en el caso semitransparente.

Reproduje esa observación solo en vtk (es un problema de nivel inferior).

Después de leer más, creo que hay una solución o dos integradas en vtk, pero otra solución puede ser ordenar los objetos antes de renderizar.

Aquí hay un par de enlaces sobre vtk que parecían relevantes:
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CorrectlyRenderingTranslucentGeometry
https://www.vtk.org/Wiki/VTK/Depth_Peeling

Y un par de enlaces que utilicé para reproducir el caso de la esfera:
https://lorensen.github.io/VTKExamples/site/Python/GeometricObjects/Sphere/
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/Opacity

Gracias por participar en la discusión y por los útiles enlaces. No tengo mucho conocimiento sobre VTK o peeling en profundidad, pero una solución simple que encontré que funcionó para mi ejemplo original y el proyecto en el que estoy trabajando fue incluir esto:

scene = mlab.gcf().scene
scene.renderer.set(use_depth_peeling=True)

que adapté de esta pregunta sobre un tema similar.

Gracias por la ayuda Matt y Prabhu.

Probé depth_peeling, que para mi caso de uso real es más útil que para este ejemplo de 2 esferas. Pero en comparación con reordenar las esferas, los bordes parecen menos ... suavizados, creo que podría ser el término.

f=mlab.figure()
f.scene.renderer.use_depth_peeling=1
g0=mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
g1=mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)  
g0.actor.property.frontface_culling = True
g1.actor.property.frontface_culling = True

image

Para mi trazado en 3D, tengo una lista de puntos y una lista de colores. Entonces, en lugar de pelar en profundidad, usé esta función para reordenar esas listas juntas antes de trazar:

def orderTransparentRender(cl,c):
    '''Opacity < 1 rendering results in appearance of spheres incorrectly in front of or behind other spheres
    One solution is setting f.scene.renderer.use_depth_peeling=1, however this seemed to result in less anti-aliased edges?
    This function sorts the cluster list cl and color list c together.
    '''
    cz=zip(cl,c)
    cz=sorted(cz,key=lambda x:-1*x[0][2])
    cz=zip(*cz)
    return cz[0],cz[1]

De lo contrario, la llamada ordenada podría ser todo lo que se necesita. Aprendí eso de los documentos de Python: https://wiki.python.org/moin/HowTo/Sorting. Aprendí sobre zip Python aquí: https://stackoverflow.com/questions/1663807/how-can-i-iterate-through-two-lists-in-parallel

Con las versiones recientes de VTK, esto funciona bien para mí:

from mayavi import mlab
f = mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100,opacity=.99)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100,opacity=.99)
f.scene.renderer.use_depth_peeling = True

Además, hay un f.scene.renderer.maximum_number_of_peels que podría usar potencialmente. Es 4 de forma predeterminada, pero puede establecerlo en cero sin límite, aunque esto ralentizará el renderizado. Podrías jugar con esto.

¿Puedo cerrar este problema? Creo que esto parece solucionar muchos problemas que he visto antes.

Gracias. Podré trabajar con esto. Puede cerrar este problema.

Matthew Allcock | Investigador de doctorado
Universidad de Sheffield | Escuela de Matemáticas y Estadística
www.matthewallcock.co.uk

El domingo 26 de agosto de 2018 a las 21:55 Prabhu Ramachandran, [email protected]
escribió:

Con las versiones recientes de VTK, esto funciona bien para mí:

de mayavi import mlab
f = mlab.figure ()
mlab.points3d (0,0,1, color = (. 8, .8, .8), resolución = 100, opacidad = .99)
mlab.points3d (0,0,0, color = (. 8, .8, .8), resolución = 100, opacidad = .99)
f.scene.renderer.use_depth_peeling = Verdadero

Además, hay un f.scene.renderer.maximum_number_of_peels que podrías
potencialmente uso. Es 4 de forma predeterminada, pero puede establecerlo en cero para no
límite aunque esto ralentizará el renderizado. Podrías jugar con esto.

¿Puedo cerrar este problema? Creo que esto parece solucionar muchos problemas que tengo.
visto antes.

-
Recibes esto porque eres el autor del hilo.
Responda a este correo electrónico directamente, véalo en GitHub
https://github.com/enthought/mayavi/issues/491#issuecomment-416071420 ,
o silenciar el hilo
https://github.com/notifications/unsubscribe-auth/AP4RUC8AYAnDAV6-wE88hHw5cPP-x01gks5uUwtGgaJpZM4MT7Rp
.

Muchas gracias.

¿Fue útil esta página
0 / 5 - 0 calificaciones