2013-06-14 14 views
6

Ho un programma in cui posso eseguire il rendering di una scena su uno schermo in base alla posizione dell'utente. Quando l'utente cambia posizione, il tronco si modifica per dare la proiezione fuori asse. Voglio utilizzare la tecnica di lavorare su tre diversi display cucire insieme una scena più grande, con qualcosa del tipo seguente:
Creazione di una scena cucita usando glFrustum

enter image description here Immaginate una grande scena del mondo reale reso attraverso i tre display. I tre display dovrebbero mostrare la scena come apparirebbe con una prospettiva modificata su ciascun display in base alla posizione dell'utente. Sono in grado di farlo con un display per eseguire il rendering di una scena in base alla posizione dell'utente, ma non riesco a pensare al metodo per farlo funzionare su tre schermi.

proiezione La classe fuori asse che ho creato fondamentalmente esegue le seguenti operazioni:

customCam::project(){ 
pushMatrices(); 
glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 
     glFrustum(leftNear.x, rightNear.x, bottomNear.y, topNear.y, _near, _far); 
    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
    gluLookAt(uPos.x, uPos.y, 0, uPos.x, uPos.y, -1, 0, 1, 0); //neglect z scaling for now. In the main program, it's there 
    glTranslatef(0, 0, uPos.z); 
} 

Come faccio a Stich i tre tronco di cono in modo tale che la scena sembra continuo come nel mondo reale? Attualmente, un utente della classe disegna una scena come segue:

cstCam.project(); 
    //draw something here 
popMatriceS(); //which were pushed before glFrustum projection 

EDIT: Nel mio caso, a definire tre tronchi di cono per un utente (tenendo utente accoutn e schermo angoli per tutti i display nella stessa cornice di riferimento), ho fatto la seguente:

custCam1.project(); 
//draw scene here. eg: two walls at the far left and right screen 
drawWalls(); 
popMatrices(); 
custCam2.project(); 
drawWalls(); 
popMatrices(); 
custCam3.project(); 
drawWalls(); 
popMatrices(); 

void drawWalls(){ 
//Left most corner screen wall 
glBegin(GL_QUADS); 
glVertex3f(-1.5*PHWIDTH, HEIGHT/2, 0); //where PHWIDTH, HEIGHT is the physical width/height of each screen 
glVertex3f(-1.5*PHWIDTH, HEIGHT/2, -50); 
glVertex3f(-1.5*PHWIDTH, -HEIGHT/2, -50); 
glVertex3f(-1.5*PHWIDTH, -HEIGHT/2, 0); 
glEnd(); 

//Right most corner screen wall 
glBegin(GL_QUADS); 
glVertex3f(1.5*PHWIDTH, HEIGHT/2, 0); //where PHWIDTH, HEIGHT is the physical width/height of each screen 
glVertex3f(1.5*PHWIDTH, HEIGHT/2, -50); 
glVertex3f(1.5*PHWIDTH, -HEIGHT/2, -50); 
glVertex3f(1.5*PHWIDTH, -HEIGHT/2, 0); 
glEnd(); 
} 

risposta

1

Questo non è così difficile come potrebbe sembrare. Si consideri la seguente immagine (i tre schermi guardato dall'alto a livello znear)

Screens from above

I presume che ogni schermo estende 2 unità nella direzione x alla distanza znear. Potrebbe essere necessario ridimensionare questo valore in base alla scena.

L'intervallo per la coordinata y non cambia per le tre schermate, poiché si trovano nella stessa posizione verticale.

Quindi sono necessarie tre matrici di proiezione diverse per gli schermi. Determinare l'offset è piuttosto semplice. Hai solo bisogno le differenze al punto di fotocamera:

left screen => [-3 - camera.x, -1 - camera.x] 
center screen => [-1 - camera.x, 1 - camera.x] 
right screen => [1 - camera.x, 3 - camera.x] 

Naturalmente, è necessario la posizione della fotocamera nello spazio gli schermi come in figura.

La matrice di visualizzazione può essere arbitraria, ma dovrebbe essere la stessa per tutte e tre le schermate. Questa volta, passa la posizione della videocamera nello spazio scena a gluLookAt.

+0

Ho modificato il mio post per aggiungere un po 'più di dettagli su ciò che sono riuscito a ottenere. Fondamentalmente ero in grado di trovare gli offset di tutti gli angoli degli schermi dalla posizione dell'utente e quindi usare la mia funzione 'cstCam :: project' definiva tre matrici di proiezione diverse per queste tre schermate. Usando il codice che ho postato nella modifica sopra, ho provato a simulare lo stesso sul mio schermo (tre diverse finestre) e ho ottenuto i seguenti risultati: 1) Utente al centro di tre schermi http://i.imgur.com/u9O65G8 .png, 2) L'utente si muove verso destra: http://i.imgur.com/6bxY0R3.png – user1240679

+0

Nella seconda schermata che vedresti, quando l'utente si sposta verso destra, il muro dalla prima telecamera inizia a mostrarsi nel secondo schermo e non forma una scena continua. Tuttavia, quello che non sono sicuro è se questo ha qualcosa da fare per vedere la matrice è la stessa in quelle tre scene come ho fatto sopra?Inoltre, se questo è il caso, non sono in grado di discernere il motivo per cui dovrebbe esserci una sola matrice modelview per tutti e tre. Sarebbe bello leggere una spiegazione dalla tua parte sullo stesso. – user1240679

+0

Dovrebbe esserci una sola matrice di visualizzazione (modello), poiché esiste un solo punto di vista, il punto di vista è identico in tutti e tre i casi. La tua direzione di visualizzazione è identica per ciascuno dei display (perpendicolare al piano dello schermo, quindi è sufficiente definire un trofeo asimmetrico per schermo. Gli screenshot suggeriscono che non lo fai correttamente ... – derhass

Problemi correlati