2016-07-09 38 views
0

座標がMATLABスタイル(X、Y、Zが異なる配列に保持されている)の場合、3軸のそれぞれの周りで3Dオブジェクトをどのように回転させますか?MATLAB 3Dオブジェクトの回転と作業

このコードは開始です。私はrotation matrix(xの周りのπ/ 2回転のために)を見つけたと思う、ここでそれはrotX90_2と呼ばれる。しかし、rotX90_2はX、Y、Z上でどのように動作しますか?

[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); 

私はMATLABを使い始めました。私が理解しているように、3Dグラフィックスを操作する基本的な方法は、ここではまたはのようにX、Y、Zのいずれかで操作するか、h = surf(X, Y, Z);のようなグラフィックスルーチンを実行してからf.exを使用してグラフィックスオブジェクトを操作できます。 hgtransform。

X、Y、Zを使用して翻訳してスケールすると便利です。スカラを追加して乗算するだけです。しかし、私はどのように回転するかを理解するためにこの質問をする。

グラフィックオブジェクトで操作する場合は、hgtransform関数を使用できます。しかし、私は理解しているように、hgtransformはグラフィックオブジェクトに対して直接的に動作しないので、最初に他のオブジェクトを作成する必要があります。 (rotatex(h, angle)。F.exのような機能を除いて、私は対応する "translatex(h、distance)"を見つけられませんでした。 簡単に、実用的なポインタをどのように簡単に回転、スケールおよびMATLABの3D座標/オブジェクト(座標系の軸の周り)を翻訳することができます。

編集

以下Prakharの答え、作品によると、上記のギャップを埋めるために必要なコードは以下の通りです。ありがとう、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]); 

答えて

2

たとえば、Rが適切な3x3回転行列であるとします。 、(:, 1)

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

新しいX、Yを得ることができ、今

(と仮定すると、X、Y、およびZは、同じサイズの列ベクトル)、およびZはrotatedCoordinatesとしてrotatedCoordinatesから座標rotateCoordinates(:, 2)、およびrotateCoordinates(:, 3)にそれぞれ対応します。

EDIT: X、Y、Zが2D行列である別の方法:

[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

これは本当に質問に答えていません。それが立てているような問題は、本当に広すぎます。 – Suever

+0

ご返信ありがとうございます。私はそれが有効になると確信していますが、私はどのようにそれを実装するのですか? 'R = rotX90_2'(私の例)を入力してコードを入力すると、「内部行列の次元は一致しなければならない」というエラーが表示されます。問題の例でこのソリューションをどのように実装する必要がありますか? –

+0

X、Y、およびZが列ベクトルであることを確認してください。そうでない場合は、座標= [X 'Y' Z ']を使用します。代わりに。あなたの例では、X、Y、Zの各行をループするために使用します。 – Prakhar