旋转并处理MATLAB 3D对象

时间:2016-07-09 07:09:36

标签: matlab 3d rotation

当坐标为MATLAB样式(X,Y和Z保存在不同的数组中)时,如何围绕三个轴中的每个轴旋转3D对象。

此代码是一个开始。我想我已找到rotation matrix(围绕x的pi / 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]);

1 个答案:

答案 0 :(得分:2)

假设R是适当的3x3旋转矩阵。

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

(假设X,Y和Z是相同大小的列向量)

现在,您可以分别从rotateCoordinates获取新的X,Y和Z坐标作为rotateCoordinates(:,1),rotatingCoordinates(:,2)和rotatingCoordinates(:,3)。

编辑:当X,Y,Z为二维矩阵时的另一种选择:

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