OpenGL实现3D立体显示
来源:互联网 发布:淘宝网中老年春秋装 编辑:程序博客网 时间:2024/04/28 21:03
由于左眼和右眼观看显示器的角度不同,利用这一角度差遮住光线就可将图像分配给右眼或者左眼,经过大脑将这两幅由差别的图像合成为一副具有空间深度和维度信息的图像,从而可以看到3D图像。
完整的实现代码如下所示:
- #include "stdafx.h"
- #include "GL/glut.h"
- #include "stdlib.h"
- #include "stdio.h"
- #include "math.h"
-
- static int big = 0;
- static bool isLeftEye = false;
-
- #define PI 3.1415926
- const GLfloat R = 8.0;
-
- static GLfloat leftMatrix[16] = {1.0, 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0, 0.0,
- 0.0, 0.0, 1.0, 0.0,
- 0.0, 0.0, 0.0, 1.0};
-
- static GLfloat rightMatrix[16] = {1.0, 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0, 0.0,
- 0.0, 0.0, 1.0, 0.0,
- 0.0, 0.0, 0.0, 1.0};
-
- static GLfloat leftPersMatrix[16] = {1.0, 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0, 0.0,
- 0.0, 0.0, 1.0, 0.0,
- 0.0, 0.0, 0.0, 1.0};
-
- static GLfloat rightPersMatrix[16] = {1.0, 0.0, 0.0, 0.0,
- 0.0, 1.0, 0.0, 0.0,
- 0.0, 0.0, 1.0, 0.0,
- 0.0, 0.0, 0.0, 1.0};
- void init(void)
- {
- const GLfloat SD = 0.06;
- GLfloat n = SD*R/2.0;
-
-
- leftMatrix[12] = n;
- rightMatrix[12] = -n;
-
-
- GLfloat p = SD/(2*1*tan(PI/6)*1);
-
- leftPersMatrix[12] = -p;
- rightPersMatrix[12] = p;
-
- GLfloat mat_specular[] = {0.8, 0.8, 0.0, 1.0};
- GLfloat mat_shininess[] = {50.0};
- GLfloat light_position[] = {1.0, 1.0, 1.0, 0.0};
- GLfloat white_light[] = {1.0, 1.0, 1.0, 1.0};
- GLfloat yellow_light[] = {1.0, 1.0, 0.0, 1.0};
- GLfloat lmodel_ambient[] = {0.0, 0.7, 0.5, 1.0};
- glClearColor(1.0, 1.0, 1.0, 0.0);
-
- glShadeModel(GL_SMOOTH);
- glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
- glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
- glLightfv(GL_LIGHT0, GL_POSITION, light_position);
- glLightfv(GL_LIGHT0, GL_DIFFUSE, yellow_light);
- glLightfv(GL_LIGHT0, GL_SPECULAR, white_light);
- glLightModelfv(GL_LIGHT_MODEL_AMBIENT, lmodel_ambient);
-
- glEnable(GL_LIGHTING);
- glEnable(GL_LIGHT0);
- glEnable(GL_DEPTH_TEST);
- }
-
- void display(void)
- {
- glColorMask(1.0, 1.0,1.0,1.0);
- glClearColor(0.0,0.0,0.0,1.0);
- glClearDepth(1.0);
-
- glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
- glColor3f(1.0, 1.0, 1.0);
-
-
-
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- float mat[16];
- glGetFloatv(GL_PROJECTION_MATRIX,mat);
- glLoadIdentity();
-
- glMultMatrixf(leftPersMatrix);
- glMultMatrixf(mat);
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glGetFloatv(GL_MODELVIEW_MATRIX,mat);
- glLoadIdentity();
-
- glMultMatrixf(leftMatrix);
- glMultMatrixf(mat);
-
- glColorMask(1.0, 0.0,0.0,1.0);
-
- glRotatef((GLfloat) big, 0.0, 1.0, 0.0);
- glutSolidTeapot(2.0);
- glPopMatrix();
-
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
-
- glFlush();
-
-
- glClearDepth(1.0);
- glClear(GL_DEPTH_BUFFER_BIT);
-
- glMatrixMode(GL_PROJECTION);
- glPushMatrix();
- glGetFloatv(GL_PROJECTION_MATRIX,mat);
- glLoadIdentity();
-
- glMultMatrixf(rightPersMatrix);
- glMultMatrixf(mat);
-
- glMatrixMode(GL_MODELVIEW);
- glPushMatrix();
- glGetFloatv(GL_MODELVIEW_MATRIX,mat);
- glLoadIdentity();
-
- glMultMatrixf(rightMatrix);
- glMultMatrixf(mat);
- glColorMask(0.0, 1.0,1.0,1.0);
- glRotatef((GLfloat) big, 0.0, 1.0, 0.0);
- glutSolidTeapot(2.0);
- glPopMatrix();
-
- glMatrixMode(GL_PROJECTION);
- glPopMatrix();
- glFlush();
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- glutSwapBuffers();
-
-
- }
- void reshape(int w, int h)
- {
- glViewport(0, 0, (GLsizei) w, (GLsizei) h);
-
- glMatrixMode(GL_PROJECTION);
- glLoadIdentity();
- gluPerspective(60, (GLfloat)w/(GLfloat)h, 0.01, 20.0);
-
- glMatrixMode(GL_MODELVIEW);
- glLoadIdentity();
- gluLookAt(0.0, 0.0, R, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0 );
- }
- void keyboard(unsigned char key, int x, int y)
- {
- switch (key)
- {
- case 'b':
- big = (big + 1) % 360;
- glutPostRedisplay();
- break;
- case 'B':
- big = (big - 1) % 360;
- glutPostRedisplay();
- break;
- case 27:
- exit (0);
- break;
- default:
- break;
- }
- }
- void spinDisplay(void)
- {
- big = (big + 1) % 360;
- glutPostRedisplay();
- }
- int main (int argc, char** argv)
- {
- glutInit(&argc, argv);
- glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
- glutInitWindowSize(500, 500);
- glutInitWindowPosition(100, 100);
- glutCreateWindow(argv[0]);
- init();
- glutDisplayFunc(display);
- glutReshapeFunc(reshape);
- glutKeyboardFunc(keyboard);
- glutIdleFunc(spinDisplay);
- glutMainLoop();
-
- return 0;
- }
0 0