OpenGL实现3D立体显示
生活随笔
收集整理的這篇文章主要介紹了
OpenGL实现3D立体显示
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
???????? 由于左眼和右眼觀看顯示器的角度不同,利用這一角度差遮住光線就可將圖像分配給右眼或者左眼,經過大腦將這兩幅由差別的圖像合成為一副具有空間深度和維度信息的圖像,從而可以看到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;//要是轉秩//n=0;leftMatrix[12] = n;rightMatrix[12] = -n;//這里假設眼到屏幕為一米,以米為單位GLfloat p = SD/(2*1*tan(PI/6)*1);//p = 0.0;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();//glPopMatrix();//if(isLeftEye)//{ // glMatrixMode(GL_PROJECTION);// glMultMatrixf(leftPersMatrix);// glMatrixMode(GL_MODELVIEW);// glMultMatrixf(leftMatrix);// glColorMask(1.0, 0.0,0.0,1.0);// // // // isLeftEye = false;//}else//{ // // glMatrixMode(GL_PROJECTION);// glMultMatrixf(rightPersMatrix);// glMatrixMode(GL_MODELVIEW);// glMultMatrixf(rightMatrix);// glColorMask(0.0, 1.0,1.0,1.0); // isLeftEye = true;//}//glRotatef((GLfloat) big, 0.0, 1.0, 0.0);//glutSolidTeapot(1.0);//glRotatef((GLfloat) big, 0.0, 1.0, 0.0);//glTranslatef(3.0, 0.0, 0.0);//glutSolidTeapot(0.5);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: // 按ESC鍵時退出程序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; }????? 最終效果圖如下所示:
總結
以上是生活随笔為你收集整理的OpenGL实现3D立体显示的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Main函数中参数argc,argv说明
- 下一篇: OpenGL视点跟踪物体运动