由于左眼和右眼观看显示器的角度不同,利用这一角度差遮住光线就可将图像分配给右眼或者左眼,经过大脑将这两幅由差别的图像合成为一副具有空间深度和维度信息的图像,从而可以看到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立体显示相关推荐

  1. C++ Opengl绘制3D源码

    C++ Opengl绘制3D源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方库 ...

  2. 3D立体显示技术原理与游戏应用历程简介 【转】

    本文来自 中关村ZOL 「3D 立体显示」可说是近来娱乐产业相当热门的话题,不但有好莱坞推出<阿凡达>等卖座 3D 立体电影,全球各大家电厂商也积极布局准备推出一系列支持 3D 立体显示的 ...

  3. 3D立体显示技术原理与游戏应用历程简介

    本文来自 中关村ZOL 「3D 立体显示」可说是近来娱乐产业相当热门的话题,不但有好莱坞推出<阿凡达>等卖座 3D 立体电影,全球各大家电厂商也积极布局准备推出一系列支持 3D 立体显示的 ...

  4. 移动端利用OpenGL展示3D模型文件STL

    移动端利用OpenGL展示3D模型文件STL 突然发现上次写博客都是一年前了,没养成分享的习惯挺郁闷的,所以分享下个人感觉好玩的东西吧.纯理工科生笔杆子不硬,写的不好,哪里有看不懂的或者写的不好的希望 ...

  5. OpenGL与3D图形世界

    一.OpenGL与3D图形世界 1.1.OpenGL使人们进入三维图形世界 我们生活在一个充满三维物体的三维世界中,为了使计算机能精确地再现这些物体,我们必须能在三维空间描绘这些物体.我们又生活在一个 ...

  6. C++ Opengl 绘制3D字体源码

    C++ Opengl 绘制3D字体源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1, ...

  7. android opengl ppt,Android开发和 与实践课件第12章利用OpenGL实现3D图形.ppt

    Android开发和 与实践课件第12章利用OpenGL实现3D图形.ppt half, -half, half, half, half, half, // 上面 -half, half, half, ...

  8. 基于opengl的3d漫游游戏 - 古堡危机之丧尸围城

    作品名称: <古堡危机> 小组团队名称: 拾荒三人组 日期:2018年12月 目录 第一章 简介 3 前言 3 项目的创意设想.游戏类型.实现的功能.项目意义 3 Opengl 4 作品代 ...

  9. 转-基于OpenGL的3D天空仿真

    在进行3D场景渲染时,天空是必不可少的因素.对于3D天空的模拟在视景仿真系统.计算机游戏.三维动画中有着广泛的应用.但是,目前对于天空的仿真还存在很多不足,一些模拟方法中存在实现复杂.计算耗时.图像分 ...

最新文章

  1. ibatis查询SQL语句返回一个对象,此对象包含一个List属性
  2. bootstrap 横铺 行_Bootstrap 排版
  3. vue代码上传服务器后背景图片404解决方法
  4. 010_Raphael事件
  5. 如果某一运行的服务在/var/lock/subsys
  6. Docker中操作镜像和容器的常用命令
  7. sql 1行拆分成两行_EXCEL总表拆分成100个分表,同事用1天,我只用10秒钟
  8. slz-JDK1.8的环境变量配置
  9. 常搓八个部位可以防衰老 - 健康程序员,至尚生活!
  10. 低价购买(洛谷 1108)
  11. JS-为金额添加千分位逗号分割符
  12. LeetCode 1727. 重新排列后的最大子矩阵(前缀和+排序)
  13. 程序员的年龄越大编程能力越弱???原来我们都理解错了
  14. linux怎么设置屏显示同步,linux设置同步时间
  15. 闭合导线坐标计算表_RTK技术导线测量和全站仪导线测量有什么区别?
  16. canvas 实现图片局部模糊_Canvas 在高清屏下绘制图片变模糊的解决方法
  17. CSS中超链接样式的书写顺序
  18. Linux中的samba服务和ftp服务
  19. Linux工作队列实现机制
  20. MAC地址及对应的厂商

热门文章

  1. 实验室之函数计算专场,完成任务,领精美好礼!
  2. 如何提高一个研发团队的“代码速度”?
  3. Cocos游戏引擎3D特效全新升级 更流畅更炫酷
  4. 游戏寻路中 A* 算法的改进
  5. 一天学完spark的Scala基础语法教程二、运算符与分支语句(idea版本)
  6. ORACLE中的INTERVAL类型
  7. NOIP 2006 T2 金明的预算方案
  8. 关于Promise.all()的理解
  9. 微信已停止访问该网页怎么解决
  10. 51 nod 1049 最大子段和 (简单dp)