立体显示原理:设没有立体显示的模型视图矩阵ModelView为Mv,投影矩阵为Mp,则、物体空间的任何一点为P,则变换到屏幕坐标P*=Mp×Mv×P;注意前面已经说过opengl里面坐标列优先,所以矩阵都是右乘。

左眼和右眼的变换都是由中间的变换矩阵变换而来,则立体显示中左眼的变换矩阵公式为:

P(L)*=Ms(L) × Mp(L) × Mt(L) × Mv(L) × P;

右眼的矩阵变换公式为:

P(R)*=Ms(R) × Mp(R) × Mt(R) × Mv(R) × P;

其中Ms,Mt是立体显示需要而增加的变换。

程序里面有几个参数,现实世界眼睛到屏幕的距离Fd,两眼之间的距离Sd,比例尺R,如图:

如上图:没有立体显示,视点位于就是中间的蓝色位置,立体显示就是将左眼(红色),右眼(绿色)的视图分开绘制。

程序中左眼用红色去画,右眼同时用绿色和蓝色绘制。

代码:

/** @(#)$Id: SteroShow.cpp [4/24/2008 RenYaFei] dizuo@126.com $ * @(#)基于OpenGL的立体显示实现* Author: Dizuo.Hangzhou.* All Rights Reserved.*/
#include <GL/glut.h>
#include <math.h>
void init(void)
{GLfloat mat_diffuse[] = { 1.0, 1.0, 0.0 };GLfloat mat_specular[] = {0.8, 0.8, 0.0, 1.0};GLfloat mat_shininess[] = { 300. };GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };GLfloat light_diffuse[] = { 1.0, 1.0, 0.0 };GLfloat light_ambient[] = {0.7, 0.2, 0.2, 1.0};glClearColor (0.0, 0.0, 0.0, 0.0);glShadeModel (GL_SMOOTH);glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);glLightfv(GL_LIGHT0, GL_POSITION, light_position);glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);glEnable(GL_LIGHTING);glEnable(GL_LIGHT0);glEnable(GL_DEPTH_TEST);
}
/**//*----------------------------------------------------------------------------
*    初始化参数
*/
GLfloat PI=3.1415926;
GLfloat Fd=5.0;            //fusion distance
GLfloat RealScreenToEyeDistance=1.0;
GLfloat R=Fd/RealScreenToEyeDistance;    //比例尺 R =  Fd / RealScreenToEyeDistance
GLfloat Sd=0.05;                        //两眼之间的距离
GLfloat aspect=1.0;                        //gluLookAt函数里面的参数
GLfloat fovy=60.0;                        //张角
GLfloat f=1/tan( (fovy*PI)/(2*180) );    //f=ctg(fovy/2);//列优先的矩阵模型视图矩阵,投影矩阵
GLfloat LeftModelViewMatrix[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, Sd*R/2.0, 0.0, 0.0, 1.0
};GLfloat LeftProjectMatrix[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, -(Sd*f) / (2.0*Fd*aspect), 0.0, 0.0, 1.0
};GLfloat RightModelViewMatrix[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, -Sd*R/2.0, 0.0, 0.0, 1.0
};GLfloat RightProjectMatrix[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, (Sd*f) / (2.0*Fd*aspect), 0.0, 0.0, 1.0
};//for the use of rotating
static GLfloat spin = 0.0;void display(void)
{GLfloat matrix[16]={0.};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);//---------------------------------------------------------------------------------------------//Left ViewportglMatrixMode(GL_PROJECTION);glPushMatrix();glGetFloatv(GL_PROJECTION_MATRIX, matrix);glLoadIdentity();glMultMatrixf(LeftProjectMatrix);glMultMatrixf(matrix);glMatrixMode(GL_MODELVIEW);glLoadIdentity();glTranslated(0.0, 0.0, -Fd);glPushMatrix();    {glGetFloatv(GL_MODELVIEW_MATRIX, matrix);glLoadIdentity();glMultMatrixf(LeftModelViewMatrix);        glMultMatrixf(matrix);                    glColorMask(1.0, 0.0, 0.0, 1.0);/**//**  物体的坐标Vp*  变换到屏幕坐标:Vp'= LeftProjectMatrix×Mp × LeftModelViewMatrix×Mv × Mr×Vp*/glPushMatrix();{glRotatef(spin, 0.0, 1.0, 0.0);                                                               glutSolidTeapot(1.0);            }glPopMatrix();}glPopMatrix();glMatrixMode(GL_PROJECTION);glPopMatrix();glFlush();    //---------------------------------------------------------------------------------------------//Right ViewportglMatrixMode(GL_PROJECTION);glPushMatrix();glGetFloatv(GL_PROJECTION_MATRIX, matrix);glLoadIdentity();glMultMatrixf(RightProjectMatrix);glMultMatrixf(matrix);glMatrixMode(GL_MODELVIEW);    glPushMatrix();{glGetFloatv(GL_MODELVIEW_MATRIX, matrix);glLoadIdentity();glMultMatrixf(RightModelViewMatrix);glMultMatrixf(matrix);glColorMask(0.0, 1.0, 1.0, 1.0);glClearDepth(1.0);glClear(GL_DEPTH_BUFFER_BIT);/**//**  物体的坐标Vp*    变换到屏幕坐标:Vp'= RightProjectMatrix×Mp× RightModelViewMatrix×Mv × Mr×Vp*/glPushMatrix();{glRotatef(spin, 0.0, 1.0, 0.0);glutSolidTeapot(1.0);//glutSolidSphere(1.0, 20, 5);}}glPopMatrix();glMatrixMode(GL_PROJECTION);glPopMatrix();glFlush ();glutSwapBuffers();
}void reshape (int w, int h)
{glViewport (0, 0, (GLsizei) w, (GLsizei) h);glMatrixMode (GL_PROJECTION);glLoadIdentity();//投影矩阵:MpgluPerspective(fovy, (GLfloat)w/(GLfloat)h, 1.0, 20.0);
}
void spinDisplay(void)
{spin = spin + 1.0;if (spin > 360.0)spin = spin - 360.0;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);glutIdleFunc(spinDisplay);glutMainLoop();return 0;
}

相关立体显示链接:http://local.wasp.uwa.edu.au/~pbourke/projection/stereorender/

http://blog.csdn.net/ryfdizuo/article/details/2327478

OpenGL: OpenGL实现立体显示相关推荐

  1. 关于openGL, openGL ES, openVG及android中2D调用关系的报告

    关于openGL, openGL ES, openVG及android中2D调用关系的报告 http://blog.chinaunix.net/u3/99423/showart_2203591.htm ...

  2. OpenGL实现3D立体显示

    由于左眼和右眼观看显示器的角度不同,利用这一角度差遮住光线就可将图像分配给右眼或者左眼,经过大脑将这两幅由差别的图像合成为一副具有空间深度和维度信息的图像,从而可以看到3D图像. 完整的实现代码如下所 ...

  3. Hello OpenGL——OpenGL在Visual c++6.0安装和配置

    1.下载并安装glut库 opengl的glut库 GLUT不是OpenGL所必须的,但它会给我们的学习带来一定的方便,推荐安装.  Windows环境下的GLUT下载地址:(大小约为150k)  h ...

  4. [OpenGL] opengl常见问题汇总

    OpenGL程序运行提示glut32.dll丢失问题 http://blog.csdn.net/liufeng520/article/details/8064170 [OpenGL] 如何去掉open ...

  5. 20分钟让你了解OpenGL——OpenGL全流程详细解读

    导语: 对于开发者来说,学习OpenGL或者其他图形API都不是一件容易的事情.即使是一些对OpenGL有一些经验的开发者,往往也未必对OpenGL有完整.全面的理解.市面上的OpenGL文章往往零碎 ...

  6. OpenGL/OpenGL ES入门:渲染YUV数据实践

    纹理:GPU中的一块数据结构,YUV数据先经过采样,转成rgb显示. 着色器代码,先通过compile编译成GPU能识别的机器语言,再交由GPU进行显示. shader着色器,texture纹理,Ut ...

  7. [OpenGL]OpenGL几何变换的秘密--投影(透视投影、平行投影、正投影)

    1.透视投影 如下a图,透视投影是从某个投影点将物体投影到单一投影面上所得到的图形,透视投影符合人们心理习惯,即离视点近的物体大,离视点远的物体小,远到极点即为消失.在透视投影中,同一灯光下,改变物体 ...

  8. OpenGL: OpenGL圆柱面绘制贴图

    最近看到dx中的sample中有用顶点数组实现的圆柱体贴图的程序.于是自己写了一个圆柱体的类,支持生成纹理坐标,法线,坐标. 构造圆柱体的参数主要有: 水平分段数(就是上下圆的分段数目), 高度上的分 ...

  9. [OpenGL]OpenGL几何变换的秘密(模型变换、视点变换、全局变换、局部变换)

    1.模型变换(Model transformation)---- 视点不变,变物体 我们在OpenGL中通过定义一组顶点来定义一个模型,我们遇到的平移.缩放.旋转等变换都可以理解为模型变换,视点不变, ...

最新文章

  1. 题目1493:公约数
  2. 【机器学习】梯度下降中矩阵的迹的求导证明
  3. spdep | 最小生成树
  4. 中国丝裂原活化蛋白激酶9市场趋势报告、技术动态创新及市场预测
  5. CentOS设置ssh密钥登录
  6. Webpack4 学习笔记一初探Webpack
  7. 【Photoshop教程】转发:Photoshop把帅哥转成超酷的阿凡达
  8. [2019杭电多校第四场][hdu6621]K-th Closest Distance(主席树)
  9. 方舟服务器后台一直显示正在重启,win10正在重新启动卡住如何解决_win10重启后一直显示正在重新启动的解决教程...
  10. python装饰器两层和三层_python装饰器为什么要双层嵌套函数
  11. win10笔记本ps/2键盘鼠标失灵,错误代码39、错误代码10
  12. FLTK中使用SDL的一种处理方式
  13. 一个月攻克托业--复旦大学考生
  14. 安装和使用Entrez Direct
  15. 如何将epub电子书格式转换成txt文本
  16. 数据分析师说坐飞机安全么
  17. 读Java 804 - Quick refresher
  18. 解决WiFi共享大师频繁掉线问题
  19. Dev-C++5.11游戏创作之躺平发育
  20. Android复杂页面代码拆分方法

热门文章

  1. Sorting(排序)
  2. CAD - NFS - 群组数量16限制
  3. 手机POS机支付能否挑战支付宝、微信?
  4. Go语言之Windows 10开发工具LiteIDE初步使用
  5. 7-15 输出N以内的所有素数分数 15作者 李民单位 武汉理工大学
  6. 犀牛书第2章 JavaScript词法结构
  7. 2021-12-24
  8. 程明明:“生活歌者,一路向前”
  9. Flink 并行度、共享槽位、如何判断Flink需要使用多少资源、查看Flink需要处理的数据频率...
  10. 开影Precision 128 Max精密断层能谱CT获得NMPA注册证