Autor: Vicenç Garcia Altès

Fecha: 30-04-01

 

CREACIÓN DE IMÁGENES ESTEREOSCÓPICAS

Introducción

 

La realidad virtual es uno de los medios más avanzados para la interacción hombre-máquina. Uno de los factores más importantes para la consecución de esta inmersión es el hecho de poder disponer de imágenes estereoscópicas, es decir, de tener imágenes 3D “reales” con sensación de profundidad. Para conseguir este tipo de imágenes necesitaremos de unos dispositivos adicionales. Estos pueden ser desde unas simples gafas de dos colores, hasta un equipo más complejo del estilo de un HMD (Head Mounted Display).

 

Tenemos distintos referentes de HMD’s en las siguientes direcciones:

 

·        http://www.iisvr.com

·        http://www.tekgear.ca/hmd/

·        http://www.i-glasses.com

·        http://www.virtualresearch.com

·        http://www.keo.com/

 

Todos estos periféricos se basan en cómo percibe el cerebro humano la sensación de profundidad, que es lo que diferencia una imagen estereoscópica de una monoscópica. El SVH (Sistema Visual Humano) capta la información visual del mundo a través de los ojos. Por lo tanto, podemos decir que capta dos imágenes del mundo. Estas dos imágenes son prácticamente iguales, sólo se diferencian en el hecho que están captadas desde dos “cámaras” situadas en dos posiciones distintas. Gracias a la información que obtenemos de esta diferencia entre las dos imágenes, el SVH es capaz de reconstruir el mundo que tiene delante, en tres dimensiones.

 

Por lo tanto, una aplicación que dé al usuario sensación total de profundidad, vendrá caracterizada por que cada ojo del usuario reciba una información un tanto “personalizada”. Concretamente necesitamos producir dos imágenes iguales con un pequeño desplazamiento horizontal entre ellas. Se hace así para evitar que los ojos trabajen de una forma incoherente, y evitar así una sensación desagradable cuando se observan las imágenes estereoscópicas.

 

Tipos de formato

 

Según el periférico que utilicemos necesitaremos un formato u otro para mostrar por pantalla nuestras imágenes. No es lo mismo producir imágenes para unas gafas de dos colores que para un HMD.

 

Sin embargo, todos ellos parten de un algoritmo genérico en común, que es el siguiente:

 

  1. Activar la proyección para la imagen izquierda.

  2. Limpiar los buffers de color y profundidad.

  3. Dibujar la imagen izquierda.

  4. Activar la proyección para la imagen derecha.

  5. Limpiar el buffer de profundidad.

  6. Dibujar la imagen derecha.

  7. Hacer el “swap” de los buffers.

 

Este algoritmo cambiará un poco según el formato de imagen que utilicemos. Veamos algunos de los posibles formatos posibles y las modificaciones a realizar sobre el algoritmo genérico.

 

Anaglifos

 

Este formato se basa en aprovechar que el usuario lleva puestas unas gafas con filtros de color para dibujar dos imágenes, una de cada color, desplazadas (shiftadas) una respecto a la otra. Esto hará que cada ojo sólo vea una imagen, ya que la otra será absorbida por el color del cristal.

 

Hay tres maneras de codificar un anaglifo:

color: intentan preservar el máximo de la información de color de la imagen original. No todas las imágenes se verán bien como anaglifo de color, pero puede llegar a ser muy espectacular.

 

gris: utilizan una versión en blanco y negro de la imagen original. Generalmente es más fácil de ver que el anaglifo de color.

 

puro: convierten la imagen original en una imagen de sólo dos colores, ya sea rojo y azul, rojo y verde o rojo y “cyan”.  

 

Figura 1: Muestra de anaglifo.

Ver el código de ejemplo

 

Page flipped

 

Utiliza una característica especial de algunas tarjetas de vídeo que pueden cambiar rápidamente entre las imágenes derecha e izquierda. Se tienen que utilizar unas gafas especiales (hechas con cristal líquido) para visualizar este tipo de imágenes. Éstas son capaces de tapar un ojo con rapidez, sincronizándose con el monitor para que, cuando éste muestre la imagen izquierda se tape el ojo derecho y cuando muestre la derecha, se tape el izquierdo. Si este proceso se hace a una velocidad elevada, tendremos la sensación de ver una imagen estereoscópica, aunque podemos tener problemas de flickering (parpadeo) y de crosstalk (persistencia) de las imágenes.

 

Notar que se entiende por persistencia el molesto efecto que se produce cuando las gafas tapan un ojo, pero éste sigue viendo la imagen anterior.

 

Este método engloba varios formatos, de los que veremos dos.

 

Formato Above-Below

 

Este es el formato que utiliza stereographics para sus crystaleyes. Este formato consiste en mapear el subcampo del ojo izquierdo comprimido verticalmente en la parte superior de nuestro monitor y el subcampo del ojo derecho comprimido también verticalmente en la parte inferior de nuestro monitor.

 

Figura 2: Muestra del formato Above-Below.

 

Hay un detalle a tener en cuenta para realizar este tipo de imágenes: cada escaneo vertical del monitor incluye centenares de líneas de escaneo horizontales visibles, seguidas de 20 a 40 de invisibles. Estas líneas invisibles se dibujan mientras el haz de electrones que escanea la imagen vuelve al principio de la pantalla. Así pues, necesitamos añadir un área de “blanking” entre los dos subcampos. Esta área de “blanking” tendrá el mismo tamaño que el intervalo de “blanking” vertical normal.

 

Formato de vídeo Side-by-Side

 

Este formato lo desarrolló también stereographics para solventar el problema que tenía el formato Above-Below para vídeo: el bajo número de líneas de rasterización.

 

La idea es muy parecida a la del formato Above-Below pero, en lugar de tener las dos imágenes apiladas (una encima de la otra), las colocan una al lado de la otra. Así se aprovechan todas las líneas de rasterización.

 

Formato Line Interlaced

 

Este es el formato más antiguo para la creación de imágenes estereoscópicas para vídeo, aunque ahora también se utiliza en HMDs. Se basa en la utilización de los campos par e impar de un monitor para insertar cada una de las dos imágenes de las que se compone una imagen estereoscópica. Es decir, que en el campo par se dibuja la imagen correspondiente al ojo derecho y en el impar la correspondiente al ojo izquierdo, o al revés.

 

Cómo podréis ver, esto supone un problema en cuanto a la resolución vertical de nuestras imágenes, que se ve reducida a la mitad. Si nuestro monitor trabaja a una resolución de 640 x 480, cada una de las imágenes que se mostrarán tendrán una resolución de 640 x 240, ya que se han repartido las líneas verticales entre las dos imágenes.

 

Y cómo conseguir este tipo de imágenes? Pues ahora lo veremos, aunque para más detalles os remito al código adjunto.

 

Cómo ya os he explicado, lo que tenemos que conseguir es tener en el campo par una de las imágenes y en el impar la otra, cada una de ellas con su diferente perspectiva. Por lo tanto, y como siempre hacemos, tenemos que separar la rutina de pintado en dos partes: una para pintar la imagen derecha y la otra para pintar la imagen izquierda.

 

Pero antes tenemos que dejarlo todo preparado para poder dibujar cada imagen en su campo, y esto lo haremos con el buffer de “stencil”, de OpenGL en este caso. Con éste podemos indicar qué partes del buffer de color queremos que realmente se dibujen y cuáles no. Este buffer se utiliza bastante, por ejemplo en la creación de espejos.

 

Por tanto en el buffer de “stencil” tenemos que crear un patrón (máscara) para poder dibujar las dos imágenes tal como queremos. Este patrón estará formado por líneas negras y blancas colocadas de forma consecutiva, es decir, primero una negra y después una blanca.

 

Una vez tengamos el patrón en el buffer de “stencil”, ya podemos pasar a dibujar las dos imágenes. Como siempre lo primero que haremos será activar la proyección adecuada para la imagen que nos disponemos a dibujar (recordad que una respecto a otra sólo tienen que estar desplazadas horizontalmente). Después podemos pasar al dibujo en sí. Tenemos que mirar el valor del buffer de “stencil” en cada línea y dibujar, o no, la imagen. Por ejemplo, si el buffer tiene un valor de 1 dibujaremos la imagen derecha y si vale 0 dibujaremos la imagen izquierda.

 

Una vez dibujada toda la imagen ya podemos hacer el swap de los buffers.

 

Figura 3: Muestra de formato Line-Interlaced.

 

La captura procede del motor 3D que se está desarrollando conjuntamente por los centros CITeM (http://www.salleurl.edu/citem/) y CeCAD (http://www.salleurl.edu/cecad/) de la universidad Ingeniería-Arquitectura La Salle de Barcelona (http://www.salleurl.edu).

 

Formato Dual Stream

 

Es el formato que da mejores resultados. Se basa en tener un “stream” para cada display. Así no tenemos que estar preocupados por perder resolución o frecuencia de refresco, sino que tenemos todas las prestaciones en cada ojo.

 

Por supuesto el “pequeño” problema que tenemos es la necesidad de tener una máquina potente para servir los dos “streams” en tiempo real, en concreto se suele utilizar una estación de altas prestaciones como por ejemplo una Onyx de Silicon Graphics.

 

Podéis verlos vosotros mismos aquí:  

  http://www.sgi.com/realitycenter/index.html

 

Más direcciones de interés:

 

·        http://tav.net/3d/

·        http://www.fakespacesystems.com/

·        http://www.trimension-inc.com

·        http://www.elumens.com/

·        http://www.enxebre.es

·        http://www.stereo3d.ocm

·        http://mysak.umbr.cas.za/~husakm/Public/VFX3D_headtracking/Headtracking.html

·        http://www.users.red3i.es/~stereoweb/

·        http://www.3dexpo.com

·        http://www.vrex.com

 

 

Saludos!