Este documento describe la teoría y aplicaciones de la proyección isométrica y las coordenadas homogéneas en álgebra lineal para gráficos de computadora. Se explica cómo proyectar objetos tridimensionales en un plano bidimensional, y cómo esto se puede usar para dibujar figuras como un cubo unidad. También incluye ejemplos de cómo calcular proyecciones y matrices de proyección para diferentes figuras geométricas.
1. Universidad San Francisco de Quito
Proyecto de Álgebra Lineal
“Aplicaciones a Gráficos de Computadora”
8 de diciembre de 2010
1 Teoría
1.1 Proyecciones
Uno de los principales problemas en el diseño gráfico es cómo dibujar objetos tridimensionales en el
papel o en la pantalla del ordenador. O expresado de forma matemática: dado x = (x, y, z)t ∈ R3 ,
¿qué coordenadas (x0 , y0 )t ∈ R2 debe tener el punto que representa a x en el plano? Es decir, tenemos
una aplicación (proyección) P : R3 −→ R2 cuyo significado es el siguiente: P (x) es donde se tiene
que dibujar el punto x. La proyección isométrica es muy usada en el diseño gráfico. Esta aplicación
cumple:
• Es una aplicación lineal.
√ t √ t
3 1 3 1
• P (e1 ) = − 2 , −2 , P (e2 ) = 2 , −2 , P (e3 ) = (0, 1)t , donde {e1 , e2 , e3 } es la base canónica
de R3 .
a. Halle la matriz de esta aplicación en la bases canónicas.
Llamemos B3 = e1 , e2 , e3 a la base de R3 , por tanto, la matriz relacionada a esta aplicación
lineal es:
AP = P (e1 ) P (e2 ) P (e3 ) ,
por tanto √ √
3 3
− 2 2 0
P1 = .
1 1
−2 −2 1
b. Calcule P (x) para un punto arbitrario x en R3
Sea x ∈ R2 , por tanto x es de la forma x = (x, y, z)t , se tiene que
P (x) = P 1x
√ √
− 3 3
0 x
2 2
= y
1 1
−2 −2 1 z
√ √
− 23 x + 23 y
= .
−2x − 1y + z
1
2
√ √ t
3 3 1
Por tanto, P (x) = − 2 x + 2 y, − 2 x − 1y + z .
2
1
2. c. Calcule en núcleo de P y su dimensión, ¿Cuál es el significado geométrico del núcleo
de P ?
Para calcular el núcleo de P , caractericemos los x ∈ R2 tales que P (x) = 0
√ √
3 3 1 1
P (x) = 0 ⇐⇒ − x+ y, − x − y + z = (0, 0)
2 2 2 2
√ √
3 3 1 1
⇐⇒ − x+ y=0 y − x− y+z =0
2 2 2 2
x+y
⇐⇒ −x + y = 0 y z =
2
x+y
⇐⇒ x = y y z =
2
2x
⇐⇒ x = y y z =
2
⇐⇒ x = y y z = x
⇐⇒ x = y = z.
Por tanto los elementos del núcleo de P son de la forma (a, a, a)t con a ∈ R, por tanto una
base para en núcleo de P es {(1, 1, 1)t }, por ende, la dimension de núcleo de P es 1.
Esto significa que los puntos que tienen todas sus coordenadas iguales van a ser proyectados
en el origen del sistema coordenado.
d. Dados dos puntos p y q de R3 , ¿qué condición necesaria y suficiente deben cumplir p
y q para que sean dibujados en el mismo lugar?
La condición necesaria y suficiente para que los puntos p y q de R3 se dibujen en el mismo
lugar es que sus proyecciones sean las mismas, por tanto
P (p) = P (q) ⇐⇒ P (p) − P (q) = 0
⇐⇒ P (p − q) = 0,
es decir si p − q pertenece al núcleo de P ; si definimos p = (p1 , p2 , p3 )t y q = (q1 , q2 , q3 )t , la
condición necesaria y suficiente para dibujar estos puntos en el mismo lugar es que p1 − q1 =
p2 − q2 = p3 − q3 .
e. Los vértices del cubo unidad son (0, 0, 0)t , (0, 0, 1)t , (0, 1, 0)t , (0, 1, 1)t , (1, 0, 0)t , (1, 0, 1)t ,
(1, 1, 0)t , (1, 1, 1)t , ¿Qué figura geométrica resulta si proyectamos el cubo unidad?
Hallemos primero las proyecciones de estos puntos:
P (0, 0, 0)t = P 1 · (0, 0, 0)t = (0, 0)t
P (0, 0, 1)t = P 1 · (0, 0, 1)t = (0, 1)t
√ t
t t 3 1
P (0, 1, 0) = P 1 · (0, 1, 0) = ,−
2 2
√ t
t t 3 1
P (0, 1, 1) = P 1 · (0, 1, 1) = ,
2 2
√ t
t t 3 1
P (1, 0, 0) = P 1 · (1, 0, 0) = − ,−
2 2
√ t
t t 3 1
P (1, 0, 1) = P 1 · (1, 0, 1) = − ,
2 2
t
P (1, 1, 0)t = P 1 · (1, 1, 0)t = (0, −1)
t
P (1, 1, 1)t = P 1 · (1, 1, 1)t = (0, 0) .
2
3. Tenemos 6 coordenadas simétricas con respecto tanto al eje x como al eje y por tanto el gráfico
obtenido es un hexágono regular1.
f. Estudie qué proyección se ha de usar si se quiere dibujar el cubo unidad como se
muestra:
Para determinar esta proyección se tiene que estudiar las proyecciones de los vectores de la
base canónica, por el gráfico se tiene que
P2 (e3 )
P2 (e2 )
P2 (e1 )
√ √ t
2 2
Por lo tanto se tiene que P2 (e1 ) = − 2 ,− 2 , P2 (e2 ) = (1, 0)t , P2 (e3 ) = (0, 1)t , donde
{e1 , e2 , e3 } es la base canónica de R3 .
La matriz asociada a esta aplicación lineal es
√
2
− 2 1 0
P2 = √ .
− 22 0 1
1.2 Coordenadas Homogéneas
Problemas 15, 17, 19 de la sección 2.7 del texto Álgebra Lineal y sus Aplicaciones de David C. Lay.
1 1 1 1
15. ¿Qué vector en R3 tiene las coordenadas homogéneas 2 , − 4 , 8 , 24 ?
t
Se tiene que dado un vector (X, Y, Z, H) , este es el vector de coordenadas homogéneas para
X Y Z t
H, H, H , por tanto el vector de R3 tiene las coordenadas homogéneas 2 , − 4 , 1 , 24 es
1 1
8
1
1 1 1 t
2 −4 8
1 , 1 , 1 ,
24 24 24
por tanto el vector de R3 es
(12, −6, 3)t.
17. Proporcione la matriz de 4 × 4 que gira puntos en R3 alrededor del eje x a través de
un ángulo de 60◦ .
Primero, construyamos la matriz de 3 × 3 para la rotación. El vector e1 gira sobre si mismo y
no se altera. El vector e2 gira 60◦ hacia arriba, deteniéndose en (0, cos 60◦ , sen 60◦ ). Y el vector
e3 gira igualmente hasta detenerse en (0, − sen 60◦ , cos 60◦ ). Por tanto se tiene que la rotación
da:
e1 → (1, 0, 0)t
1 Esto se comprobará en la siguiente sección, al dibujas la proyección de este cubo.
3
4. √ t
1 3
e2 → 0, ,
2 2
√ t
3 1
e3 → 0, − , ,
2 2
de donde, la matriz de rotación es
1 0 0
√
0 1 3
2 − 2 .
√
3 1
0 2 2
Por lo tanto, la matriz de rotación para las coordenadas homogéneas es
1 0 0 0
√
0 1 − 3 0
2 2
.
√
0 3 1
2 2 0
0 0 0 1
19. Sea S el triángulo con vértices (4.3, 1.2, 4)t, (6, 4, 3)t , (2, 2, 6)t . Encuentre la imagen de
S bajo la proyección en perspectiva con centro de proyección en (0, 0, 10)t
Se tiene que la matriz de proyección de las coordenadas homogéneas es
1 0 0 0
0 1 0 0
.
0 0 0 0
1
0 0 − 10 1
Sean a = (4.3, 1.2, 4, 1)t, b = (6, 4, 3, 1)t , c = (2, 2, 6, 1)t las coordenadas homogéneas del
triángulo S, se tiene que la proyección es
t
21 6 3
P ·a = , , 0,
5 5 5
t
4
P · b = 6, 4, 0,
5
t
2
P · c = 2, 2, 0, .
5
Para obtener las coordenadas, realizamos el mismo proceso que en 15. (dividimos para la
cuarta coordenada las otras tres) y obtenemos que las coordenadas de la proyección son (7, 2, 0),
(7.5, 5, 0), (5, 5, 0).
2 Laboratorio
El objetivo de esta parte es graficar, utilizando el comando plot (de dos dimensiones) de MATLAB,
las proyecciones de objetos geométricos trasladados y rotados. Los objetos que se graficarán estarán
formados únicamente por vértices y aristas. Instrucciones: Cada item tiene dos tipos de actividades:
preguntas o problemas a resolver, y desarrollo en MATLAB.
2.1 Coordenadas
a. Escriba la matriz de datos D para las coordenadas de los puntos del cubo unitario en
3D. (debe ser una matriz 3x8)
4
5. Con los datos dados en la subsección 1.1, literal e, se tiene que la matriz es
0 0 0 0 1 1 1 1
D = 0 0 1 1 0 0 1 1 .
0 1 0 1 0 1 0 1
b. MATLAB: Crear la matriz de datos D para las coordenadas de los puntos del cubo
unitario en 3D.
En MATLAB el código es:
>> D=[0 0 0;0 0 1;0 1 0;0 1 1;1 0 0;1 0 1;1 1 0; 1 1 1]’.
2.2 Aristas
Una matriz de aristas A para un objeto (grafo o conjunto de N puntos) es la matriz N × N formada
de ceros y unos tal que Ai,j = 1 si existe una arista entre los puntos i y j, y Ai,j = 0 si no existe arista
entre dichos puntos. Como en nuestros gráficos ignoraremos el sentido de la arista y como Ai,j y Aj,i
representan la misma arista, utilizaremos únicamente uno de ellos de modo que podemos hacer que
A sea una matriz triangular. Además, no graficamos arista alguna desde un punto hacia sí mismo, lo
cual quiere decir que Ai,i = 0.
a. ¿Cuál es la matriz de aristas A para el cubo unitario?
Si numeramos las aristas del cubo en el orden en el cual están ingresados en la matriz D, se
tiene que
2 4
6 8
1 3
5 7
por tanto, la matriz de aristas es
0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0
0 1 1 0 0 0 0 0
A=
1
.
0 0 0 0 0 0 0
0 1 0 0 1 0 0 0
0 0 1 0 1 0 0 0
0 0 0 1 0 1 1 0
b. MATLAB: Crear la matriz de aristas A para el cubo unitario.
En MATLAB el código es:
>> A=[0 0 0 0 0 0 0 0;1 0 0 0 0 0 0 0;1 0 0 0 0 0 0 0;0 1 1 0 0 0 0 0;
1 0 0 0 0 0 0 0;0 1 0 0 1 0 0 0;0 0 1 0 1 0 0 0;0 0 0 1 0 1 1 0].
2.3 Proyecciones
a. MATLAB Definir las matrices (2 × 3) P 1 y P 2 correspondientes a las dos proyecciones
estudiadas en la subsección 1.1.
Las matrices P 1 y P 2 son las definidas en la subsección 1.1, en los literales a y f , y su código
en MATLAB es
>> P1=[-sqrt(3)/2 sqrt(3)/2 0; -1/2 -1/2 1] y
>> P2=[-sqrt(2)/2 1 0;-sqrt(2)/2 0 1].
5
6. b. ¿Qué información nos da la matriz P 1 · D y P 2 · D?
Estas matrices nos dan las coordenadas de los puntos del cubo ya proyectados en cada pers-
pectiva.
2.4 Graficar
Definir la función plotobj8(A,D2) que utiliza la matriz de aristas A y la matriz 2 × 8 de datos D2
que grafica las aristas entre los puntos especificados por la matriz de aristas.
a. Presentar el código de la función plotobj8.
Definimos primero la función linea que toma dos vectores de R2 y dibuja la linea que pasa
por estos puntos.
f u n c t i o n []= linea (a , b )
px =( b (1) - a ( 1 ) ) / 1 0 ;
py =( b (2) - a ( 2 ) ) / 1 0 ;
x (1)= a (1);
y (1)= a (2);
for i =2:11;
x ( i )= x (i -1)+ px ;
y ( i )= y (i -1)+ py ;
end
plot (x , y )
Usando esta función, definimos la función plotobj8.
f u n c t i o n []= p l o t o b j 8(A , D2 )
n = size (A ,1);
hold off
for i =1: n ;
for j = i : n ;
if A (j , i )==1;
linea ( D2 (: , i ) , D2 (: , j ))
hold on
end
end
end
b. Presente los gráficos del cubo en ambas perspectivas.
Una vez definidas las matrices A, D, P 1 y P 2 en MATLAB, los gráficos del cubo en ambas
perspectivas se generan con los comandos:
>> plotobj8(A,P1*D)
6
8. 2.5 Coordenadas Homogéneas
Observar que si la matriz de datos D para N puntos en 3D es una matriz 3 × N , la matriz de datos
de coordenadas homogéneas para los mismos puntos es una matriz 4 × N .
a. Escriba la matriz de datos de coordenadas homogéneas correspondiente a la matriz
del cubo D.
Esta nueva matriz se logra añadiendo una fila de unos al final de la matriz D (agregando un
1 a cada coordenada)
0 0 0 0 1 1 1 1
0 0 1 1 0 0 1 1
DH = 0
1 0 1 0 1 0 1
1 1 1 1 1 1 1 1
b. MATLAB Defina la matriz DH de coordenadas homogéneas para el cubo unitario.
En MATLAB el código es:
D=[0 0 0 1;0 0 1 1;0 1 0 1;0 1 1 1;1 0 0 1;1 0 1 1;1 1 0 1; 1 1 1 1]’
c. ¿Cuál es la matriz de transformación 4 × 4 para la traslación de un objeto 3D por un
vector (x, y, z)t ?
Se necesita que (a, b, c, 1) → (a + x, b + y, c + z, 1), lo cual se puede obtener multiplicando
1 0 0 x a a+x
0 1 0 y b b + y
0 0 1 z c = c + z ,
0 0 0 1 1 1
por tanto la matriz de transformación para la traslación es
1 0 0 x
0 1 0 y
0 0 1 z .
0 0 0 1
d. MATLAB Defina la función trvec(v) que utiliza el vector tridimensional v retorna la
matriz 4 × 4 para la traslación de un objeto 3d por el vector v.
El código de la función es:
f u n c t i o n [ T ]= trvec ( v )
T = eye (4);
T (1:3 ,4)= v ;
e. ¿Cuál es la matriz de transformación 4 × 4 para la rotación de un objeto 3D alrededor
del eje x en un ángulo θ?
Se tiene que el vector e1 no se altera; el vector e2 rota hasta legar a la posición (0, cos θ, sen θ)
y el vector e2 rota hasta legar a la posición (0, − sen θ, cos θ), la matriz de transformación para la
rotación alrededor del eje x es
1 0 0 0
0 cos θ − sen θ 0
.
0 sen θ cos θ 0
0 0 0 1
f. ¿Cuál es la matriz de transformación 4 × 4 para la rotación de un objeto 3D alrededor
del eje y en un ángulo θ?
Siguiendo un razonamiento similar al del literal anterior se tiene
e1 → (cos θ, 0, sen θ)t
8
9. e2 → (0, 1, 0)t
t
e3 → (− sen θ, 0, cos θ) ,
por tanto la matriz de transformación para la rotación alrededor del eje y es
cos θ 0 − sen θ 0
0 1 0 0
.
sen θ 0 cos θ 0
0 0 0 1
g. ¿Cuál es la matriz de transformación 4 × 4 para la rotación de un objeto 3D alrededor
del eje z en un ángulo θ?
Siguiendo un razonamiento similar al de los literales anteriores se tiene
e1 → (cos θ, sen θ, 0)t
t
e2 → (− sen θ, cos θ, 0)
e3 → (0, 0, 1)t ,
por tanto la matriz de transformación para la rotación alrededor del eje z es
cos θ − sen θ 0 0
sen θ cos θ 0 0
.
0 0 1 0
0 0 0 1
h. MATLAB Definir las funciones rotx(t), roty(t) y rotz(t) que toman el ángulo t y
retornan, cada una, una matriz de rotación 4 × 4 para un objeto 3d alrededor de los
ejes x, y y z, respectivamente, en un ángulo t.
El código de la función rotx(t) es:
f u n c t i o n [ Rx ]= rotx ( t )
Rx =[1 0 0 0;0 cos ( t ) - sin ( t ) 0;0 sin ( t ) cos ( t ) 0;0 0 0 1];
El código de la función roty(t) es:
f u n c t i o n [ Ry ]= roty ( t )
Ry =[ cos ( t ) 0 - sin ( t ) 0;0 1 0 0; sin ( t ) 0 cos ( t ) 0;0 0 0 1];
El código de la función rotz(t) es:
f u n c t i o n [ Rz ]= rotz ( t )
Rz =[ cos ( t ) - sin( t ) 0 0; sin ( t ) cos ( t ) 0 0;0 0 1 0;0 0 0 1];
i. ¿Cómo cambian las matrices de proyección cuando utilizamos coordenadas homogé-
neas?
Las matrices de proyección solo se alteran de la siguiente forma:
Pi 0
P iH = ,
0 1
donde 0 es el vector de ceros del tamaño correspondiente, pues la cuarta coordenada del vector
no se altera; por tanto las matrices de proyección con coordenadas homogéneas son:
P1 0
P 1H =
0 1
9
10. √ √
− 3 3
0 0
2 2
= −1
2 −12 1 0 ,
0 0 0 1
y
P2 0
P 2H =
0 1
√
− 22 1 0 0
√
= − 2 0
2 1 0 .
0 0 0 1
j. MATLAB Modificar las matrices de proyección P 1 y P 2 para que sirvan para proyectar
a 2D los puntos en coordenadas homogéneas.
Los códigos son:
>> P1H=[-sqrt(3)/2 sqrt(3)/2 0 0; -1/2 -1/2 1 0;0 0 0 1]
>> P2H=[-sqrt(2)/2 1 0 0;-sqrt(2)/2 0 1 0;0 0 0 1]
2.6 Graficar
Grafique en un solo gráfico 3 cubos trasladados y rotados en diferente manera, utilizando
cada proyección. Presente ambos gráficos.
Borrando el comando hold off de nuestra función plotobj8 e ingresando los siguientes comandos
obtenemos los gráficos requeridos:
>> plotobj8(A,P1H*trvec([0 -1.5 -2])*rotx(pi/3)*roty(pi/3)*rotz(pi/3)*DH)
>> plotobj8(A,P1H*trvec([0 1 1])*rotx(pi/2)*roty(pi/3)*rotz(0)*DH)
>> plotobj8(A,P1H*trvec([0 -3 -2])*rotx(2*pi/3)*roty(2*pi/3)*rotz(pi/3)*DH).
Nótese que la multiplicación de rotz(pi/3)*DH y todas las demás multiplicaciones de matrices,
generan los datos del cubo unidad, rotados o trasladados, por tanto el primer comando grafica un
cubo rotado π con respecto a cada eje, y luego trasladado por el vector (0, −1.5, −2)t, el resultado es:
3
2.5
2
1.5
1
0.5
0
−0.5
−1
−1.5
−3.5 −3 −2.5 −2 −1.5 −1 −0.5 0 0.5 1 1.5
10
11. Para realizar la segunda proyección solo cambiamos P 1H por P 2H, es decir
>> plotobj8(A,P2H*trvec([0 -1.5 -2])*rotx(pi/3)*roty(pi/3)*rotz(pi/3)*DH)
>> plotobj8(A,P2H*trvec([0 1 1])*rotx(pi/2)*roty(pi/3)*rotz(0)*DH)
>> plotobj8(A,P2H*trvec([0 -3 -2])*rotx(2*pi/3)*roty(2*pi/3)*rotz(pi/3)*DH).
Y el resultado es
3
2.5
2
1.5
1
0.5
0
−0.5
−1
−1.5
−2
−4 −3 −2 −1 0 1 2
11