Autor: Vicenç García altés.
Creación de imágenes espectroscópicas.
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 hmds en las siguientes direcciones:
· https://www.isvr.com
· https://www.tekgear.ca/HMD/
· https://www.i-glasses.com
· https://www.virtualresearch.com
· https://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 camaras 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 de 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.
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:
- la proyección para la imagen izquierda.
- los buffers de color y profundidad.
- la imagen izquierda.
- la proyección para la imagen derecha.
- el buffer de profundidad.
- la imagen derecha.
- el swap de los buffers.
Este algoritmo cambiara 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.
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.
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.
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.
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.
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 representar 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 por 480, cada una de las imágenes que se mostraran tendrán una resolución de 640 por 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 que 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.(https://www.salleurl.edu/citem/) y cecad (https://www.salleurl.edu/cecad/) de la universidad ingeniería-arquitectura la salle de Barcelona (https://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í:
https://www.SGI.com/realitycenter/index.html.
Más direcciones de interés:
· https://tav.net/3d/
· https://www.fakespacesystems.com/
· https://www.trimension-inc.com
· https://www.elumens.com/
· https://www.enxebre.es
· https://www.stereo3dcom
· https://www.3dexpo.com
· https://www.vrex.com
Saludos.