Moviments en R^3

Volem veure l'efecte que tenen els diferents moviments sobre un conjunt de punts a l'espai.

Contents

Punts respecte de l'origen:

Per aplicar els moviments en R^3, considerarem que el model està centrat a l'origen. En mols casos pot no ser així, però podem traslladar-lo:

close all;
clear all;
pt=load('Bunny.txt','-ascii'); %carreguem un conjunt de punts 3D
%       es tracta d'una taula de files: numPunts i colum: 3 coordenades.
% en cas que l'objecte no estigui modelat respecte a l'origen, el
% centrarem traslladant els punts a coordenades respecte al seu centroid.
C=mean(pt); %busquem el centroid
punts=[pt(:,1)-C(1),pt(:,2)-C(2),pt(:,3)-C(3)]; %passem a coordenades centrades
figure()
plot3(punts(:,1),punts(:,2),punts(:,3),'.');
axis equal;

Desplaçaments:

Apliquem un desplaçament (una traslació) respecte de un vector

desp=[2,2,2];
figure()
plot3(punts(:,1),punts(:,2),punts(:,3),'.');
axis equal;
hold on;
plot3(punts(:,1)+desp,punts(:,2)+desp,punts(:,3)+desp,'.');
hold off;

Isometries: Rotacions

Cal donar un vector (columna) que marca l'eix de rotació (no te perque estar normalitzat) i un angle de rotació.

u=[0;0;1]; %eix vertical
ang=45*pi/180; %angle de 45 graus expressat en radiants
% Així podem definir la matriu de rotació associada
R=cos(ang)*eye(3)+((1-cos(ang))/(u'*u))*(u*u')+... %la linea continúa
    (sin(ang)/norm(u))*[0,-u(3),u(2); u(3),0,-u(1); -u(2),u(1),0];
% apliquem la rotació als punts del model
puntsRot=R*punts'; %trasposem els punts per poder fer el producte
puntsRot=puntsRot'; % els tornem a expressar com una taula de nx3
figure()
plot3(punts(:,1),punts(:,2),punts(:,3),'.');
axis equal;
hold on;
plot3(puntsRot(:,1),puntsRot(:,2),puntsRot(:,3),'.');
hold off;

Isometries: Simetria especular respecte a un pla (donat pel vector normal)

u=[0;0;1];  %vector (columna) que marca la normal al pla (no te perque estar normalitzat)
S=eye(3)-(2/(u'*u))*(u*u');
puntsSim=S*punts'; %trasposem els punts per poder fer el producte
puntsSim=puntsSim'; % els tornem a expressar com una taula de nx3
figure()
plot3(punts(:,1),punts(:,2),punts(:,3),'.');
axis equal;
hold on;
plot3(puntsSim(:,1),puntsSim(:,2),puntsSim(:,3),'.');
hold off;

Isometries: Rotació respecte a una recta seguida d'una Simetria especular respecte a un pla

Es tracta de fer els casos anteriors i calcular R i S la nostra matriu serà la composició de les dues anteriors, és a dir: S*R

SR=S*R; %primer s'aplicarà rotació i després simetria
puntsSimRot=SR*punts'; %trasposem els punts per poder fer el producte
puntsSimRot=puntsSimRot'; % els tornem a expressar com una taula de nx3
figure()
plot3(punts(:,1),punts(:,2),punts(:,3),'.');
axis equal;
hold on;
plot3(puntsSimRot(:,1),puntsSimRot(:,2),puntsSimRot(:,3),'.');
hold off;

Angles d'Euler

Els angles d'Euler ens permeten descomposar una rotació genèrica respecte a un exi qualsevol, en la rotació respecte a 3 eixos ortogonals (que poden ser els eixos de coordenades). Com la posició final es calcula a partir de la composició de les tres rotacions respecte dels eixos, aquesta manera de aplicar rotacions és molt utilitzada en robótica o aquells dispositius que tenen eixos fitxers de rotació.

Una les notacions més comunes és la de Yaw (Z), Picth(Y) and Roll(X) que vol dir que les rotacions s'apliquen en l'ordre: X,Y,Z però en matrius és en l'ordre Rz·Ry·Rx

% Definim els angles (en radiants)
Yaw=30*pi/180;
Pitch=45*pi/180;
Roll=60*pi/180;

Rz=[cos(Yaw), -sin(Yaw), 0;
    sin(Yaw), cos(Yaw), 0;
    0 , 0, 1];
Ry=[cos(Pitch), 0, -sin(Pitch);
    0, 1, 0;
    sin(Pitch) , 0, cos(Pitch)];
Rx=[1,  0,  0;
    0, cos(Roll), -sin(Roll);
    0 ,sin(Roll), cos(Roll);];

RFinal=Rz*Ry*Rx;

puntsRFinal=RFinal*punts'; %trasposem els punts per poder fer el producte
puntsRFinal=puntsRFinal'; % els tornem a expressar com una taula de nx3
figure('units','normalized','outerposition',[0 0 1 1]) %fem la propera figura full screen
subplot(1,2,1)
plot3(puntsRFinal(:,1),puntsRFinal(:,2),puntsRFinal(:,3),'.');
axis equal;
%
% Si aquests angles els ha de executar un robot, sempre es faran a partir
% d'una rotació continua que podem simular amb una animació
%
% Apliquem en forma incremental la primera rotació (Roll)
%
for c=0:0.01:Roll
    Rx=[1,  0,  0;
        0, cos(c), -sin(c);
        0 ,sin(c), cos(c);];
    REuler=Rx;
    puntsRFinal=REuler*punts'; %trasposem els punts per poder fer el producte
    puntsRFinal=puntsRFinal'; % els tornem a expressar com una taula de nx3
  subplot(1,2,2)
    plot3(puntsRFinal(:,1),puntsRFinal(:,2),puntsRFinal(:,3),'.');
    axis equal;
    drawnow();
end
%
% Apliquem en forma incremental la segona rotació (Pitch)
%
for b=0:0.01:Pitch
    Ry=[cos(b), 0, -sin(b);
        0, 1, 0;
        sin(b) , 0, cos(b)];
    REuler=Ry*Rx;
    puntsRFinal=REuler*punts'; %trasposem els punts per poder fer el producte
    puntsRFinal=puntsRFinal'; % els tornem a expressar com una taula de nx3
  subplot(1,2,2)
    plot3(puntsRFinal(:,1),puntsRFinal(:,2),puntsRFinal(:,3),'.');
    axis equal;
    drawnow();
end
%
% Apliquem en forma incremental la tercera rotació (Yaw)
%
for a=0:0.01:Yaw
    Rz=[cos(a), -sin(a), 0;
        sin(a), cos(a), 0;
    0 , 0, 1];
    REuler=Rz*Ry*Rx;
    puntsRFinal=REuler*punts'; %trasposem els punts per poder fer el producte
    puntsRFinal=puntsRFinal'; % els tornem a expressar com una taula de nx3
  subplot(1,2,2)
    plot3(puntsRFinal(:,1),puntsRFinal(:,2),puntsRFinal(:,3),'.');
    axis equal;
    drawnow();
end