Mayavi: BUG : Opacité des lignes de courant interagissant avec l'ordre visuel des modules de visualisation

Créé le 6 mars 2017  ·  10Commentaires  ·  Source: enthought/mayavi

Changer l'opacité des lignes de courant à autre chose que sa valeur par défaut (1,0) amène les lignes de force au premier plan de la scène même lorsqu'il y a d'autres objets qui devraient les obscurcir.

Par exemple, je vous renvoie à l'exemple de ligne de champ magnétique donné ici : http://docs.enthought.com/mayavi/mayavi/auto/example_magnetic_field_lines.html.

L'exécution du code tel quel donne la scène suivante :
test_bug_1

Cependant, si nous modifions l'opacité des lignes de champ afin qu'elle soit différente de sa valeur par défaut de 1.0 (soit en ajoutant field_lines.actor.property.opacity = 0.99 soit en ajustant manuellement l'opacité dans le pipeline Mayavi), nous obtenons quelque chose comme la scène suivante :
test_bug_2
Les lignes de champ sont maintenant au premier plan de la scène, cependant les isocontours devraient encore s'obscurcir comme dans l'image précédente.

Commentaire le plus utile

Avec les versions récentes de VTK, cela fonctionne bien pour moi :

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

En outre, il existe un f.scene.renderer.maximum_number_of_peels que vous pourriez potentiellement utiliser. C'est 4 par défaut mais vous pouvez le mettre à zéro pour aucune limite bien que cela ralentisse le rendu. Vous pourriez bricoler avec ça.

Puis-je clore ce problème ? Je pense que cela semble résoudre de nombreux problèmes que j'ai déjà vus.

Tous les 10 commentaires

Est-ce un problème qui sera résolu dans un futur proche ? Sinon, j'apprécierais de le savoir afin que je puisse trouver un autre moyen de contourner mon problème. Merci

Cela semble s'appliquer également à d'autres objets. J'utilise contour3d avec points3d et en définissant l'opacité des points sur autre chose que 1,0, la surface ne les obscurcit plus.

Je vois ce que je pense être le même problème avec deux objets points3d. Voici quelques exemples montrant comment l'apparence de 2 sphères rendues dépend de l'ordre de rendu si l'opacité est définie sur 0,99, mais pas si l'opacité est définie sur 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

Le problème ne semble pas dépendre du choix de lights ou light_manager ('vtk' ou 'raymond').

Je suppose qu'une solution de contournement peut être de trier d'abord les objets à rendre par leur profondeur le long d'un axe dans ou hors de l'écran.

Vous devez probablement activer l'option d'élimination frontale. Essaye ça:

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

Merci Prabhu --- Je pense que le frontface_culling a amélioré les visuels, mais l'ordre de rendu n'était toujours un facteur que dans le cas semi-transparent.

J'ai reproduit cette observation dans vtk seul (c'est un problème de niveau inférieur).

Après plus de lecture, je pense qu'il existe une ou deux solutions intégrées à vtk, mais une autre solution peut consister à trier les objets avant le rendu.

Voici quelques liens sur vtk qui semblaient pertinents :
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CorrectlyRenderingTranslucentGeometry
https://www.vtk.org/Wiki/VTK/Depth_Peeling

Et quelques liens que j'ai utilisés pour reproduire le cas de la sphère :
https://lorensen.github.io/VTKExamples/site/Python/GeometricObjects/Sphere/
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/Opacity

Merci d'avoir enrichi la discussion et pour les liens utiles. Je ne connais pas très bien le VTK ou le peeling en profondeur, mais une solution simple que j'ai trouvée qui a fonctionné pour mon exemple d'origine et le projet sur lequel je travaille consistait à inclure ceci:

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

que j'ai adapté de cette question sur un problème similaire ..

Merci pour l'aide Matt et Prabhu.

J'ai essayé depth_peeling, qui pour mon cas d'utilisation actuel est plus utile que pour cet exemple à 2 sphères. Mais par rapport à la réorganisation des sphères, les bords semblent moins... anti-aliasés, je pense que pourrait être le terme ?

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

Pour mon traçage 3D, j'ai une liste de points et une liste de couleurs. Ainsi, au lieu d'un épluchage en profondeur, j'ai utilisé cette fonction pour réorganiser ces listes avant de tracer :

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]

Sinon, l'appel trié pourrait suffire. J'ai appris cela grâce à la documentation Python : https://wiki.python.org/moin/HowTo/Sorting. J'ai découvert les zip de python ici : https://stackoverflow.com/questions/1663807/how-can-i-iterate-through-two-lists-in-parallel

Avec les versions récentes de VTK, cela fonctionne bien pour moi :

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

En outre, il existe un f.scene.renderer.maximum_number_of_peels que vous pourriez potentiellement utiliser. C'est 4 par défaut mais vous pouvez le mettre à zéro pour aucune limite bien que cela ralentisse le rendu. Vous pourriez bricoler avec ça.

Puis-je clore ce problème ? Je pense que cela semble résoudre de nombreux problèmes que j'ai déjà vus.

Merci. Je vais pouvoir travailler avec ça. Vous pouvez fermer ce problème.

Matthieu Allcock | Chercheur doctorant
Université de Sheffield | École de mathématiques et de statistique
www.matthewallcock.co.uk

Le dimanche 26 août 2018, 21:55 Prabhu Ramachandran, [email protected]
a écrit:

Avec les versions récentes de VTK, cela fonctionne bien pour moi :

de mayavi importer mlab
f = mlab.figure()
mlab.points3d(0,0,1,couleur=(.8,.8,.8),résolution=100,opacité=.99)
mlab.points3d (0,0,0,couleur=(.8,.8,.8),résolution=100,opacité=.99)
f.scene.renderer.use_depth_peeling = Vrai

En outre, il existe un f.scene.renderer.maximum_number_of_peels que vous pouvez
potentiellement utiliser. C'est 4 par défaut mais vous pouvez le mettre à zéro pour non
limite bien que cela ralentisse le rendu. Vous pourriez bricoler avec ça.

Puis-je clore ce problème ? Je pense que cela semble résoudre de nombreux problèmes que j'ai
Déjà vu.

-
Vous recevez ceci parce que vous avez créé le fil.
Répondez directement à cet e-mail, consultez-le sur GitHub
https://github.com/enthought/mayavi/issues/491#issuecomment-416071420 ,
ou couper le fil
https://github.com/notifications/unsubscribe-auth/AP4RUC8AYAnDAV6-wE88hHw5cPP-x01gks5uUwtGgaJpZM4MT7Rp
.

Grand merci.

Cette page vous a été utile?
0 / 5 - 0 notes

Questions connexes

indranilsinharoy picture indranilsinharoy  ·  9Commentaires

thoth291 picture thoth291  ·  10Commentaires

relyativist picture relyativist  ·  16Commentaires

aestrivex picture aestrivex  ·  9Commentaires

PennyQ picture PennyQ  ·  4Commentaires