Wie macht man eine glatte Drehung eines 3D-Plots in MATLAB?

8

Wenn ich versuche, die Kamera mit plot3 mit

um meine aktuelle Figur zu drehen %Vor%

Dann bleibt die Rotation für einige Zeit ( Beispiel ) sogar bei 8-Core MacPro hängen.

Kann ich es glatt machen?

EDIT1:

Obwohl es für meine ursprüngliche Frage noch keine Lösung gibt, habe ich mit getframe function einen besseren Film gemacht. Es erlaubt jedoch keine Aufnahme von Freihand-Rotation und ist in MATLAB2010b für Mac ziemlich fehlerhaft.

%Vor%

EDIT2:

Ich habe einen ähnlichen Thread in MATLAB Central erstellt.

EDIT3:

Sie können es selbst ausprobieren eine meiner Figuren herunterladen .

    
Andrei Fokau 02.12.2010, 19:51
quelle

3 Antworten

4

Ich würde sagen, dass die große Anzahl der Punkte, die Sie zeichnen, die Verlangsamung verursacht. Eine Option ist das Downsampling. Sie können auch Funktionen auf niedrigerer Ebene zum Zeichnen verwenden (prüfen Sie diesen verwandten Beitrag für einen Vergleich der Leistung von plot3 / scatter3 / line.

Betrachten Sie die unten für die Geschwindigkeit optimierte Animation:

%Vor%

Beachten Sie, wie wir den Z-Buffer Renderer verwenden, und drehen Sie ihn Aus der Backingstore-Eigenschaft .

BEARBEITEN:

Wenn ich es richtig verstanden habe, versuche ich einen Screencast (mit einer Drittanbieter-App) aufzunehmen, während du die Figur manuell drehst, aber in deinem Fall sind diese manuellen Drehungen "jumpy". Auf der anderen Seite läuft die Animation mit CAMORBIT / VIEW in einer while-Schleife flüssig ...

Ich schlage eine alternative Lösung vor: Beginnen Sie, indem Sie die Figur mit der Maus drehen und schreiben Sie diese Ansichtskonfigurationen bei jedem Schritt (Azimut, Elevation). Dann können Sie sie während der Videoaufnahme mit der VIEW-Funktion wiedergeben, etwa wie folgt:

%Vor%

Der Nachteil ist, dass Sie mit der Maus in kleinen Schritten drücken / drehen / freigeben müssen (das ROTATE3D-Objekt gibt kein Mausbewegungsereignis aus)

Ich habe eine einfache Funktion geschrieben, um Ihnen bei diesem Prozess zu helfen. Es lädt die gespeicherte Figur, aktiviert 3D-Rotation und verfolgt die Zwischenposition bei jedem Schritt. Wenn Sie fertig sind, drücken Sie die Schaltfläche "Fertig", um die Liste der Ansichten zu verlassen ...

%Vor%

Sie können die obige Funktion aufrufen und dann die Animation erneut abspielen:

%Vor%

Wir können die Übergänge durch einfache Interpolation glätten:

%Vor%

Als Randnotiz sollte ich erwähnen, dass ROTATE3D und CAMORBIT unterschiedliche Effekte haben. ROTATE3D ändert die Eigenschaft View der aktuellen Achse, während CAMORBIT die Kameraeigenschaften CameraTarget / CameraPosition / CameraUpVector der aktuellen Achse steuert.

    
Amro 02.12.2010 20:26
quelle
2

Ich erkenne die gleichen ruckartigen Bewegungen, über die du in einer regulären MATLAB-Figur sprichst. Aber wenn ich versucht habe, den Amro-Code auszuführen, habe ich einen Film (* .AVI) erstellt, der auch auf meinem Mac-Notebook flüssig aussieht.

Der Code zum Erstellen von Filmen, den ich verwendet habe, ist folgender:

% Die Eigenschaft 'Sichtbar' der Figur wurde beim Erstellen eines Films hinzugefügt (obwohl ich nicht sicher bin, ob dies die Situation verbessern wird):

  

hFig = Zahl ('Backingstore', 'aus', 'sichtbar', 'aus', 'Renderer', 'zbuffer');

% Dann habe ich Amros while-Schleife wie folgt durch eine einfache AVI-Produktionsschleife ersetzt:

  

aviobj = avifile ("test.avi"); % erstellt AVI-Datei

     

für I = 1: 360

     

camorbit (0,9, -0,1); drawnow;

     

aviobj = addframe (aviobj, hFig); % fügt der AVI-Datei Frames hinzu

     

Ende

     

aviobj = schließen (aviobj); % schließt die AVI-Datei

     

schließen (hFig); % schließen hFig

Frage:   Wäre es hilfreich, einige Punkte zu dezimieren oder vor dem Rendern eine Dichtekarte zu erstellen?

[Ref. verschiedene Renderoptionen: Ссылка ]

Ich hoffe, dass die obigen Kommentare helfen würden.

    
Y.T. 03.12.2010 00:47
quelle
1
___ qstnhdr ___ Wie macht man eine glatte Drehung eines 3D-Plots in MATLAB? ___ answer4339512 ___

Ich würde sagen, dass die große Anzahl der Punkte, die Sie zeichnen, die Verlangsamung verursacht. Eine Option ist das Downsampling. Sie können auch Funktionen auf niedrigerer Ebene zum Zeichnen verwenden (prüfen Sie diesen verwandten Beitrag für einen Vergleich der Leistung von plot3 / scatter3 / line.

Betrachten Sie die unten für die Geschwindigkeit optimierte Animation:

%Vor%

Beachten Sie, wie wir den Z-Buffer Renderer verwenden, und drehen Sie ihn Aus der Backingstore-Eigenschaft .

BEARBEITEN:

Wenn ich es richtig verstanden habe, versuche ich einen Screencast (mit einer Drittanbieter-App) aufzunehmen, während du die Figur manuell drehst, aber in deinem Fall sind diese manuellen Drehungen "jumpy". Auf der anderen Seite läuft die Animation mit CAMORBIT / VIEW in einer while-Schleife flüssig ...

Ich schlage eine alternative Lösung vor: Beginnen Sie, indem Sie die Figur mit der Maus drehen und schreiben Sie diese Ansichtskonfigurationen bei jedem Schritt (Azimut, Elevation). Dann können Sie sie während der Videoaufnahme mit der VIEW-Funktion wiedergeben, etwa wie folgt:

%Vor%

Der Nachteil ist, dass Sie mit der Maus in kleinen Schritten drücken / drehen / freigeben müssen (das ROTATE3D-Objekt gibt kein Mausbewegungsereignis aus)

Ich habe eine einfache Funktion geschrieben, um Ihnen bei diesem Prozess zu helfen. Es lädt die gespeicherte Figur, aktiviert 3D-Rotation und verfolgt die Zwischenposition bei jedem Schritt. Wenn Sie fertig sind, drücken Sie die Schaltfläche "Fertig", um die Liste der Ansichten zu verlassen ...

%Vor%

Sie können die obige Funktion aufrufen und dann die Animation erneut abspielen:

%Vor%

Wir können die Übergänge durch einfache Interpolation glätten:

%Vor%

Als Randnotiz sollte ich erwähnen, dass ROTATE3D und CAMORBIT unterschiedliche Effekte haben. ROTATE3D ändert die Eigenschaft pause(0.001) der aktuellen Achse, während CAMORBIT die Kameraeigenschaften drawnow / %code% / %code% der aktuellen Achse steuert.

    
___ antwort4339440 ___

Ich weiß nicht, ob das Ihrem Problem helfen wird, aber aus irgendeinem Grund hatte ich einen besseren Erfolg mit %code% als %code% , um eine Aktualisierung des Grafikfensters zu erzwingen

Sie können auch sehen, ob rotate3d schneller ist.

Die Anzahl der Kerne ist nicht so wichtig wie Sie denken, da viele Funktionen in Matlab kein Multithreading unterstützen.

Eine Problemumgehung wäre, so vorzugehen, wie Sie jetzt sind, aber das Figurenfenster in eine Filmdatei zu schreiben. Dann können Sie den Film abspielen.

    
___ tag123rotation ___ Eine Rotation ist eine kreisförmige Bewegung eines Objekts um einen Drehpunkt (oder -punkt). Auf einem mobilen Gerät wird die Änderung der Ausrichtung angezeigt. ___ tag123matlab ___ MATLAB ist eine von MathWorks entwickelte Hochsprachen- und interaktive Programmierumgebung für numerische Berechnungen und Visualisierung. Fragen sollten entweder mit [tag: matlab] oder [tag: oktave] versehen werden, aber nicht mit beiden, es sei denn, die Frage bezieht sich explizit auf beide Pakete. Wenn Sie dieses Tag verwenden, erwähnen Sie bitte die MATLAB-Version, mit der Sie arbeiten (z. B. R2017a). ___ answer4341514 ___

Ich erkenne die gleichen ruckartigen Bewegungen, über die du in einer regulären MATLAB-Figur sprichst. Aber wenn ich versucht habe, den Amro-Code auszuführen, habe ich einen Film (* .AVI) erstellt, der auch auf meinem Mac-Notebook flüssig aussieht.

Der Code zum Erstellen von Filmen, den ich verwendet habe, ist folgender:

% Die Eigenschaft 'Sichtbar' der Figur wurde beim Erstellen eines Films hinzugefügt (obwohl ich nicht sicher bin, ob dies die Situation verbessern wird):

  

hFig = Zahl ('Backingstore', 'aus', 'sichtbar', 'aus', 'Renderer', 'zbuffer');

% Dann habe ich Amros while-Schleife wie folgt durch eine einfache AVI-Produktionsschleife ersetzt:

  

aviobj = avifile ("test.avi"); % erstellt AVI-Datei

     

für I = 1: 360

     

camorbit (0,9, -0,1); drawnow;

     

aviobj = addframe (aviobj, hFig); % fügt der AVI-Datei Frames hinzu

     

Ende

     

aviobj = schließen (aviobj); % schließt die AVI-Datei

     

schließen (hFig); % schließen hFig

Frage:   Wäre es hilfreich, einige Punkte zu dezimieren oder vor dem Rendern eine Dichtekarte zu erstellen?

[Ref. verschiedene Renderoptionen: Ссылка ]

Ich hoffe, dass die obigen Kommentare helfen würden.

    
___ qstntxt ___

Wenn ich versuche, die Kamera mit %code% mit

um meine aktuelle Figur zu drehen %Vor%

Dann bleibt die Rotation für einige Zeit ( Beispiel ) sogar bei 8-Core MacPro hängen.

Kann ich es glatt machen?

EDIT1:

Obwohl es für meine ursprüngliche Frage noch keine Lösung gibt, habe ich mit %code% function einen besseren Film gemacht. Es erlaubt jedoch keine Aufnahme von Freihand-Rotation und ist in MATLAB2010b für Mac ziemlich fehlerhaft.

%Vor%

EDIT2:

Ich habe einen ähnlichen Thread in MATLAB Central erstellt.

EDIT3:

Sie können es selbst ausprobieren eine meiner Figuren herunterladen .

    
___ tag123plot ___ Die grafische Darstellung einer mathematischen Funktion oder eines Datensatzes. Es gibt verschiedene Arten von Plots, z. B. Liniendiagramme, Balkendiagramme oder Streudiagramme. ___ tag123smooth ___ Glättung im Zusammenhang mit statistischen Programmierlösungen, bei denen ein Signal gefiltert wird, um eine Approximationsfunktion zu erzeugen, die versucht, wichtige Muster in den Daten zu erfassen, ohne Rauschen oder visuelle Klarheit, um allgemeine Trends zu erkennen. ___
Marc 02.12.2010 20:18
quelle

Tags und Links