将3D旋转矩阵应用于从曲面函数

时间:2019-02-28 01:35:02

标签: matlab octave

将3D旋转矩阵应用于从曲面函数对象获得的x,y,z值。我得到的错误是由于矩阵不是非共模的,但是如何正确调整矩阵?

我知道hgtransform / makehgtform可以旋转,但是我需要使用旋转矩阵,因为我计划使用由四元数创建的矩阵对其进行测试

我用圆柱和曲面函数创建了一个小平面。 参见下面的代码:

clear all,clf

ax=axes('XLim',[-2 2],'YLim', [-2 10],'ZLim',[-1.5 1.5]);
grid on;
%axis equal;
xlabel('x');
ylabel('y');
zlabel('z');
ax

% rotate around
rot_mat = [.707 -.707 0;.707 .707 0; 0 0 1] %rotation matrix

[xc yc zc] = cylinder([0.1 0.0]); %cone
[x y z]= cylinder([0.2 0.2]);


h(1) = surface(xc,zc,-yc,'FaceColor', 'red'); %noise cone
h(2) = surface(z,y,0.5*x,'FaceColor', 'blue'); %right wing
h(3) = surface(-z,y,0.5*x,'FaceColor', 'yellow');%left wing
h(4) = surface(x,-1.5*z,0.5*y,'FaceColor', 'green'); %main body
h(5) = surface(xc,(1.5*yc)-1.3,z*.5,'FaceColor', 'red'); %tail

view(3);

x_temp = get(h(1),'xdata'); % get x values
y_temp = get(h(1),'ydata');
z_temp =get(h(1),'zdata');

xc_new=x_temp.*rot_mat;
%zc_new=
%yc_new=

little plane

我可以使用命令获取x,y和z值

x_temp = get(h(1),'xdata');
y_temp = get(h(1),'ydata');
z_temp = get(h(1),'zdata');

我得到的错误是由于矩阵不符合规定,但如何正确调整矩阵?

错误:test_object_matrix_rot:乘积:参数不一致(op1为2x21,op2为3x3)。

错误在于 xc_new = x_temp。* rot_mat;

PS:我使用的是Octave 5.0.91,类似于Matlab

1 个答案:

答案 0 :(得分:1)

您正在搞砸很多事情……实际上,我想说的是,您使工作变得复杂了。您应该立即处理矩阵,以旋转到新的正子,而不是阵列,然后从图中选取它们。

此行:

x_temp = get(h(1),'xdata'); % get x values

为您提供2 * 21数组,并且rot_mat为3X3 .....您不能将它们相乘。您需要选取(x,y,z)并将此点与旋转矩阵相乘才能使点移位。检查下面的伪代码.....您可以使用下面的示例代码开发逻辑。

t = 0:0.1:1;
[X,Y,Z] = cylinder((t));

%% Rotation 
th = pi/2 ;
Rx = [1 0 0 ; 0 cos(th) -sin(th) ; 0 sin(th) cos(th)] ;
P0 = [X(:) Y(:) Z(:)] ;
P1 = P0*Rx ;

X1 = reshape(P1(:,1),size(X)) ;
Y1 = reshape(P1(:,2),size(X)) ;
Z1 = reshape(P1(:,3),size(X)) ;

figure
hold on
surf(X,Y,Z)
surf(X1,Y1,Z1)

view(3)