You are on page 1of 4

Practica2

Manipulacin de objetos en
3D en Matlab

Copyright 2009 SAE International

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:

Rotar el objeto seleccionado.

Trasladar el objeto seleccionado.

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

fprintf(' 1-------------Rotar \n 2--------Trasladar \n 3-----------Escalar ')


O=input('\n Operacion?');
if O == 2;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%Traslacion
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
a1=input('\n X-nueva \n');
a2=input('\n Y-nueva \n');
a3=input('\n Z-nueva \n');
a=[a1,a2,a3];%punto a llegar
k=20;
t=(a/k); %numero de fotos
Px=a(1,1)/k;
Py=a(1,2)/k;
Pz=a(1,3)/k;
for n=1:k;
Tt=[1,0,0,Px;0,1,0,Py;0,0,1,Pz;0,0,0,1];
for i=1:x;
for j=1:y;

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.

ejecutando el cdigo y seleccionando la


opcin de trasladar obtenemos la
siguiente animacin:

ejecutando el cdigo y seleccionando la


opcin de escalar obtenemos la siguiente
animacin:

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;

La manipulacin de matrices es fundamental en el


procesamiento de imgenes, Matlatlab es una
herramienta que hasta el momento ha probado ser
excelente para llevar a cabo esta tarea, sin embargo
realizar la practica para poder visualizar una animacin
es algo tedioso, ya que le problema es poder separar
una sola traslacin, rotacin u escalamiento en muchas
imgenes intermedias
CONTACTO
Rodriguez Ramirez Juan de Dios
8MV2
juandediosrr@hotmail.com

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

You might also like