Matlab stoppt die Interpolation von Farben auf einem Netz korrekt, wenn sie größer als 120 Dreiecke ist

8

Ich versuche, ein großes Mesh in Matlab mit der Funktion trimesh zu zeichnen, mit der z-Koordinate der Scheitelpunkte, die die Farbe steuern. Leider stoppt Matlab die Interpolation von Farben, wenn die Größe des Gitters 120 Dreiecke überschreitet. Hier ist ein Bild, das das Problem zeigt, mit 120 Dreiecken auf der linken Seite und 121 Dreiecken auf der rechten Seite.

Wie Sie sehen, interpoliert Matlab bei großen Netzen direkt von der Farbe eines Eckpunkts zur Farbe des anderen Eckpunkts. Dies wurde wahrscheinlich aus Performance-Gründen getan, aber ich versuche, schöne Bilder für meine These zu erstellen, und es ist mir egal, wie lange es dauert, sie zu berechnen. Gibt es eine Möglichkeit, diese Approximation zu deaktivieren?

Hier ist der Code zum Erzeugen des Bildes:

%Vor%     
Neil Forrester 21.09.2013, 20:39
quelle

1 Antwort

5

Ich denke, dass MATLAB nach einer bestimmten Schwelle für eine bessere Leistung (Hardwarebeschleunigung) auf den OpenGL-Renderer umgeschaltet hat. Leider ist es nicht ohne Fehler.

Ich habe nicht genau untersucht, wie Sie die dreieckigen Flächen erstellen (es könnte ein Problem damit geben, wie sie bestellt werden), aber eine einfache Lösung besteht darin, die Rendering-Methode explizit festzulegen. Fügen Sie einfach den folgenden Aufruf am Ende Ihrer Funktion hinzu:

%Vor%

BEARBEITEN

Die obige Problemumgehung sollte gut funktionieren. Das eigentliche Problem ist jetzt kein fehlerhaftes OpenGL, sondern eine dokumentierte Einschränkung:

  

OpenGL führt keine Colormap-Interpolation durch. Wenn Sie eine Oberfläche erstellen oder   Patch mit indizierter Farbe und interpolierter Flächen- oder Kantenfärbung,   OpenGL interpoliert die Farben durch den RGB-Farbwürfel statt   durch die Colormap.

Beachten Sie, dass der TRIMESH-Aufruf der folgenden entspricht:

%Vor%

Sie geben also für jeden Stützpunkt eine Farbe an, die der Z-Koordinate entspricht (Sie haben nur zwei eindeutige Werte, entweder 0 oder 1). Dies wird als indizierte Farbe in der Colormap der aktuellen Figur interpretiert, die skaliertes Mapping verwendet (der Standard ist die Jet-Colormap). Die zwei Farben sind also:

%Vor%

Leider, wie das Zitat oben erklärt, wird OpenGL Renderer nicht die Interpolation mit den Farben der Colormap-Palette durchführen, sondern die Interpolation im RGB-Farbraum zwischen den beiden obigen Farben vornehmen. So erhalten wir den blau-roten Farbverlauf, den Sie gesehen haben.

Sie können also nur einen der beiden anderen Renderer verwenden, wobei zbuffer hier die beste Methode ist.

Hier ist der Code, um den Unterschied zwischen den beiden Rendermethoden zu sehen:

%Vor%

OpenGL

Z-Puffer

    
Amro 22.09.2013, 11:29
quelle

Tags und Links