Proiezione Stereoscopica
Sistema di Realtà Virtuale e
3D Stereo Rendering
Museo
dell'Informatica
di Cesena
Andrea Bernardi ([email protected])
Stefano Cacciaguerra ([email protected])
Contenuto
Introduzione
Visione stereoscopica
Sistemi stereo passivi e attivi
Storia dei dispositivi VR
Il nostro sistema
3D Stereo Rendering
Riferimenti
Introduzione
La realtà virtuale è stata il soggetto
di molti film di fantascienza.
Nell’immaginario collettivo è associata
a videogame più immersivi.
In realtà, i sistemi VR (da più di 20 anni)
permettono la progettazione di nuove e vecchie
tecnologie incrementando i gradi di libertà
disponibili per la loro rappresentazione.
Realtà Virtuale
Howard Rheingold definisce la Realtà Virtuale (VR):
“As an experience in which a person is surrounded by a threedimensional
computer-generated representation, and is able to move around in the
virtual world and see it from different angles, to reach into it, grab it, and
reshape it.”
Un sistema di realtà virtuale fornisce una scena real-time centrata
sull’utente con head-tracking, controllo interattivo e display
binoculare.
Visione Stereoscopica
Stereoscopia significa “visione spaziale”, dalle parole greche “stereo”
che significa “spazio” e “skopein” che vuol dire “vedere”.
Gli occhi sono posizionati sul viso ad una certa distanza l’uno dall’altro
ogni occhio vede il medesimo oggetto da un’angolazione
prospettica leggermente diversa.
A questo punto interviene il cervello
• Fusione:
sovrapposizione
delle
immagini provenienti dai due occhi.
due
• Stereopsi: analisi delle differenze esistenti
tra le immagini provenienti dai due occhi a
causa del parallasse, permettendo la percezione
della profondità.
Sistemi Stereo
I sistemi stereo sono classificati in attivi e passivi :
i sistemi attivi usano occhiali con componenti elettronici
quelli passivi che ne sono sprovvisti.
Attivi
Passivi
LCD Shutter Glasses
Interlacing
Page-Flipping
Sync-Doubling
Anaglifici
Polarizzati
Sistemi Stereo Attivi
Gli occhiali utilizzati contengono componenti elettroniche.
Le immagini stereo sono presentate alternando rapidamente la scena per
l’occhio dx e sx mentre viene mascherato l’altro occhio usando occhiali
otturanti, come gli LCD shutter glasses.
Tali occhiali utilizzano diverse tecniche di switching.
Interlacing
Un singolo frame è diviso in due campi:
uno contenente le linee di scansione
dispari e l’altro quelle pari.
Le immagini per l’occhio dx e per il sx
sono divise in linee di scansione pari e
dispari.
Prima sono visualizzate le linee di
scansione pari, poi quelle dispari.
Quando il frame per l’occhio dx è
visualizzato sullo schermo, l’occhio sx è
coperto dagli occhiali e viceversa.
È usato nei sistemi televisivi
esistenti, come NTSC, PAL.
Page-Flipping
Le immagini per l’occhio dx e sx sono
mostrate alternativamente sullo schermo.
Quando il frame per un occhio è mostrato
sullo schermo, l’altro occhio è coperto.
In questo modo, entrambi le risoluzioni
verticali e orizzontali sono le stesse,
perchè i frame sono visualizzati uno per
uno sullo schermo intero.
Serve hardware ad alte prestazioni, dato
che il frame rate è dimezzato ed il monitor
deve supportare almeno 120 Hz di refresh
verticale.
Sync-Doubling
I frame per l’occhio dx e sx sono scalati
verticalmente e inseriti rispettivamente
nella metà alta e bassa dello schermo.
Non richiede alcun hardware particolare.
Cmq, adottando un sync-doubler si
possono allungare le immagini alla
dimensione naturale (la qualità non è
buona come nel page-flipping).
Sistemi Stereo Passivi
I sistemi anaglifici creano un’immagine di colori differenti per
l’occhio dx e sx.
Gli utenti vedono l’immagine usando occhiali composti da lenti
colorate.
Pro
tali occhiali costano circa 1 euro
Contro
la qualità dell’immagine è bassa
la perdita del colore
Polarizzazione
È basato sul principio della luce polarizzata.
Le immagini per l’occhio dx e sx sono separate attraverso filtri
polarizzati negli occhiali e filtri polarizzati opposti applicati ai due
proiettori.
L’onda luce non polarizzata vibra in tutte le direzioni, mentre quella
polarizzata vibra in una singola direzione.
La polarizzazione dell’onda luce in un determinato momento dipende
dall’orientamento dell’onda in quel momento.
La luce non polarizzata può essere trasformata in luce polarizzata
facendo passare l’onda luce attraverso un polarizzatore.
Inoltre l’occhio umano è poco sensibile alla polarizzazione della luce,
pertanto l’immagine non è degradata.
Polarizzazione lineare
Se la luce è polarizzata in una singola direzione (nord/sud, est/ovest o
anche diagonalmente), si dice che la luce è polarizzata linearmente.
Se l’utente cambia l’orientamento degli occhiali polarizzati
linearmente, inclinando la testa, l’orientamento della polarizzazione
dell’utente non coinciderà con quello dei filtri montati sui proiettori, e
ci sarà una perdita di informazione stereo.
Polarizzazione circolare
Usando una polarizzazione circolare si ottiene un’immagine stereo che
non è influenzata dall’inclinazione.
Occhiali con lenti polarizzate. Il
prezzo varia dai 5 ai 50 euro.
Storia dei Sistemi di VR: Prima del 1991
BOOMs forniscono una visione
binoculare tramite schermi CRT.
Head Mounted Display (HMD)
utilizzano schermi LCD di dimensioni
320x200.
Entrambi i dispositivi seguono il movimento della testa (head-tracking).
Storia dei Sistemi di VR: 1991
Il Cave Automatic Virtual Enviroment (CAVE) è considerato lo stato
dell’arte di tali sistemi. Supera le limitazioni degli HMD:
Pro
Alta risoluzione
Grande campo visivo
Display stabile
Fino a 10 persone
Head-tracking e sonoro 3D
Contro
Costa circa 10 milioni di dollari
Necessita di un team altamante
qualificato
Necessita di una stanza dedicata
Storia dei Sistemi di VR: 1994
L’ImmersaDesk è un
display stereoscopico:
fino a cinque utenti
alta risoluzione
head-tracking
facilmente installabile
trasportabile
Storia dei Sistemi di VR: 1995
L’Infinity Wall è un sistema su grande scala:
per presentazioni a più di dieci persone,
installabile in una normale classe.
Storia dei Sistemi di VR: 2002
I display autostereoscopici riproducono un effetto 3D dentro la stereo
zone senza la necessità di altri dispositivi.
Date le due prospettive un software specifico inserisce alternativamente
una linea appartenente a un’immagine e all’altra.
Storia dei Sistemi di VR: 2002
L’effetto 3D è ottenuto con un
normale monitor TFT a cui è
stata aggiunta una lens plate.
La lente riflette la luce in maniera
tale che ogni occhio dell’utente
possa vedere le righe pari o le
righe dispari.
Svantaggi:
la risoluzione orizzontale è
dimezzata.
il display non può visualizzare
tutte le immagini 2D
se l’utente si sposta dalla stereo
zone, l’immagine sarà invertita.
Storia dei Sistemi di VR: 2002
I display prodotti ora, superano quest’ultimo ostacolo cercando la
posizione degli occhi tramite infrarossi o telecamere, ma i loro prezzi
superano ancora i 10.000$.
Es:
Display autostereoscopico con
tracciamento
degli
occhi
prodotto dalla A.C.T. Kern che
trova gli occhi tramite due
telecamere montate sopra il
display (prezzo 19000$).
Storia dei Sistemi di VR: 2003
I sistemi stereo passivi forniscono delle performance sostanzialmente
diverse da un sistema CAVE ad un prezzo più ragionevole:
PC e schede video presenti nel mercato consumer
il sistema operativo Linux o Windows
Alcuni esempi: GeoWall, VizTek P1 Virtual Wall e VisBox.
Il GeoWall utilizzato per lo studio
della geografia, è possibile installarlo
con un prezzo minimo di 8.500$.
Storia dei Sistemi di VR: 2003
Il VizTek P1 Virtual Wall è più
grande di un GeoWall e fornisce la
possibilità di seguire il movimento
della testa o delle mani dell’utente.
La VisBox (50.000$) è uno schermo di
dimensioni variabili formato da tanti
blocchi di piccole dimensioni in modo
da avere un’altissima definizione.
Storia dei Sistemi di VR: 2003
La Virtual Room è lo stato dell’arte dei sistemi di visione stereoscopica
passiva adatti a un grande pubblico:
È un sistema a otto schermi,
360 gradi, proiettato da dietro.
Il prezzo di un’installazione è
circa di 500000 $ ed si trova al
Museo di Melbourne in Australia.
Il Nostro Progetto
Un sistema stereo passivo,
basato sulla polarizzazione circolare.
Hardware Impiegato
Il sistema è composta dai seguenti componenti:
workstation Intel P4 3.2 GHz, 1GB
di RAM, scheda grafica ATI Radeon
Sapphire X300 SE 128 MB di RAM
due proiettori Acer PD521 con
tecnologia DLP e 2000 Lumen
un pannello di dimensione 2,5x2 m
due filtri polarizzati circolarmente
3D Stereo Rendering
Un esempio per creare una scena stereoscopica con tale hardware
utilizzando le librerie OpenGL e GLUT.
int main(int argc, char** argv)
{
glutInit(&argc, argv);
glutInitDisplayMode(GLUT_RGB|GLUT_DEPTH|GLUT_DOUBLE);
HALF_WIDTH=SCREEN_WIDTH=glutGet(GLUT_SCREEN_WIDTH))*2;
SCREEN_HEIGHT=glutGet(GLUT_SCREEN_HEIGHT);
glutInitWindowSize(SCREEN_WIDTH,SCREEN_HEIGHT);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}
Ripasso OpenGL
void gluPerspective(GLdouble
GLdouble
GLdouble
GLdouble
void gluLookAt(GLdouble
GLdouble
GLdouble
GLdouble
GLdouble
GLdouble
GLdouble
GLdouble
GLdouble
fovy,
aspect,
zNear,
zFar)
eyex,
eyey,
eyez,
centerx,
centery,
centerz,
upx,
upy,
upz)
Metodo Toe-in
void display(void)
{
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
ratio = (GLfloat) HALF_WIDTH / SCREEN_HEIGHT;
//left screen
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, ratio, 1, 600);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(0, 0, HALF_WIDTH, SCREEN_HEIGHT);
gluLookAt(-eye_separation,
0.0,distanceobj,0.0,0.0,0.0,0.0,1.0,0.0);
glPushMatrix();
DrawModel();
glPopMatrix();
…
Metodo Toe-in
//right screen
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60, ratio, 1, 600);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glViewport(HALF_WIDTH,0,HALF_WIDTH,SCREEN_HEIGHT);
gluLookAt(eye_separation,
0.0,distanceobj,0.0,0.0,0.0,0.0,1.0,0.0);
glPushMatrix();
DrawModel();
glPopMatrix();
glutSwapBuffers();
}
Metodo Toe-in
Parallel Axis Asymmetric
Frustum Perspective Projection
Il metodo che riproduce correttamente il nostro sistema visivo è
chiamato “proiezione prospettica asimmetrica ad assi paralleli.”
In questo caso il vettore vista per ogni camera è parallelo ed è utilizzata
la glFrustum() per descrivere la proiezione prospettica.
void glFrustum(GLdouble
GLdouble
GLdouble
GLdouble
GLdouble
GLdouble
left,
right,
bottom,
top,
near,
far)
Parallel Axis Asymmetric
Frustum Perspective Projection
void display(void)
{
xyz r;
double ratio,radians,wd2,ndfl;
double left,right,top,bottom;
double lnear=0.1;
double lfar=10000;
lnear = camera.focallength / 5;
ratio = (double) HALF_WIDTH / SCREEN_HEIGHT;
radians = DTOR * camera.aperture / 2;
wd2
= lnear * tan(radians);
ndfl
= lnear / camera.focallength;
CROSSPROD(camera.vd,camera.vu,r);
Normalise(&r);
r.x *= camera.eyesep / 2.0;
r.y *= camera.eyesep / 2.0;
r.z *= camera.eyesep / 2.0;
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
…
Parallel Axis Asymmetric
Frustum Perspective Projection
…
//left screen
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
left = - ratio * wd2 - 0.5 * camera.eyesep * ndfl;
right =
ratio * wd2 - 0.5 * camera.eyesep * ndfl;
top
=
wd2;
bottom = - wd2;
glFrustum(left,right,bottom,top,lnear,lfar);
glViewport(0, 0, HALF_WIDTH, SCREEN_HEIGHT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(camera.vp.x+r.x,camera.vp.y+r.y,camera.vp.z+r.z,
camera.vp.x + r.x + camera.vd.x,
camera.vp.y + r.y + camera.vd.y,
camera.vp.z + r.z + camera.vd.z,
camera.vu.x,camera.vu.y,camera.vu.z);
glPushMatrix();
DrawModel();
glPopMatrix();
Parallel Axis Asymmetric
Frustum Perspective Projection
…
//right screen
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
left = - ratio * wd2 + 0.5 * camera.eyesep * ndfl;
right =
ratio * wd2 + 0.5 * camera.eyesep * ndfl;
top
=
wd2;
bottom = - wd2;
glFrustum(left,right,bottom,top,lnear,lfar);
glViewport(HALF_WIDTH, 0, HALF_WIDTH, SCREEN_HEIGHT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
gluLookAt(camera.vp.x-r.x,camera.vp.y-r.y,camera.vp.z - r.z,
camera.vp.x - r.x + camera.vd.x,
camera.vp.y - r.y + camera.vd.y,
camera.vp.z - r.z + camera.vd.z,
camera.vu.x,camera.vu.y,camera.vu.z);
glPushMatrix();
DrawModel();
glPopMatrix();
glutSwapBuffers();
}
Parallel Axis Asymmetric
Frustum Perspective Projection
Riferimenti
Sito di P. Bourke
http://astronomy.swin.edu.au/%7Epbourke/stereographics/
GeoWall Consortium
http://geowall.geo.lsa.umich.edu/
GLUT Library
http://www.xmission.com/~nate/glut.html
OpenGL® Programming Guide