Langsame 3D Rotation mit Antialiasing in Mathematica 7

8

3D-Oberflächenrotation in Mathematica 7 mit deaktiviertem Anti-Aliasing ist sehr schnell und glatt. Das Aktivieren von Anti-Aliasing, selbst bei einem moderaten Pegel, reduziert jedoch die wiedergegebene Bildrate drastisch, wodurch die Drehung sehr unruhig wird. Dies geschieht in Mathematica viel stärker als in anderen 3D-Anwendungen.

  1. Warum ist das Anti-Aliasing in Mathematica ungleich langsamer?

  2. Eine Möglichkeit, das Gefühl von 3D-Grafiken zu verbessern, wäre AA während der Rotation auszuschalten, aber sobald die Rotation gestoppt ist, schalten Sie es ein. Kann dies in Mathematica 7 gemacht werden?

Ein Beispiel wurde angefordert. Ich werde eine Variation von Mike's Code verwenden. Bitte versuchen Sie Folgendes mit Edit > Preferences > Appearance > Graphics zuerst auf No antialiasing und dann auf Highest quality . Probieren Sie auch die Einstellungen dazwischen. Für mich ist jede Einstellung außer No antialiasing nicht glatt. Ich kann drei verschiedene Ebenen von AA visuell unterscheiden, also ist es keine Angelegenheit meiner GPU, alle oder keine zu zwingen, aber alle sind langsam.

%Vor%

UPDATE und BEOBACHTUNG

Als wir mit Alexey und Mikes Code herumspielten, passierte etwas Seltsames und Gutes. Ich habe plötzlich glatte Antialiased Rotation! Ich weiß nicht, was die Veränderung ausgelöst hat, und ich habe Mathematica nicht geschlossen, aus Angst, dass es weggehen wird, aber das beweist, was ich vermutet habe, dass es schnell sein kann.

Komischer, ich habe das langsame und schnelle Verhalten parallel im selben Notebook. Eine Grafik rotiert reibungslos und eine andere, die mit demselben Code erzeugt wird, ist abgehackt. Ich theoretisiere, dass einige Zellenoptionen durch Ausführen von Alexey und Mikes Code geändert wurden, und es hat einen sehr erwünschten Effekt. Ich werde mein Bestes tun, um herauszufinden, was es ist.

Die hilfreichen Optionen waren RotationAction -> "Clip", SphericalRegion -> True , die übrigens in Alexeys Code auftraten. Diese oder ihr Effekt ( ViewAngle ) "klebt" mit einer Grafik auf die gleiche Weise wie die Rotation, daher konnte ich neuen Code ohne diese Optionen über den alten eingeben und ausführen und trotzdem die glatte Drehung erhalten (was erklärt, was ich oben gesehen habe). Siehe die Antworten unten für einige Ausführungen.

Obwohl ein praktikabler Workaround gefunden wurde, bin ich immer noch an einer Erklärung für die abgehackte Rotation mit AA interessiert. Ich glaube nicht, dass das "Anpassen" der Grafik eine Erklärung ist, sondern lediglich eine Korrelation, da die Anpassung immer noch mit AA aus erfolgen muss, und trotzdem ist die Rotation glatt.

    
Mr.Wizard 21.08.2011, 08:21
quelle

5 Antworten

2

Ich habe für meine Konfiguration scheinbar eine magische Option entdeckt, die eine glatte 3D-Rotation mit vollem Antialiasing ermöglicht. Dies funktioniert für jeden 3D-Plot-Typ, den ich ausprobiert habe. Wenn das also nicht magisch aufhört zu arbeiten, habe ich meine Lösung. Ich bin sehr interessiert zu wissen, ob dies auf andere Systeme die gleiche Wirkung hat.

Die magische Option ist ViewAngle . Jeder numerische Wert scheint zu funktionieren; Automatic nicht.

Wenn Sie den folgenden Code auswerten, rotiert die erste Grafik schlecht und die zweite Grafik dreht sich gleichmäßig.

%Vor%

Ich habe ein Problem mit Mikes RotationAction -> "Clip" -Methode, da ich beim Drehen der Grafik unerwartete und manchmal extreme Beschneidungen erhalte. Das Hinzufügen von SphericalRegion -> True stellt jedoch das Verhalten wieder her, das ich mit ViewAngle erhalte, und der Winkel wird automatisch gewählt:

%Vor%     
Mr.Wizard 22.08.2011, 08:02
quelle
7

Nachdem Mr. Wizard darauf hingewiesen hat, dass das Ändern des ViewAngle die Leistung verbessert hat, hatte ich eine Ahnung, was das verursacht hat.

Wenn Sie Grafiken in Mathematica drehen, werden Sie feststellen, dass die Größe der Grafik, die die Grafik enthält, sich ändert, wenn das Bild gedreht wird. Warum? Die meisten Einstellungen sind auf den Standard Automatic eingestellt, also versuchen sie herumzuhüpfen, damit die Grafiken gut auf dem Bildschirm passen. Insbesondere haben Plot3D (und viele andere 3D Plot -Funktionen) einen benannten Parameter namens RotationAction . Laut der Mathematica-Dokumentation :

  

3D-Grafiken werden standardmäßig verkleinert und verschoben, um sie anzupassen, wenn sie interaktiv gedreht werden

Dieser Parameter ist standardmäßig auf RotationAction->"Fit" eingestellt. Dadurch wird immer sichergestellt, dass die gesamte 3D-Grafik auf den Bildschirm passt. Stattdessen können Sie die Grafik mit RotationAction->"Clip" zum Abschneiden zwingen. Dies bewirkt, dass die Bounding Box gleich bleibt. Anstatt die Größe zu ändern, hackt es nur ab, was vom Bildschirm verschwindet. Die Leistung wird verbessert, da Mathematica das Bild nicht ständig neu gestalten muss, um alles auf dem Bildschirm zu sehen.

Beispielcode:

%Vor%

Einige weitere Hinweise

Bei weiterer Analyse hat RotationAction->"Clip" anfangs Probleme mit der Rotation. Bei der ersten Rotation der Grafik dreht es sich extrem schnell. Ich weiß nicht, warum das so ist, nur Wolfram Research könnte das beantworten. Nach der anfänglichen Drehung rotiert es jedoch mit der normalen Geschwindigkeit wie jede andere Grafik.

Die glatteste Art, eine schöne Rotation für mich zu erreichen, wurde gegeben durch:

%Vor%

Dies ist so nah wie möglich an der Standard-Clipping-Lautstärke, ohne irgendwelche seltsamen Probleme mit schnellen Rotationen oder abgeschnittenen Grafiken.

    
Mike Bailey 22.08.2011 08:16
quelle
3

Vielleicht kann sich jemand anderes mit Mouseover etwas Kluges einfallen lassen. Dies funktioniert, indem ein anderer Ausdruck angezeigt wird, wenn sich die Maus über dem angezeigten Objekt befindet oder nicht; versuche dies zu sehen:

%Vor%

Leider habe ich keine Ahnung, wie man das Antialiasing ein- und ausschalten kann, noch weiß ich, wie man etwas wie Plot[f,range,Option->Mouseover[1,2]] macht.

Das Problem scheint zu sein, dass Mouseover nicht auf verschiedene Dinge auswertet, wenn der Cursor sich nicht darüber befindet, sondern verschiedene Dinge anzeigt- -oder so sieht es aus.

Vielleicht kann jemand, der dynamische Konstrukte besser versteht, herausfinden, wie man die Infrastruktur benutzt, die Mouseover ihr Problem lösen lässt.

    
acl 21.08.2011 13:10
quelle
3

Nach Alexeys Antwort habe ich den Code leicht geändert, damit er die Einstellungen für das Frontend nicht verändert:

%Vor%

Es wird das Gleiche erreicht, aber es wird vermieden, $ FrontEnd zu ändern.

Hier ist eine Funktion, die automatisch die notwendige Logik für dynamisch veränderliches Antialiasing anwendet:

%Vor%

Nutzung ist was du erwartest:

%Vor%     
Mike Bailey 21.08.2011 08:36
quelle
3

Basierend auf der Idee von acl:

%Vor%

Sie können sehen, was mit der Option passiert mit:

%Vor%

Wie es funktioniert: Es schaltet Antialiasing für die aktuelle FrontEnd-Sitzung aus, wenn Sie das Diagramm drehen und es einschalten, wenn Sie die Maustaste loslassen. Das einzige Problem ist, dass wenn die Maus freigegeben wird und Antialiasing eingeschaltet ist, die FrontEnd die Grafiken nicht erneut gerendert, um es antialiased zu machen. Die Lösung besteht darin, auf das Diagramm zu klicken, ohne es zu drehen - und es wird antialiasiert!

    
Alexey Popkov 22.08.2011 04:47
quelle