2016-07-09 13 views
0

Wie rotieren Sie 3D-Objekte um jede der drei Achsen, wenn die Koordinaten MATLAB-Stil sind (X, Y und Z in verschiedenen Arrays).Drehen und Bearbeiten von MATLAB 3D-Objekten

Dieser Code ist ein Anfang. Ich glaube ich habe die rotation matrix (für pi/2 Rotation um x) gefunden, hier heißt es rotX90_2. Aber wie soll rotX90_2 auf X, Y, Z operieren?

[X,Y,Z] = cylinder; 

% rotX90_1 = makehgtform('xrotate',pi/2) gives 
rotX90_1 = ... 
    [1  0  0  0; 
     0  0 -1  0; 
     0  1  0  0; 
     0  0  0  1]; 

rotX90_2 = rotX90_1(1:3, 1:3); 

% Here rotX90_2 should operate on [X,Y,Z] in order to ... 
% rotate it 90 degrees around x, but how is this done? 
% == What code should be put here to rotate the cylinder? == 

surf(X,Y,Z); 

Ich habe gerade angefangen, MATLAB zu verwenden. Wie ich verstehe, die grundlegenden Möglichkeiten zur Manipulation von 3D-Grafiken sind entweder auf dem X, Y, Z, wie hier oder zu arbeiten, können Sie zuerst Grafik-Routinen wie h = surf(X, Y, Z); ausführen und dann auf Grafikobjekte arbeiten, mit f.ex. hgtransform.

Es ist bequem zu übersetzen und skalieren mit X, Y, Z. - Sie addieren und multiplizieren Sie durch Skalare. Aber ich stelle diese Frage, um zu verstehen, wie man rotiert.

Wenn Sie dagegen mit den Grafikobjekten arbeiten, können Sie die Funktion hgttransform verwenden. Aber erst müssen Sie dann andere Objekte anlegen, da hgttransform nicht direkt auf den Grafikobjekten operiert, wie ich es verstehe. (Außer Funktionen wie rotatex(h, angle). ZB habe ich kein entsprechendes "translatex (h, Abstand)" gefunden. Das überraschte mich. Vielleicht sah ich nicht gut genug aus.)

OK ich bin neu dazu. Irgendwelche einfachen, praktischen Zeiger, wie zu leicht zu drehen, zu skalieren und übersetzen MATLAB 3D Koordinaten/Objekte (um die Koordinatensystemachsen) würde geschätzt werden.

bearbeiten:

Nach Prakhar Antwort unten, die den Code funktioniert notwendig, um die Lücke zu füllen, oben ist die folgende. Danke, Prakhar.

[row, col] = size(X); 
coordinates = [reshape(X, [row*col, 1]), reshape(Y, [row*col, 1]), reshape(Z, [row*col, 1])]; 
rC = coordinates * rotX90_2; 

X = reshape(rC(:, 1), [row, col]); 
Y = reshape(rC(:, 2), [row, col]); 
Z = reshape(rC(:, 3), [row, col]); 

Antwort

2

Nehmen wir an, R ist die geeignete 3x3-Rotationsmatrix.

coordinates = [X Y Z]; 
rotatedCoordinates = coordinates * R; 

(Unter der Annahme, X, Y, Z und Spaltenvektoren von gleicher Größe)

nun den neuen X bekommen kann, Y und Z-Koordinaten von rotatedCoordinates als rotatedCoordinates (:, 1), rotierte Koordinaten (:, 2) bzw. rotierte Koordinaten (:, 3).

EDIT: Eine weitere Alternative, wenn X, Y, Z sind 2D-Matrizen:

[X, Y, Z] = cylinder; 

[row, col] = size(X); 

coordinates = [reshape(X, [row*col, 1]), reshape(Y, [row*col, 1]), reshape(Z, [row*col, 1])]; 
rC = coordinates*R; 

Xn = reshape(rC(:, 1), [row, col]); 
Yn = reshape(rC(:, 2), [row, col]); 
Zn = reshape(rC(:, 3), [row, col]); 
+0

Dies ist nicht wirklich die Frage beantworten. Die Frage, wie sie aussieht, ist wirklich zu weit gefasst. – Suever

+0

Danke für Ihre Antwort. Ich bin mir sicher, dass es gültig sein kann, aber wie kann ich es umsetzen? wenn ich nur 'R = rotX90_2' (von meinem Beispiel) und dann geben Sie Ihren Code ein, bekomme ich den Fehler" Innere Matrix Dimensionen müssen zustimmen. " Wie soll diese Lösung in dem Beispiel in der Frage umgesetzt werden? –

+0

Stellen Sie sicher, dass X, Y und Z Spaltenvektoren sind. Wenn nicht, verwenden Sie Koordinaten = [X 'Y' Z ']; stattdessen. Verwenden Sie die for-Schleife für das Schleifen über jede Zeile in X, Y, Z in Ihrem Beispiel. – Prakhar