Está en la página 1de 52

Geometría Proyectiva

Héctor Navarro
Geometría Proyectiva

• Es el estudio de propiedades geométricas


que son invariantes bajo transformaciones
proyectivas
Plano proyectivo

• Si consideramos en el modelo de
proyección dos líneas paralelas, estas se
encuentran en un punto
Plano proyectivo

• Si consideramos otra recta paralela a las


anteriores, las tres rectas se encuentran
en el mismo punto
Plano proyectivo

• Para cada familia de rectas paralelas en el


plano, se añade un nuevo punto
• La relación de paralelismo entre rectas es
una relación de equivalencia (reflexiva,
simétrica y transitiva)
• Esta relación divide el conjunto de todas
las rectas en el plano en clases de
equivalencia mutuamente excluyentes
Espacio proyectivo

• La idea anterior puede extenderse a tres


dimensiones
• Dos rectas paralelas tienen el mismo punto ideal
asociado
• Dos planos paralelos comparten una misma
línea ideal
• Si tomamos la línea ideal de cada clase de
equivalencia y agrupamos todas estas líneas
ideales, obtenemos un plano ideal asociado al
espacio euclideano R3
Proyección paralela (u ortográfica)

• En las proyecciones paralelas las líneas


paralelas en el espacio siguen siendo
paralelas en el plano de proyección
• Una proyección paralela corresponde a
una proyección perspectiva en donde la
cámara está situada a distancia infinita del
plano de proyección
• Bajo proyecciones paralelas, dos objetos
del mismo tamaño a distintas distancias
tienen proyecciones del mismo tamaño
Proyección paralela
Transformaciones en espacio de mundo

• Antes de proyectar los objetos, bien sea


en perspectiva o paralela, estos suelen
transformarse así como se hacía con los
objetos 2D. Para esto se aplican
transformaciones de rotación,
escalamiento y traslación, las cuáles se
representan mediante matrices de 4x4
(usando coordenadas homogéneas)
Visualización 3D

• El proceso de visualización 3D es
inherentemente más difícil que el proceso
de visualización 2D ya que implica mostrar
objetos en 3D en un dispositivo 2D
• Para esto se utiliza la proyección del
mundo 3D a visualizar sobre un plano 2D
Visualización 3D

Proyección del
objeto sobre el
plano

Objeto 3D (coordenadas de mundo)

Plano de Proyección Π
Visualización 3D

• En este caso el ojo (cámara) puede estar


en cualquier posición del mundo 3D, y
puede estar viendo en cualquier dirección.
El plano de proyección puede igualmente
estar en cualquier posición del mundo 3D
Visualización 3D
Otra forma de ver el proceso de visualización 3D es el siguiente:

Pirámide de Visualización truncada


y
(View Frustum)

Ojo (0, 0, 0)
x
z
Visualización 3D

Plano lejano (far)

y
Plano cercano (near)

Ojo (0, 0, 0)
x Dirección de visualización (0, 0, -1)
z
Visualización 3D
Los objetos fuera de la pirámide de visualización son
descartados (no son dibujados)

Plano lejano (far)

y
Plano cercano (near)

Ojo (0, 0, 0)
x Dirección de visualización (0, 0, -1)
z
Visualización 3D
El plano cercano tiene los límites que se muestran:

Plano lejano (far)

t (top)

l (left)
r (right)

y b (bottom)

Ojo (0, 0, 0)
x Dirección de visualización (0, 0, -1)
z
Visualización 3D
El plano cercano tiene los límites que se muestran:

Plano lejano (far)

(l,t,-n)

(r,t,-n)
(l,b,-n)
y
(r,b,-n)

Ojo (0, 0, 0)
x Dirección de visualización (0, 0, -1)
z
Visualización 3D
Veamos la pirámide de visualización desde arriba (plano XZ)

p(x,y,z)

¿Cuáles serán las coordenadas


del punto p proyectado sobre el
X plano near?
Visualización 3D
Veamos la pirámide de visualización desde arriba (plano XZ)

(0,0,0)
p’(x’, y’, z’)
p(x,y,z)

¿Cuáles serán las coordenadas


del punto p proyectado sobre el
X plano near?
Visualización 3D

• Como p’ está sobre el plano near, su


coordenada z debe ser –n (z’=-n)
• Por triángulos semejantes podemos ver
que:

(0,0,0)
Visualización 3D

• Como p’ está sobre el plano near, su


coordenada z debe ser –n (z’=-n)
• Por triángulos semejantes podemos ver
que:
a c
b = d

c d
b
a
Visualización 3D

• Es decir:
z x
−n = x′
Luego:
x′ = −nx
z

• De forma análoga puede verse que:


z y
−n = y′
Luego:
y′ = −ny
z
Visualización 3D

• Llegamos entonces a:
(x’, y’, z’) = (-n·x/z, -n·y/z, -n)
• Así como en 2D se usaban coordenadas
homogéneas para representar las traslaciones
como multiplicación de matrices, en 3D haremos
lo mismo
• Así, a cada punto 3D que deseemos proyectar
debemos agregarle una cuarta coordenada h=1
• Quisiéramos entonces poder representar la
proyección de un punto en coordenadas de
mundo al plano de proyección como una matriz
M4x4
Visualización 3D

• Esta matriz de proyección tiene la forma:


 
m11 m12 m13 m14
 m21 m22 m23 m24 
 
 m31 m32 m33 m34 
m41 m42 m43 m44

• Cada punto p (x,y,z,h) será proyectado


multiplicando:
    
xc m11 m12 m13 m14 x
 yc   m21 m22 m23 m24   
    y 
 zc  =  m31 m32 m33 m34   z 
hc m41 m42 m43 m44 h
Visualización 3D
• En este punto repasaremos los tipos de
coordenadas:
• Coordenadas de mundo (x,y,z,h) son las
coordenadas de los objetos en el espacio 3D
• Coordenadas de proyección (x’, y’, z’, h’) son las
coordenadas proyectadas sobre el plano Near.
También llamadas coordenadas de recorte (clip)
(xc, yc, zc, hc)
• Coordenadas normalizadas (xn, yn, zn) ya no
están en coordenadas homogéneas. Los
valores de cada coordenada están entre -1 y 1
para puntos dentro de la pirámide de
visualización
Visualización 3D

• Quisiéramos además que los valores al


ser proyectados estén entre -1 y 1 (si
están dentro de la pirámide de
visualización), es decir debemos mapear
el rango (l, r) a (-1, 1) y (b, t) a (-1, 1)
• Los valores xn, yn, zn deben estar
entonces en el rango (-1, 1) siempre que
el punto original estaba dentro de la
pirámide de visualización
Visualización 3D

• Como dijimos anteriormente, deseamos


mapear el rango (l, r) al rango (-1, 1).
Gráficamente esto puede verse como la
recta siguiente: x
n

(r, 1)

x’

(l, -1)
Visualización 3D

• La recta tiene ecuación y=mx+b, o en este


caso: xn = (1-(-1))/(r-l)x’ + b
2
xn = r−l x′ +b

xn

(r, 1)

x’

(l, -1)
Visualización 3D

• De aquí, podemos reemplazar (x’, xn) por


(r, 1) para obtener el valor de b:
2
1 = r−l r+b
2
b = 1 − r−l r
b = r−l
r−l − 2r
r−l
−r−l
b = r−l
r+l
b = − r−l
Visualización 3D

• Luego, reemplazando b:

2x′ r+l
xn = r−l − r−l

• Análogamente para y:

2y′ t+b
yn = t−b − t−b
Visualización 3D

• Recordemos que:
−nx
x′ = z y
−ny
y′ = z

• Reemplazando esta ecuación de x’ en la


ecuación anterior:
2x′ r+l 2 −nx r+l
xn = r−l − r−l = z
r−l − r−l
Visualización 3D
• Desarrollando esta ecuación:
Visualización 3D
• Análogamente para y:

De aquí podemos obtener algunos valores de la matriz de proyección


(visualización):

 2n r+l 
r−l 0 r−l 0
 0 2n t+b
0 
 t−b t−b 
 m31 m32 m33 m34 
0 0 −1 0

Esto hará
que hc=-z
Visualización 3D
• Nos falta únicamente obtener los valores para m31, m32, m33 y m34
• Recordemos que:
    
xc m11 m12 m13 m14 x
 yc   m21 m22 m23 m24   
 =  y 
 zc   m31 m32 m33 m34   z 
hc m41 m42 m43 m44 h

• Luego, zn = (x m31 + y m32 + z m33 + h m34)/-z


• No tiene sentido que el valor de zn dependa de x o y, por lo que m31 = m32 =
0, y obtenemos:
zn = (z m33 + h m34)/-z
• Además h = 1 en coordenadas de mundo
zn = (z m33 + m34)/-z
• Ahora bien, el valor de zn también debe estar normalizado entre -1 y 1
• En particular, cuando z=-n, zn=-1 y cuando z=-f, zn=1
Visualización 3D
• De aquí:

−1 = −nm33n+m34
1 = −f m33f +m34
Luego:
m34 = nm33 − n
m34 = f m33 + f
Igualando:
nm33 − n = f m33 + f
m33 (f − n) = −(f + n)
m33 = − ff −n
+n

Calculamos ahora m34 :


m34 = nm33 − n = −n ff −n
+n
− n = −n ff −n
+n
− n ff −n
−n
−nf −n2 −nf +n2
= f −n = − f2nf
−n
Visualización 3D
• Luego, la matriz de proyección será:

 2n r+l 
r−l 0 r−l 0
 0 2n t+b 
 t−b t−b 0 
 0 0 − ff −n
+n
− f2nf
−n

0 0 −1 0

Recordemos que a cada punto es necesario aplicarle esta matriz para


obtener coordenadas de recorte. Estas coordenadas de recorte están
en coordenadas homogéneas, y deben normalizarse dividiendo por la
cuarta componente:
   xc 
xn hc
 yn  =  yc 
hc
zc
zn hc
Visualización 3D

• Pero ¿qué pasa si deseamos mover la


cámara? ¿Si deseamos mirar hacia arriba,
o simplemente movernos hacia delante?
• Movernos una unidad hacia delante es
equivalente a mover todo el mundo una
unidad hacia atrás
• Mirar 15 grados hacia arriba es
equivalente a rotar el mundo 15 grados
hacia abajo
Visualización 3D
Visualización 3D
Visualización 3D
Visualización 3D
Visualización 3D
Visualización 3D
•Una vez que tenemos las coordenadas
normalizadas, estas deben mapearse a la
ventana que tiene dimensiones w, h
•Recordemos que las coordenadas
normalizadas están entre -1 y 1
•¿Cómo debe hacerse esta transformación?
Matrices de modelado

• Antes de tener los objetos en


coordenadas de mundo, a estos se les
suelen aplicar operaciones de traslación,
escalamiento y rotación para ubicarlos en
su posición dentro del mundo
• Cuando se construyen los objetos estos
suelen estar centrados alrededor del
punto (0, 0, 0) y pueden tener distintas
escalas. Por esto es necesario aplicar
estas transformaciones
Matrices de modelado

• Las coordenadas en que se encuentran


los objetos apenas son cargados de
conocen como coordenadas de objeto,
que luego son transformadas a
coordenadas de mundo
Matrices de modelado

• De esta forma, si un objeto se repite varias


veces, no es necesario tener varias copias del
objeto, sino que se tiene una sola copia y se le
aplica distintas transformaciones
• Por ejemplo, las ruedas de un carro, o sillas
dentro de una sala
• Los personajes que se mueven dentro del
mundo virtual no cambian su geometría, sino
que cambian las transformaciones que se le
aplican
Visualización 3D

Objeto 3D Objeto 2D Objeto 2D


Objeto 3D Objeto 3D
proyectado normalizado en la ventana
(coordenadas de (coordenadas de
(coordenadas de (coordenadas (coordenadas
objeto) mundo)
recorte) normalizadas) de dispositivo)
Visualización 3D en OpenGL
•OpenGL maneja por separado la matriz de
proyección y la matriz de modelado
•Provee funciones para cargar directamente
una matriz de proyección o modelado
•Otras funciones de alto nivel permiten
especificar el frustum glFrustum(l,r,b,t,n,f), la
perspectiva gluPerspective(fovy, aspect, n, f)
Visualización 3D en OpenGL
•fovy es Field of View, es el ángulo entre los
planos top y bottom
•Aspect es el radio aspecto del frustum, esto
es, la relación entre el ancho y el alto
top

Y alto
Z fov

near
ancho
far
bottom
Visualización 3D en OpenGL
•OpenGL provee también otra función muy útil
llamada gluLookAt para controlar la cámara:
•gluLookAt(x, y, z, cx, cy, cz, ux, uy, uz)
•x,y,z especifica la posición de la cámara
•cx, cy, cz especifica hacia donde está viendo
la cámara
•ux, uy, uz es un vector que especifica hacia
donde está el vector up (arriba) de la cámara
Visualización 3D en OpenGL
•Otras funciones útiles de OpenGL para
trabajar con la cámara son:
•glMatrixMode(t)
•glLoadIdentity()
•glRotatef(angle, x, y, z)
•glTranslatef(tx, ty, tz)
•glScalef(sx, sy, sz)
Resumen (o que hay que hacerle a cada
vértice)
• Cada vértice v es extendido a coordenadas
homogéneas añadiéndole una 4ta coordenada con valor
h=1
• Este punto v ahora es multiplicado por la matriz de
modelado (coordenadas de mundo)
• El punto ahora es multiplicado por la matriz de
proyección (coodenadas de recorte)
• El punto es normalizado dividiendo las tres primeras
componentes entre la 4ta componente (división
perspectiva)
• Se obtiene como resultado un punto (sx, sy, dz)
• sx, sy son llevados a coordendas de dispositivo para
poder dibujarse, y dz se utiliza como medida de la
distancia del punto original al ojo

También podría gustarte