Академический Документы
Профессиональный Документы
Культура Документы
1. Introduo
% Criao de dados
t = 0:0.001:1; % Varivel tempo
x = sin(2*pi*t); % Varivel posio
% Loop de animao
i = 1;
while i<=length(x)
set(h,'XData',x(i));
drawnow;
i = i+1;
end
Para fazer uma animao de um corpo rgido, primeiro temos que criar uma forma que
representa o corpo rgido. No MATLAB podemos usar "patch" para criar uma forma
tridimensional arbitrria. Um patch uma superfcie poligonal definida por trs ou mais
vrtices. Ao combinar vrios patches podemos criar um poliedro arbitrrio.
Por exemplo, o cdigo abaixo um script MATLAB que desenha um patch triangular com
trs vrtices em (1,0,0), (0,2,0) e (0,0,3).
% test_patch.m
% Vrtices
x(1)=1; y(1)=0; z(1)=0;
3
% Desenhar patch
figure(1);
patch(x,y,z,'y');
Vamos criar uma forma de bloco combinando seis patches. Consideramos primeiro o caso
em que um dos vrtices coincide com a origem do sistema de coordenadas e cada lado
paralelo ao eixo de coordenadas, como mostrado na Figura 3 (chamamos isso de
"configurao bsica"). Neste caso, se o comprimento de cada lado ( Lx , L y , Lz ) dado, as
coordenadas dos oito vrtices so bvias. Os seis patches so definidos pelas seguintes
combinaes de vrtices:
4
1-2-5-3
1-3-6-4
1-4-7-2
4-7-8-6
2-5-8-7
3-6-8-5
% make_block_special.m
Lx = 0.15;
Ly = 0.05;
Lz = 0.30;
% Vertices
VertexData = [Lx*ones(8,1),Ly*ones(8,1),Lz*ones(8,1)]...
.*[0,0,0;
1,0,0;
0,1,0;
0,0,1;
1,1,0;
0,1,1;
1,0,1;
1,1,1];
% Patches
5
Index_Patch = ...
[1,2,5,3;
1,3,6,4;
1,4,7,2;
4,7,8,6;
2,5,8,7;
3,6,8,5];
n_pat = 6;
for i_pat=1:n_pat
% Patches data
PatchData_X(:,i_pat) = VertexData(Index_Patch(i_pat,:),1);
PatchData_Y(:,i_pat) = VertexData(Index_Patch(i_pat,:),2);
PatchData_Z(:,i_pat) = VertexData(Index_Patch(i_pat,:),3);
end
% Desenhar patches
figure(1);
h = patch(PatchData_X,PatchData_Y,PatchData_Z,'y');
set(h,'FaceLighting','phong','EdgeLighting','phong');
set(h,'EraseMode','normal');
Como mostrado na Figura 5, um bloco numa configurao geral pode ser definida pela
posio e pela orientao de um quadro de referncia ligado a um dos vrtices e ao
comprimento de cada lado (Lx, Ly, Lz). Se a posio e a orientao da trama de referncia so
r e R, respectivamente, ento as coordenadas dos vrtices so obtidas pela seguinte equao:
% make_block_general.m
% Block specification
r = [1,1,1]; % Reference position
A = [-pi/3, 0, pi/6]; % Reference orientation (x-y-z Euler angle)
Lx = 0.15;
Ly = 0.05;
Lz = 0.30;
R1 = [1, 0, 0;
0, cos(a1), -sin(a1);
0, sin(a1), cos(a1)];
R2 = [cos(a2), 0, sin(a2);
0, 1, 0;
-sin(a2), 0, cos(a2)];
R3 = [cos(a3), -sin(a3), 0;
sin(a3), cos(a3), 0;
0, 0, 1];
R = R1*R2*R3;
8
% Vertices
VertexData_0 = [Lx*ones(8,1),Ly*ones(8,1),Lz*ones(8,1)]...
.*[0,0,0;
1,0,0;
0,1,0;
0,0,1;
1,1,0;
0,1,1;
1,0,1;
1,1,1];
n_ver = 8;
for i_ver=1:n_ver
VertexData(i_ver,:) = r + VertexData_0(i_ver,:)*R';
end
% Patches
Index_Patch = ...
[1,2,5,3;
1,3,6,4;
1,4,7,2;
4,7,8,6;
2,5,8,7;
3,6,8,5];
n_pat = 6;
for i_pat=1:n_pat
% Patches data
PatchData_X(:,i_pat) = VertexData(Index_Patch(i_pat,:),1);
PatchData_Y(:,i_pat) = VertexData(Index_Patch(i_pat,:),2);
PatchData_Z(:,i_pat) = VertexData(Index_Patch(i_pat,:),3);
end
% Draw patches
figure(1);
h = patch(PatchData_X,PatchData_Y,PatchData_Z,'y');
set(h,'FaceLighting','phong','EdgeLighting','phong');
set(h,'EraseMode','normal');
% Axes settings
xlabel('x','FontSize',14);
ylabel('y','FontSize',14);
zlabel('z','FontSize',14);
set(gca,'FontSize',14);
axis vis3d equal;
view([-37.5,30]);
camlight;
grid on;
xlim([0.8,1.3]);
9
ylim([0.9,1.4]);
zlim([0.8,1.3]);
Vamos criar uma forma cilndrica com patches. Seja a configurao bsica de um cilindro
uma configurao onde o centro do crculo inferior esteja na origem do Sistema de
coordenadas e o eixo central coincida com o eixo Z. O Script MATLAB para desenhar uma
forma cilndrica mostrada no cdigo abaixo.
% make_cylinder_special.m
Radius = 0.1;
Height = 0.3;
SideCount = 20;
% Vertices
n_side = SideCount;
for i_ver=1:n_side
VertexData(i_ver,:) = [Radius*cos(2*pi/n_side*i_ver),Radius*sin(2*pi/n_side*i_ver),0];
VertexData(n_side+i_ver,:) =
[Radius*cos(2*pi/n_side*i_ver),Radius*sin(2*pi/n_side*i_ver),Height];
end
10
% Side Patches
for i_pat=1:n_side-1
Index_Patch1(i_pat,:) = [i_pat,i_pat+1,i_pat+1+n_side,i_pat+n_side];
end
Index_Patch1(n_side,:) = [n_side,1,1+n_side,2*n_side];
for i_pat=1:n_side
% Bottom Patches
Index_Patch2(1,:) = [1:n_side];
Index_Patch2(2,:) = [n_side+1:2*n_side];
for i_pat=1:2
% Axes settings
xlabel('x','FontSize',14);
ylabel('y','FontSize',14);
zlabel('z','FontSize',14);
set(gca,'FontSize',14);
axis vis3d equal;
view([-37.5,30]);
camlight;
grid on;
xlim([-0.2,0.2]);
ylim([-0.2,0.2]);
zlim([-0,0.4]);
O script MATLAB para desenhar um cilindro emu ma configurao geral mostrado abaixo:
% make_cylinder_general.m
% Cylinder specification
r = [1,1,1]; % Reference position
A = [-pi/3, 0, 0]; % Reference orientation (x-y-z Euler angle)
Radius = 0.1;
Height = 0.3;
SideCount = 20;
R1 = [1, 0, 0;
0, cos(a1), -sin(a1);
0, sin(a1), cos(a1)];
R2 = [cos(a2), 0, sin(a2);
0, 1, 0;
-sin(a2), 0, cos(a2)];
R3 = [cos(a3), -sin(a3), 0;
12
sin(a3), cos(a3), 0;
0, 0, 1];
R = R1*R2*R3;
% Vertices
n_side = SideCount;
for i_ver=1:n_side
VertexData_0(i_ver,:) = [Radius*cos(2*pi/n_side*i_ver),Radius*sin(2*pi/n_side*i_ver),0];
VertexData_0(n_side+i_ver,:) =
[Radius*cos(2*pi/n_side*i_ver),Radius*sin(2*pi/n_side*i_ver),Height];
end
n_ver = 2*n_side;
for i_ver=1:n_ver
VertexData(i_ver,:) = r + VertexData_0(i_ver,:)*R';
end
% Side Patches
for i_pat=1:n_side-1
Index_Patch1(i_pat,:) = [i_pat,i_pat+1,i_pat+1+n_side,i_pat+n_side];
end
Index_Patch1(n_side,:) = [n_side,1,1+n_side,2*n_side];
for i_pat=1:n_side
% Bottom Patches
Index_Patch2(1,:) = [1:n_side];
Index_Patch2(2,:) = [n_side+1:2*n_side];
for i_pat=1:2
figure(1);
h2 = patch(PatchData2_X,PatchData2_Y,PatchData2_Z,'y');
set(h2,'FaceLighting','phong','EdgeLighting','phong');
set(h2,'EraseMode','normal');
% Axes settings
xlabel('x','FontSize',14);
ylabel('y','FontSize',14);
zlabel('z','FontSize',14);
set(gca,'FontSize',14);
axis vis3d equal;
view([-37.5,30]);
camlight;
grid on;
xlim([0.8,1.3]);
ylim([1,1.5]);
zlim([0.8,1.3]);
Cdigo 1:
function R = Euler2R(A)
R1 = [1, 0, 0;
0, cos(a1), -sin(a1);
0, sin(a1), cos(a1)];
R2 = [cos(a2), 0, sin(a2);
0, 1, 0;
-sin(a2), 0, cos(a2)];
R3 = [cos(a3), -sin(a3), 0;
sin(a3), cos(a3), 0;
0, 0, 1];
R = R1*R2*R3;
Cdigo 2:
function VertexData = GeoVerMakeBlock(Location,Orientation,SideLength)
r = Location;
R = Orientation;
Lx = SideLength(1);
Ly = SideLength(2);
Lz = SideLength(3);
n_ver = 8;
for i_ver=1:n_ver
15
VertexData(i_ver,:) = r + VertexData_0(i_ver,:)*R';
end
Cdigo 3:
function [PatchData_X,PatchData_Y,PatchData_Z] = GeoPatMakeBlock(VertexData)
Index_Patch = ...
[1,2,5,3;
1,3,6,4;
1,4,7,2;
4,7,8,6;
2,5,8,7;
3,6,8,5];
n_pat = 6;
for i_pat=1:n_pat
PatchData_X(:,i_pat) = VertexData(Index_Patch(i_pat,:),1);
PatchData_Y(:,i_pat) = VertexData(Index_Patch(i_pat,:),2);
PatchData_Z(:,i_pat) = VertexData(Index_Patch(i_pat,:),3);
end
% make_block.m
% Block specification
r = [1,1,1]; % Reference position
A = [-pi/3, 0, pi/6]; % Reference orientation (x-y-z Euler angle)
Lx = 0.15;
Ly = 0.05;
Lz = 0.30;
% Vertices
VertexData = GeoVerMakeBlock(r,R,[Lx,Ly,Lz]);
% Patches
[PatchData_X,PatchData_Y,PatchData_Z] = GeoPatMakeBlock(VertexData);
% Draw patches
figure(1);
16
h = patch(PatchData_X,PatchData_Y,PatchData_Z,'y');
set(h,'FaceLighting','phong','EdgeLighting','phong');
set(h,'EraseMode','normal');
% Axes settings
xlabel('x','FontSize',14);
ylabel('y','FontSize',14);
zlabel('z','FontSize',14);
set(gca,'FontSize',14);
axis vis3d equal;
view([-37.5,30]);
camlight;
grid on;
xlim([0.8,1.3]);
ylim([0.9,1.4]);
zlim([0.8,1.3]);