Применение трехмерной матрицы вращения к значениям x, y, z, полученным из функции поверхности - PullRequest
0 голосов
/ 28 февраля 2019

Применение трехмерной матрицы вращения к значениям 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: product: несоответствующие аргументы (op1 - 2x21, op2 - 3x3).

Ошибка в строке xc_new = x_temp. * Rot_mat;

PS: я использую Octave 5.0.91, которая похожа на Matlab

1 Ответ

0 голосов
/ 28 февраля 2019

Вы много чего путаете ...... на самом деле, я бы сказал, вы сделали свою работу сложной.Вы должны немедленно поработать с матрицами, чтобы вращаться на новые позиции вместо массивов и выбирать их из рисунка.

Эта строка:

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)
...