2011-02-15 3 views
2

J'essaye d'implémenter la 3D stéréoscopique dans OpenGL en utilisant une technique côte-à-côte.Adapter le code existant pour le rendu stéréoscopique OpenGL?

J'ai lu this article qui explique en détail comment configurer l'appareil photo pour les vues gauche et droite. Il utilise un modèle d'appareil photo et configure les vues gauche et droite à l'aide de gluLookAt.

Cependant dans mon cas, je veux adapter le code existant qui a déjà mis en place la projection. Voir l'exemple suivant où "existingcode" représente le code auquel je ne peux pas apporter de modifications. Peut-on le faire, peut-être en appelant glGetMatrix et en le modifiant d'une façon ou d'une autre?

+0

Votre code existant efface-t-il la matrice de projection (en utilisant glLoadIdentify)? Ou compose-t-il sa matrice de projection avec le haut de la pile? – rotoglup

+0

Le code existant réinitialise la pile en utilisant glLoadIdentity mais je pourrais éventuellement l'empêcher de le faire. Pourquoi as-tu une idée? –

Répondre

3

Ce que vous avez à faire est d'utiliser un shiftig d'objectif.

glMatrixMode(GL_PROJECTION); 
glLoadIdentity(); 
stereo_offset = eye * near * parallax_factor/convergence_distance; 
glFrustum(stereo_offset + left, stereo_offset + right, bottom, top, near, far); 

glMatrixMode(GL_MODELVIEW); 
glLoadIdentity(); 
glTranslatef(eye * parallax_factor * convergence_distance, 0, 0); 

/* now use gluLookAt here as this were a normal 2D rendering */ 

parallax_factor ne devrait pas être plus grand que le rapport de half_eye_distance/screen_width, de sorte que plus l'écran devient plus le parallax_factor est. Une valeur sûre pour parallax_factor pour une utilisation d'affichage d'ordinateur est de 0,05, pour les grands écrans (pensez au cinéma), il est quelque chose comme 0,01

Cette technique de déplacement de projection est exactement ce que j'ai utilisé pour re-rendu Elephants Dream en 3D stéréoscopique, bien que, puisque le rendu hors ligne de Blenders n'utilise pas OpenGL, le code est un peu différent http://www.youtube.com/watch?v=L-tmaMR1p3w

+0

Merci pour votre réponse, mais l'article auquel je me réfère décrit également comment rendre quand vous avez le contrôle sur la caméra. Dans mon cas, le code qui configure la caméra est dans un morceau de code qui est déjà écrit et de préférence ne pas être changé. Donc ma question est de savoir s'il est possible de modifier la caméra après que glFrustum etc soit déjà appelé. Ou peut-être que je comprends mal votre réponse? –

+0

Avez-vous accès au code? Si oui, alors les changements sont minimes. Il suffit de modifier la façon dont glFrustum est appelé (juste là où ça arrive). Vous pouvez laisser toutes les opérations de la matrice modelview identiques, il vous suffit d'appliquer une traduction initiale. Les changements totaux se résument à au plus 10 lignes de code. – datenwolf

+0

Le code existant appelle gluPerspective au lieu de glFrustum et j'espérais trouver une technique non intrusive qui évite de changer le code de la caméra, mais votre réponse est utile et j'utiliserai cette solution si rien d'autre n'apparaît ici. –