MATLAB - 如何使用旋转矩阵旋转轨道/球体?

3

我正在尝试使用下面的旋转矩阵来旋转一个“轨道”:

[cos(angle) -sin(angle) 0; 

 sin(angle) cos (angle) 0;

 0           0          1 ]

我认为首先应该使用sphere()函数:

[x y z] = sphere;

然后将x、y和z连接在一起形成一个向量:
xyz = [x; y; z];

rotatMat = [cos(angle) -sin(angle) 0; sin(angle) cos (angle) 0; 0  0  1 ];

将旋转矩阵和xyz相乘以旋转轨道:

rotated = rotatMat .* xyz;

然而,xyz 的维度是62x22,而我的rotatMat只有3x3,所以我不能将它们相乘。

我该如何解决这个问题?

谢谢您提前。

2个回答

1

你需要使用矩阵乘法运算符*,而不是逐元素相乘的运算符.*

此外,你的xyz矩阵应该是n-by-3大小(而不是62-by-22),你需要使用xyz*rotatMat'来正确匹配维度。或者,你可以使用3-by-n大小的xyz矩阵,并使用语法rotatMat*xyz

祝好,


当我正在输入我的答案时,我看到了这个(+1)。希望你不介意我回答了更多或更少相同的问题(但附有代码)。 - Luis Mendo
@LuisMendo 答案没问题。xyz 应该有 3 列,语法为 xyz*rotatMat',并且有 3 行,语法为 rotatMat*xyz。输出应该相同(但转置)。 - Ratbert
是的,我意识到了,这就是为什么我删除了我的评论。我更习惯于先有变换矩阵,后有坐标 :-) - Luis Mendo
@LuisMendo 这很有趣,对我来说,将xyz坐标列排更自然,但这只是个人口味! - Ratbert
嗯,我认为通常使用列向量[x;y;z]更为常见,其中xyz是数字。例如,请参见维基百科。因此,如果有多个点,则每个点都将是一列(xyz将是向量)。但当然也可以反过来做。 - Luis Mendo

0
xyz = [x(:) y(:) z(:)].'; %'// put x, y, z as rows of a matrix
xyz_rotated = rotatMat*xyz %// use matrix multiplication
x_rotated = reshape(xyz_rotated(1,:), size(x)); %// reshape transformed rows
y_rotated = reshape(xyz_rotated(2,:), size(x));
z_rotated = reshape(xyz_rotated(3,:), size(x));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接