亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

OpenGL實現3D立體顯示

系統 1767 0

由于左眼和右眼觀看顯示器的角度不同,利用這一角度差遮住光線就可將圖像分配給右眼或者左眼,經過大腦將這兩幅由差別的圖像合成為一副具有空間深度和維度信息的圖像,從而可以看到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立體顯示

OpenGL實現3D立體顯示


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 久热精品香蕉在线视频 | 二区视频 | 98精品国产综合久久 | 很很鲁在线视频播放影院 | 久久精品一区二区 | 欧美黄色第一页 | 国产一区二区三区不卡观 | 中文字幕热久久久久久久 | 四虎成人精品在永久在线观看 | se94se亚洲欧美在线 | 黄片一级毛片 | 色综合伊人色综合网亚洲欧洲 | 国产精品福利在线观看免费不卡 | 美女视频黄的全i免费 | 九九99视频在线观看视频观看 | 在线黄色影院 | 操操操干干干 | 五月婷婷亚洲 | 成人亚洲网 | 日本在线不卡免费视频一区 | 国内久久久久高清影视 | 国产精品一区伦免视频播放 | 久操视频免费看 | 爱搞逼综合网 | 国产91av视频| 免费观看性欧美一级 | 四虎8848| 99久久免费国产精品特黄 | 老司机久久精品 | 免费观看成人www精品视频在线 | 欧美最大成人毛片视频网站 | 午夜小视频网站 | 久草在线视频在线观看 | 一区二区三区www | 一级女性全黄生活片免费 | 另类图片综合 | 国产一区二区三区免费观看 | 射久久| 97国内免费久久久久久久久久 | 免费的黄色小视频 | 国产亚洲精品看片在线观看 |