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:
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:
Die Feldlinien befinden sich jetzt im Vordergrund der Szene, jedoch sollten die Isokonturen dann noch wie im vorherigen Bild verdecken.
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)
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)
mlab.figure()
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100)
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100)
mlab.figure()
mlab.points3d(0,0,0,color=(.8,.8,.8),resolution=100)
mlab.points3d(0,0,1,color=(.8,.8,.8),resolution=100)
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
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 = TrueAuß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.
Hilfreichster Kommentar
Mit neueren VTK-Versionen funktioniert das bei mir gut:
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.