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