upiita manipulación de objetos 3d matlab

Upload: juan-de-dios-rodriguez

Post on 15-Jul-2015

1.790 views

Category:

Documents


0 download

TRANSCRIPT

Practica2

Manipulacin de objetos en 3D en MatlabEstudiante - IPN

Copyright 2009 SAE International

RESUMENLa 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.

INTRODUCCIONLa 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.

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

SECCION PRINCIPALPara 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];

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 [email protected]

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:8 6 4 2 0 -2 -4 -6 -8 -8 x 10-3

-6

-4

-2

0

2

4

6 x 10

8-3