2015-07-15 4 views
2

j'avoir un programme qui lit un panorama 360 mono et lit un IMU, en tirant la partie correcte du panorama sur la base de l'emplacement de la tête.rendu deux se chevauchent FOV utilisant glFrustum sans GLUT_STEREO

Je crée deux fenêtres, un par écran, et ne veux pas compter sur GLUT_STEREO. Les appels draw() pour chaque affichage sont donc indépendants, mais pour l'instant ils rendent la même chose, qui est un gluSphere pour représenter le panorama. Pour dessiner la partie correcte de la sphère, les données IMU (quaternion) deviennent une matrice de rotation, et cette matrice est multipliée avec la projection.

Je souhaite créer un peu de chevauchement avec les deux images, comme le montre l'image suivante: overlapped

Par exemple, le rectangle rouge est mon écran gauche et le rectangle bleu est mon écran de droite, mais il y a un certain chevauchement au milieu. Je lisais un article sur le rendu stéréo, et je pensais que la solution serait de remplacer l'appel de gluPerspective() par glFrustum(), et de simplement modifier les paramètres gauche et droit en même temps. Je pensais soustraire une certaine valeur au paramètre left/right de glFrustum() sur l'affichage et ajouter une valeur au paramètre left/right de glFrustum() ferait l'affaire. J'ai modifié la matrice de projection du rappel glutReshapeFunc() pour le faire que:

void resize(int width, int height) 
{ 
    glViewport(0, 0, width, height); 

    glMatrixMode(GL_PROJECTION); 
    glLoadIdentity(); 

    GLdouble near = 0.1; 
    GLdouble far = 100.0; 

    GLdouble aspect = (double) width/(double) height; 
    GLdouble top = tan(FOVY/360 * M_PI) * near; 
    GLdouble bottom = -top; 
    GLdouble right = top * aspect; 
    GLdouble left = -right; 

    // TODO: Canned value for testing 
    left += 0.5; 
    right += 0.5; 

    glFrustum(left, right, bottom, top, near, far); 
    // gluPerspective(FOVY, aspect, near, far); 

    glMatrixMode(GL_MODELVIEW); 
    glLoadIdentity(); 
} 

Malheureusement, cela ne fait pas ce que je pense (et je ne suis vraiment pas sûr de savoir pourquoi). Je pense que modifier le paramètre left et right de glFrustum() garderait le même FOV horizontal mais le déplacer vers la gauche ou la droite. Il semble soit étirer l'image dans ou hors.

je joué avec glTranslatef() sur le MODELVIEW ou glLookAt(), mais il lieu ne sont pas claires pour moi. Pourquoi glFrustum() n'a-t-il pas le bon comportement, et qu'est-ce qui me manque?

Répondre

1

Modifier la et frustum la caméra.

Vous devez avoir besoin de deux matrices de caméra différents pour simuler la séparation des yeux et légèrement différentes pour tronconiques éliminer le pincement.

3D Stereo Rendering Using OpenGL (and GLUT):

/* Misc stuff */ 
ratio = camera.screenwidth/(double)camera.screenheight; 
radians = DTOR * camera.aperture/2; 
wd2  = near * tan(radians); 
ndfl = near/camera.focallength; 

/* Derive the two eye positions */ 
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; 

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,near,far); 

glMatrixMode(GL_MODELVIEW); 
glDrawBuffer(GL_BACK_RIGHT); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
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); 
MakeLighting(); 
MakeGeometry(); 

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,near,far); 

glMatrixMode(GL_MODELVIEW); 
glDrawBuffer(GL_BACK_LEFT); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 
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); 
MakeLighting(); 
MakeGeometry(); 

glutSwapBuffers(); 

Remplacer les appels glDrawBuffer() avec binds FBO appropriés.

+0

Merci beaucoup! Comment régler la gauche et la droite est ce dont j'avais besoin. Je ne comprends toujours pas complètement mais ça a l'air de marcher! Merci beaucoup! – Jary316