This is the code… so I am wrong in the code !!!
#include <glut.h>
#include<stdlib.h>
#include <math.h>
#define KEY_ESC 27
#define DTOR 0.0174532925 /* degree of radians*/
/*
Enumerations
*/
typedef enum{LEFT,RIGHT} EyeMode;
GLvoid drawScene( EyeMode eyeMode);
void setStereoPerspective( GLdouble fovy, GLdouble aspect, GLdouble n, GLdouble f,
GLdouble focalLenght, GLdouble eyeSep, EyeMode eyeMode);
void setStereoLookAt( GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ,
GLdouble centreX, GLdouble centreY, GLdouble centreZ,
GLdouble upX, GLdouble upY, GLdouble upZ, GLdouble eyeSep,
EyeMode eyeMode);
GLvoid render(EyeMode eyeMode);
GLvoid display(GLvoid);
GLvoid keyboard (GLubyte key, GLint x, GLint y);
/* Multiply the current matrix by a stereo perspective projection matrix.
Parameteres are mostly the same as gluPerspective */
void setStereoPerspective( GLdouble fovy, GLdouble aspect, GLdouble n, GLdouble f,
GLdouble focalLenght, GLdouble eyeSep, EyeMode eyeMode)
{
/* The trick is to implement the " parallel axis asymmetric frustum perspective projection"
*/
GLdouble left;
GLdouble right;
GLdouble stereoAdjustment;
GLdouble top =n*tan(DTOR * fovy/2);
GLdouble bottom = -top;
GLdouble nearWidth =aspect*top;
stereoAdjustment =eyeSep/2*n/focalLenght;
if(RIGHT == eyeMode)
{
left = -nearWidth - stereoAdjustment;
right = nearWidth - stereoAdjustment;
}
else
{
left = -nearWidth + stereoAdjustment;
right = nearWidth + stereoAdjustment;
}
glFrustum(left, right, bottom, top, n, f);
}
/*
Parameters are mostly the same as for gluLookAt.
Notes:
eye represents the centre of the left, right eye
eyeSep is the distance between the left and right eye
eyeMode is either LEFT (eye) of RIGHT (eye)
*/
void setStereoLookAt( GLdouble eyeX, GLdouble eyeY, GLdouble eyeZ,
GLdouble centreX, GLdouble centreY, GLdouble centreZ,
GLdouble upX, GLdouble upY, GLdouble upZ, GLdouble eyeSep,
EyeMode eyeMode)
{
GLdouble inX = centreX - eyeX;
GLdouble inY = centreY - eyeY;
GLdouble inZ = centreZ - eyeZ;
GLdouble factor = (eyeMode==RIGHT)?1:-1;
GLdouble realEyeCorX = factor * (inY*upZ - upY*inZ);
GLdouble realEyeCorY = factor * (inZ*upX - upZ*inX);
GLdouble realEyeCorZ = factor * (inX*upY - upX*inY);
GLdouble lenght = sqrt( realEyeCorX*realEyeCorX
+ realEyeCorY*realEyeCorY
+ realEyeCorZ*realEyeCorZ);
gluLookAt( eyeX+realEyeCorX, eyeY+realEyeCorY, eyeZ+realEyeCorZ,centreX,centreY,centreZ,upX,upY,upZ);
}
GLvoid drawScene( EyeMode eyeMode)
{
/*
if(eyeMode== LEFT)
{
glColor3f(1.0,0.0,0.0);
}
else
{
glColor3f(0.0,1.0,0.0);
}*/
glPushMatrix();
{
glRotatef(-45.0,0.0,0.0,0.0);
glutSolidTeapot(1.0);
}
glPopMatrix();
}
GLvoid render(EyeMode eyeMode)
{
double fovy = 50;
double aspect = 4/3;
double n = 1.0;
double f = 5.0;
double focalLenght = 1.5;
double eyeSep = 0.03;
double eyeX = 0.0;
double eyeY = 0.0;
double eyeZ = 4.0;
double centreX = 0.0;
double centreY = 0.0;
double centreZ = -100;
double upX = 0.0;
double upY = 1.0;
double upZ = 0.0;
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
setStereoPerspective(fovy, aspect, n, f, focalLenght, eyeSep, eyeMode);
glMatrixMode(GL_MODELVIEW);
glClear(GL_COLOR_BUFFER_BIT);
glPushMatrix();
{
setStereoLookAt(eyeX,eyeY,eyeZ,centreX,centreY,centreZ,upX,upY,upZ,eyeSep,eyeMode);
drawScene(eyeMode);
}
glPopMatrix();
}
GLvoid display(GLvoid)
{
glDrawBuffer(GL_BACK);
glClear(GL_COLOR_BUFFER_BIT);
glDrawBuffer(GL_BACK_LEFT);
render(LEFT);
glDrawBuffer(GL_BACK_RIGHT);
render(RIGHT);
glutSwapBuffers();
}
GLvoid keyboard (GLubyte key, GLint x, GLint y)
{
switch(key)
{
case ’ ':
glutPostRedisplay();
case KEY_ESC:
exit(0);
break;
default:
break;
}
}
int main( int argc, char *argv[])
{
glutInit( &argc, argv);
glutInitDisplayMode( GLUT_RGB|GLUT_DOUBLE|GLUT_STEREO);
glutCreateWindow( argv[0]);
glutKeyboardFunc(keyboard);
glutDisplayFunc(display);
glutMainLoop();
return 0;
}