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
