Professional Documents
Culture Documents
Manipulacin de objetos en
3D en Matlab
Estudiante - IPN
RESUMEN
La siguiente practica trata de la creacin de matrices en
3D en matlab, se realizara un programa que nos permita
rotar una esfera ,un cubo y un prisma, as como tambin
poder trasladarlo y escalarlo por una constante.
INTRODUCCION
La manipulacin de imgenes es una herramienta
fundamental para la visin artificial, y por lo mismo de
igual importancia para los proyectos a venir en los
siguientes semestres, Matlab nos proporciona una
excelente interfaz para lograr el objetivo de la practica
ya que nos permite modificar absolutamente todas las
propiedades de las matrices. Para la practica se crearan
3 matrices principales, una para la esfera, otra para el
cubo y otra para el prisma; despus se le multiplicara
dependiendo de lo que se quiera por una matriz de
rotacin, de traslacin o de escalamiento
La practica tiene como objetivo los siguientes puntos:
Escalar el objeto.
SECCION PRINCIPAL
Para toda la practica se utiliza el siguiente cdigo, el
cual cumple con todos los objetivos de la practica
CODIGO MATLAB
clear all;
close all;
clc;
[Xe,Ye,Ze]=sphere;
O=0;
Xc=[-0.5;-0.5;0.5;0.5;-0.5;-0.5;0.5;0.5;0.5;-0.5;0.5;0.5;0.5;0.5;0.5;0.5;-0.5;-0.5]
Yc=[-0.5;0.5;0.5;-0.5;-0.5;-0.5;0.5;0.5;0.5;-0.5;-0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5];
Zc=[-0.5;-0.5;-0.5;-0.5;0.5;0.5;0.5;0.5;0.5;0.5;0.5;-0.5;0.5;0.5;0.5;0.5;0.5;-0.5];
Yp=[-0.5;-0.5;0.5;0.5;-0.5;0;0.5;0.5;0;0.5];
Zp=[-0.5;-0.5;-0.5;-0.5;-0.5;0.5;-0.5;0.5;0.5;-0.5];
Xp=[-0.5;0.5;0.5;-0.5;-0.5;0;0.5;0.5;0;0.5];
fprintf(' 1-------------Cubo \n 2--------Esfera \n 3-----------Prisma ')
O=input('\n Figura?');
if O == 1
X=Xc;
Y=Yc;
Z=Zc;
elseif O == 2
X=Xe;
Y=Ye;
Z=Ze;
elseif O == 3
X=Xp;
Y=Yp;
Z=Zp;
else
fprintf('Error \nReinicie el
programa')
end
tam=size(X);
x=tam(1,1);
y=tam(1,2);
dato=Tt*[X(i,j),Y(i,j),Z(i,j),1]';
X(i,j)=dato(1);
Y(i,j)=dato(2);
Z(i,j)=dato(3);
end
end
plot3(X,Y,Z);
AXIS([-5 5 -5 5 -5 5]);
F(n) = getframe;
end
elseif O == 1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Rotacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
entx=input('angulo de rotacion en x\n');
enty=input('angulo de rotacion en y\n');
entz=input('angulo de rotacion en z\n');
a=entx*(pi/180);
b=enty*(pi/180);
c=entz*(pi/180);
k=20;
%numero de fotos
t1=(a/k);
t2=(b/k);
t3=(c/k);
Trx=[1,0,0,0;0,cos(t1),sin(t1),0;0,sin(t1),cos(t1),0;0,0,0,1];
Try=[cos(t2),0,sin(t2),0;0,1,0,0;sin(t2),0,cos(t2),0;0,0,0,1];
Trz=[cos(t3),sin(t3),0,0;sin(t3),cos(t3),0,0;0,0,1,0;0,0,0,1];
for n=1:k;
for i=1:x;
for j=1:y;
dato=Trx*[X(i,j),Y(i,j),Z(i,j),1]';
dato=Try*dato;
dato=Trz*dato;
X(i,j)=dato(1);
Y(i,j)=dato(2);
Z(i,j)=dato(3);
end
end
plot3(X,Y,Z);
AXIS([-2 2 -2 2 -2 2]);
F(n) = getframe;
end
else
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Escalamiento
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a=input('escalar por? \n');
k=100;
e=a/k;
for n=1:k;
s=(1+(n-1)*e);
Te=[s,0,0,0;0,s,0,0;0,0,s,0;0,0,0,1];
for i=1:x;
for j=1:y;
dato=Te*[X(i,j),Y(i,j),Z(i,j),1]';
Xn(i,j)=dato(1);
Yn(i,j)=dato(2);
Zn(i,j)=dato(3);
end
end
plot3(Xn,Yn,Zn);
AXIS([-2 2 -2 2 -2 2]);
F(n) = getframe;
end
end
clc
movie(F)
ejecutando el cdigo y seleccionando la
opcin de rotar en el eje x obtenemos una
serie de imgenes que asemejan a un
video, mostrando un: rotacin en el eje
x.
CONCLUSION
[x,y,z]=sphere;
lam=0.035;
tam=size(x);
ex=tam(1,1);
ey=tam(1,2);
x0=5;
y0=5;
z0=0;
theta=135*pi/180;
alfa=theta;
r1=0.03;
r2=0.02;
r3=0.02;
for i=1:ex;
for j=1:ey;
X(i,j)=lam*((x(i,j)x0)*cos(theta)+(y(i,j)-y0)*sin(theta)r1)/(-(x(i,j)x0)*sin(theta)*sin(alfa)+(y(i,j)y0)*cos(theta)*sin(alfa)-(z(i,j)z0)*cos(alfa)+r3+lam);
Y(i,j)=lam*((x(i,j)x0)*sin(theta)*cos(alfa)+(y(i,j)y0)*cos(theta)*cos(alfa)+(z(i,j)z0)*sin(alfa)-r2)/(-(x(i,j)x0)*sin(theta)*sin(alfa)+(y(i,j)y0)*cos(theta)*sin(alfa)-(z(i,j)z0)*cos(alfa)+r3+lam);
end
end
plot(X,Y)
ejecutando el programa anterior obtenemos
como resultado la siguiente imagen:
-3
x 10
6
4
2
0
-2
-4
-6
-8
-8
-6
-4
-2
8
-3
x 10