Mayavi: BUG: Undurchsichtigkeit von Stromlinien, die mit der visuellen Anordnung von Visualisierungsmodulen interagieren

Erstellt am 6. März 2017  ·  10Kommentare  ·  Quelle: enthought/mayavi

Wenn Sie die Deckkraft der Stromlinien auf einen anderen Wert als den Standardwert (1.0) ändern, werden die Stromlinien in den Vordergrund der Szene gebracht, selbst wenn andere Objekte sie verdecken sollten.

Zum Beispiel verweise ich Sie auf das hier gegebene Beispiel einer magnetischen Feldlinie: http://docs.enthought.com/mayavi/mayavi/auto/example_magnetic_field_lines.html.

Das Ausführen des Codes wie er ist ergibt die folgende Szene:
test_bug_1

Wenn wir jedoch die Deckkraft der Feldlinien so ändern, dass sie sich von ihrem Standardwert von 1.0 unterscheidet (entweder durch Hinzufügen von field_lines.actor.property.opacity = 0.99 oder durch manuelles Anpassen der Deckkraft in der Mayavi-Pipeline), erhalten wir etwa die folgende Szene:
test_bug_2
Die Feldlinien befinden sich jetzt im Vordergrund der Szene, jedoch sollten die Isokonturen dann noch wie im vorherigen Bild verdecken.

Hilfreichster Kommentar

Mit neueren VTK-Versionen funktioniert das bei mir gut:

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

Außerdem gibt es ein f.scene.renderer.maximum_number_of_peels , das Sie möglicherweise verwenden könnten. Es ist standardmäßig 4, aber Sie können es ohne Begrenzung auf Null setzen, obwohl dies das Rendern verlangsamt. Daran könnte man basteln.

Darf ich dieses Thema schließen? Ich denke, dies scheint viele Probleme zu beheben, die ich zuvor gesehen habe.

Alle 10 Kommentare

Ist das ein Problem, das in naher Zukunft behoben werden kann? Wenn nicht, würde ich mich freuen, wenn ich es wüsste, damit ich einen anderen Weg zur Umgehung meines Problems finden kann. Dankeschön

Dies scheint auch für andere Objekte zu gelten. Ich verwende Kontur3d mit points3d und setze die Deckkraft der Punkte auf einen anderen Wert als 1,0, damit die Oberfläche sie nicht mehr verdeckt.

Ich sehe, was meiner Meinung nach das gleiche Problem mit zwei Points3D-Objekten ist. Hier sind einige Beispiele, die zeigen, wie das Aussehen von 2 gerenderten Kugeln von der Renderreihenfolge abhängt, wenn die Deckkraft auf .99 eingestellt ist, aber nicht, wenn die Deckkraft auf 1 eingestellt ist.

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

Das Problem scheint nicht von der Wahl der Lichter oder des light_manager ('vtk' oder 'raymond') abzuhängen.

Ich nehme an, eine Problemumgehung könnte darin bestehen, zuerst die zu rendernden Objekte nach ihrer Tiefe entlang einer Achse in den Bildschirm hinein oder aus ihm heraus zu sortieren.

Sie müssen wahrscheinlich die Front-Face-Culling-Option aktivieren. Versuche dies:

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

Danke Prabhu --- Ich denke, das frontface_culling hat die Grafik verbessert, aber die Rendering-Reihenfolge spielte nur im halbtransparenten Fall eine Rolle.

Ich habe diese Beobachtung allein in vtk reproduziert (es ist ein Problem auf niedrigerer Ebene).

Nach weiterem Lesen denke ich, dass es eine oder zwei in vtk integrierte Lösung gibt, aber eine andere Lösung könnte darin bestehen, die Objekte vor dem Rendern zu sortieren.

Hier sind ein paar Links zu vtk, die relevant erschienen:
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/CorrectlyRenderingTranslucentGeometry
https://www.vtk.org/Wiki/VTK/Depth_Peeling

Und ein paar Links, die ich zum Reproduzieren des Kugelgehäuses verwendet habe:
https://lorensen.github.io/VTKExamples/site/Python/GeometricObjects/Sphere/
https://www.vtk.org/Wiki/VTK/Examples/Cxx/Visualization/Opacity

Danke für die Diskussion und die hilfreichen Links. Ich kenne mich mit VTK oder Tiefenpeeling nicht sehr gut aus, aber eine einfache Lösung, die ich für mein ursprüngliches Beispiel und das Projekt, an dem ich arbeite, gefunden habe, war dies:

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

die ich aus dieser Frage zu einem ähnlichen Thema angepasst habe.

Danke für die Hilfe Matt und Prabhu.

Ich habe Depth_Peeling ausprobiert, was für meinen tatsächlichen Anwendungsfall hilfreicher ist als für dieses 2-Sphären-Beispiel. Aber verglichen mit der Neuordnung der Kugeln wirken die Kanten weniger ... Anti-Aliasing, denke ich, könnte der Begriff sein?

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

Für mein 3D-Plotting habe ich eine Liste von Punkten und eine Liste von Farben. Anstelle des Tiefenschälens habe ich diese Funktion verwendet, um diese Listen vor dem Plotten neu anzuordnen:

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]

Andernfalls könnte der sortierte Anruf ausreichen. Das habe ich aus den Python-Dokumenten gelernt: https://wiki.python.org/moin/HowTo/Sorting. Ich habe hier etwas über Pythons zip erfahren: https://stackoverflow.com/questions/1663807/how-can-i-iterate-through-two-lists-in-parallel

Mit neueren VTK-Versionen funktioniert das bei mir gut:

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

Außerdem gibt es ein f.scene.renderer.maximum_number_of_peels , das Sie möglicherweise verwenden könnten. Es ist standardmäßig 4, aber Sie können es ohne Begrenzung auf Null setzen, obwohl dies das Rendern verlangsamt. Daran könnte man basteln.

Darf ich dieses Thema schließen? Ich denke, dies scheint viele Probleme zu beheben, die ich zuvor gesehen habe.

Dankeschön. Damit werde ich arbeiten können. Sie können dieses Problem schließen.

Matthew Allcock | Doktorand
Universität Sheffield | Fakultät für Mathematik und Statistik
www.matthewallcock.co.uk

Am So, 26. August 2018, 21:55 Uhr Prabhu Ramachandran, [email protected]
schrieb:

Mit neueren VTK-Versionen funktioniert das bei mir gut:

von mayavi importieren mlab
f = mlab.figur()
mlab.points3d(0,0,1,Farbe=(.8,.8,.8),Auflösung=100,Opazität=.99)
mlab.points3d(0,0,0,Farbe=(.8,.8,.8),Auflösung=100,Opazität=.99)
f.scene.renderer.use_depth_peeling = True

Außerdem gibt es eine f.scene.renderer.maximum_number_of_peels, die Sie könnten
potentiell nutzen. Es ist standardmäßig 4, aber Sie können es für nein auf Null setzen
limit, obwohl dies das Rendern verlangsamt. Daran könnte man basteln.

Darf ich dieses Thema schließen? Ich denke, das scheint viele Probleme zu lösen, die ich habe
zuvor gesehen.


Sie erhalten dies, weil Sie den Thread verfasst haben.
Antworten Sie direkt auf diese E-Mail und zeigen Sie sie auf GitHub an
https://github.com/enthought/mayavi/issues/491#issuecomment-416071420 ,
oder den Thread stumm schalten
https://github.com/notifications/unsubscribe-auth/AP4RUC8AYAndDAV6-wE88hHw5cPP-x01gks5uUwtGgaJpZM4MT7Rp
.

Vielen Dank.

War diese Seite hilfreich?
0 / 5 - 0 Bewertungen

Verwandte Themen

yassersouri picture yassersouri  ·  5Kommentare

aestrivex picture aestrivex  ·  9Kommentare

Make42 picture Make42  ·  7Kommentare

dnacombo picture dnacombo  ·  7Kommentare

ktavabi picture ktavabi  ·  15Kommentare