Perspectiva: disminución del tamaño con la distancia

Primera publicación: 2004-02-21
Último cambio: 2006-08-01

En esta página aprenderemos las sencillas reglas matemáticas que nos permiten representar en una pantalla plana (como la de nuestro monitor) un objeto en perspectiva.  En un objeto en perspectiva las partes más alejadas aparecen más pequeñas.  Básicamente esto se consigue multiplicando las coordenadas "x" e "y" de cada punto por la inversa de la distancia de cada punto (coordenada "z") a la pantalla que observamos.

De acuerdo con esto, un punto muy lejano (muy profundo), se multiplicará por una cantidad muy pequeña y aparecerá pequeño y centrado.  Por el contrario, un punto muy cerca de la pantalla se multiplicara por un número muy grande y tenderá a "salirse" de nuestro marco con facilidad.  Muy cerca de la pantalla, la posición del punto variará mucho, recordemos que la función 1/z es una hipérbola cuya variación es muy grande cerca de z = 0.

 

Figura 1: cuanto más alejado, más pequeño se ve

 

Dadas las 3 coordenadas de un punto cualquiera perteneciente a la figura:

x[i],  y[i]  y  z[i]

Y dada también una constante a la que llamaremos "distancia del observador" ó "do", que debe ser al menos del orden del tamaño del punto más alejado de la figura al centro...

En la figura de la izquierda: do = 0.7*ancho.  El ancho de nuestra ventana en píxels es "ancho".  La ventana en la figura 1 tiene un ancho = 400 pixels.

Para cada punto:

do = ancho * 0.7
...
 kz = do / (do + z[i])
 x = x[i] * kz + offset_x
 y = y[i] * kz + offset_y
 ...

donde "x" e "y" son las coordenadas de la pantalla donde debemos dibujar el punto (si lo que queremos es dibujar una línea necesitamos aplicar esta porción de código a dos puntos).

Si hacemos a "do" más pequeño multiplicando el ancho de la pantalla por una constante menor que 0.7, la sensación de perspectiva se hace más acusada: las partes del objeto más cercanas al observador crecen grandemente y las más alejadas disminuyen de tamaño rápidamente.  Pero si lo hacemos demasiado pequeño, entonces el denominador de la constante "kz" puede llegar a hacerse cero e incluso cambiar de signo y entonces las partes más cercanas del objeto se hacen primero enormes y luego "pasan" al otro lado de la pantalla invertidas.

Por el contrario, si hacemos a "do" grande multiplicando el ancho de la pantalla por una constante mayor que 0.7, la sensación de perspectiva se hace cada vez menor y las partes cercanas y alejadas del objeto aparecen de similar tamaño.

Hay que experimentar un poco con el valor 0.7 y observar cuál es el que mejor se adapta a nuestro objeto a dibujar.  El valor escogido en este ejemplo (0.7) es adecuado si los valores z[i] de cada punto del objeto oscilan positiva y negativamente con respecto al punto central de la figura al que damos el valor 0, y siempre que la figura quepa en la pantalla "a lo ancho".  También es suficiente si la figura rota y alguna "esquina" se puede acercar a la pantalla.

Para ello, la variable "do" debe ser de un tamaño tal que el denominador de la constante "kz", tenga siempre el mismo signo, es decir, que (do + z[i]) sea siempre positivo o siempre negativo, para cualquier valor de una coordenada z[i] perteneciente al objeto a dibujar.

El centro de la figura está en x[i] = 0,  y[i] = 0  y  z[i] = 0.  Como el origen de coordenadas suele estar en el extremo superior izquierdo de la ventana, es necesario añadir las variables offset_x = ancho/2 y offset_y = alto/2 para centrar al objeto en pantalla.

La constante "do" debe ser pequeña para que la sensación de perspectiva se note, pero también debe ser lo suficientemente grande como para que las partes del objeto más cercanas, nunca lleguen a tocar o a sobrepasar la pantalla.  Hay que tener esto en cuenta si nuestra figura puede rotar, por ejemplo.

Y recordemos que a la hora de representar un objeto en tres dimensiones en la pantalla, solo se usan las coordenadas "x" e "y" y que la coordenada "z" de cada punto (la profundidad) se descarta, ¡aunque nosotros hemos aprendido a usarla aquí para dar sensación de perspectiva!

Aquí puedes ver un applet donde se aplica esta teoría sobre la perspectiva al fractal de la figura 1