https://blog.csdn.net/augusdi/article/details/19922295

立体显示原理:设没有立体显示的模型视图矩阵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,如图:

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

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

代码:

  1.  
    #include <windows.h>
  2.  
    #include <GL/glut.h>
  3.  
    #include <math.h>
  4.  
     
  5.  
    #pragma comment(lib,"glut32.lib")
  6.  
    #pragma comment(lib,"glu32.lib")
  7.  
    #pragma comment(lib,"opengl32.lib")
  8.  
     
  9.  
    void init(void)
  10.  
    {
  11.  
    GLfloat mat_diffuse[] = { 1.0, 1.0, 0.0 };
  12.  
    GLfloat mat_specular[] = {0.8, 0.8, 0.0, 1.0};
  13.  
    GLfloat mat_shininess[] = { 300. };
  14.  
    GLfloat light_position[] = { 1.0, 1.0, 1.0, 0.0 };
  15.  
    GLfloat light_diffuse[] = { 1.0, 1.0, 0.0 };
  16.  
    GLfloat light_ambient[] = {0.7, 0.2, 0.2, 1.0};
  17.  
     
  18.  
    glClearColor (0.0, 0.0, 0.0, 0.0);
  19.  
    glShadeModel (GL_SMOOTH);
  20.  
     
  21.  
    glMaterialfv(GL_FRONT, GL_SPECULAR, mat_specular);
  22.  
    glMaterialfv(GL_FRONT, GL_DIFFUSE, mat_diffuse);
  23.  
    glMaterialfv(GL_FRONT, GL_SHININESS, mat_shininess);
  24.  
    glLightfv(GL_LIGHT0, GL_POSITION, light_position);
  25.  
    glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient);
  26.  
    glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse);
  27.  
     
  28.  
    glEnable(GL_LIGHTING);
  29.  
    glEnable(GL_LIGHT0);
  30.  
    glEnable(GL_DEPTH_TEST);
  31.  
    }
  32.  
    /**//*----------------------------------------------------------------------------
  33.  
    * 初始化参数
  34.  
    */
  35.  
    GLfloat PI=3.1415926;
  36.  
    GLfloat Fd=5.0; //fusion distance
  37.  
    GLfloat RealScreenToEyeDistance=1.0;
  38.  
    GLfloat R = Fd / RealScreenToEyeDistance; //比例尺 R = Fd / RealScreenToEyeDistance
  39.  
    GLfloat Sd = 0.05; //两眼之间的距离
  40.  
    GLfloat aspect = 1.0; //gluLookAt函数里面的参数
  41.  
    GLfloat fovy = 60.0; //张角
  42.  
    GLfloat f = 1 / tan( (fovy * PI) / (2 * 180) ); //f=ctg(fovy/2);
  43.  
     
  44.  
    //列优先的矩阵模型视图矩阵,投影矩阵
  45.  
    GLfloat LeftModelViewMatrix[16]=
  46.  
    {
  47.  
    1.0, 0.0, 0.0, 0.0,
  48.  
    0.0, 1.0, 0.0, 0.0,
  49.  
    0.0, 0.0, 1.0, 0.0,
  50.  
    Sd * R / 2.0, 0.0, 0.0, 1.0
  51.  
    };
  52.  
     
  53.  
    GLfloat LeftProjectMatrix[16]=
  54.  
    {
  55.  
    1.0, 0.0, 0.0, 0.0,
  56.  
    0.0, 1.0, 0.0, 0.0,
  57.  
    0.0, 0.0, 1.0, 0.0,
  58.  
    -(Sd * f) / (2.0 * Fd * aspect), 0.0, 0.0, 1.0
  59.  
    };
  60.  
     
  61.  
    GLfloat RightModelViewMatrix[16]=
  62.  
    {
  63.  
    1.0, 0.0, 0.0, 0.0,
  64.  
    0.0, 1.0, 0.0, 0.0,
  65.  
    0.0, 0.0, 1.0, 0.0,
  66.  
    -Sd * R / 2.0, 0.0, 0.0, 1.0
  67.  
    };
  68.  
     
  69.  
    GLfloat RightProjectMatrix[16]=
  70.  
    {
  71.  
    1.0, 0.0, 0.0, 0.0,
  72.  
    0.0, 1.0, 0.0, 0.0,
  73.  
    0.0, 0.0, 1.0, 0.0,
  74.  
    (Sd * f) / (2.0 * Fd * aspect), 0.0, 0.0, 1.0
  75.  
    };
  76.  
     
  77.  
    //for the use of rotating
  78.  
    static GLfloat spin = 0.0;
  79.  
     
  80.  
    void display(void)
  81.  
    {
  82.  
    GLfloat matrix[16]={0.};
  83.  
     
  84.  
    glColorMask(1.0, 1.0, 1.0, 1.0);
  85.  
    glClearColor(0.0, 0.0, 0.0, 1.0);
  86.  
    glClearDepth(1.0);
  87.  
     
  88.  
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  89.  
    glColor3f(1.0, 1.0, 1.0);
  90.  
     
  91.  
    //---------------------------------------------------------------------------------------------
  92.  
    //Left View port
  93.  
    glMatrixMode(GL_PROJECTION);
  94.  
    glPushMatrix();
  95.  
    {
  96.  
    glGetFloatv(GL_PROJECTION_MATRIX, matrix);
  97.  
    glLoadIdentity();
  98.  
    glMultMatrixf(LeftProjectMatrix);
  99.  
    glMultMatrixf(matrix);
  100.  
    {
  101.  
    glMatrixMode(GL_MODELVIEW);
  102.  
    glLoadIdentity();
  103.  
    glTranslated(0.0, 0.0, -Fd);
  104.  
    glPushMatrix();
  105.  
    {
  106.  
    glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
  107.  
    glLoadIdentity();
  108.  
    glMultMatrixf(LeftModelViewMatrix);
  109.  
    glMultMatrixf(matrix);
  110.  
    glColorMask(1.0, 0.0, 0.0, 1.0);
  111.  
    /**//*
  112.  
    * 物体的坐标Vp
  113.  
    * 变换到屏幕坐标:Vp'= LeftProjectMatrix×Mp × LeftModelViewMatrix×Mv × Mr×Vp
  114.  
    */
  115.  
    glPushMatrix();
  116.  
    {
  117.  
    glRotatef(spin, 0.0, 1.0, 0.0);
  118.  
    glutSolidTeapot(1.0);
  119.  
    }
  120.  
    glPopMatrix();
  121.  
    }
  122.  
    }
  123.  
    glPopMatrix();
  124.  
    glMatrixMode(GL_PROJECTION);
  125.  
    }
  126.  
    glPopMatrix();
  127.  
    glFlush();
  128.  
     
  129.  
    //---------------------------------------------------------------------------------------------
  130.  
    //Right View port
  131.  
    glMatrixMode(GL_PROJECTION);
  132.  
    glPushMatrix();
  133.  
    {
  134.  
    glGetFloatv(GL_PROJECTION_MATRIX, matrix);
  135.  
    glLoadIdentity();
  136.  
    glMultMatrixf(RightProjectMatrix);
  137.  
    glMultMatrixf(matrix);
  138.  
     
  139.  
    glMatrixMode(GL_MODELVIEW);
  140.  
    glPushMatrix();
  141.  
    {
  142.  
    glGetFloatv(GL_MODELVIEW_MATRIX, matrix);
  143.  
    glLoadIdentity();
  144.  
    glMultMatrixf(RightModelViewMatrix);
  145.  
    glMultMatrixf(matrix);
  146.  
     
  147.  
    glColorMask(0.0, 1.0, 1.0, 1.0);
  148.  
    glClearDepth(1.0);
  149.  
    glClear(GL_DEPTH_BUFFER_BIT);
  150.  
    /**//*
  151.  
    * 物体的坐标Vp
  152.  
    * 变换到屏幕坐标:Vp'= RightProjectMatrix×Mp× RightModelViewMatrix×Mv × Mr×Vp
  153.  
    */
  154.  
    glPushMatrix();
  155.  
    {
  156.  
    glRotatef(spin, 0.0, 1.0, 0.0);
  157.  
    glutSolidTeapot(1.0);
  158.  
    //glutSolidSphere(1.0, 20, 5);
  159.  
    }
  160.  
    }
  161.  
    glPopMatrix();
  162.  
     
  163.  
    glMatrixMode(GL_PROJECTION);
  164.  
    }
  165.  
    glPopMatrix();
  166.  
    glFlush ();
  167.  
     
  168.  
    glutSwapBuffers();
  169.  
    }
  170.  
     
  171.  
    void reshape (int w, int h)
  172.  
    {
  173.  
    if (h == 0)
  174.  
    {
  175.  
    h == 1;
  176.  
    }
  177.  
    glViewport (0, 0, (GLsizei) w, (GLsizei) h);
  178.  
    glMatrixMode (GL_PROJECTION);
  179.  
    glLoadIdentity();
  180.  
    //投影矩阵:Mp
  181.  
    gluPerspective(fovy, (GLfloat)w / (GLfloat)h, 1.0, 20.0);
  182.  
    }
  183.  
    void spinDisplay(void)
  184.  
    {
  185.  
    spin = spin + 1.0;
  186.  
    if (spin > 360.0)
  187.  
    {
  188.  
    spin = spin - 360.0;
  189.  
    }
  190.  
    glutPostRedisplay();
  191.  
    }
  192.  
     
  193.  
    int main(int argc, char** argv)
  194.  
    {
  195.  
    glutInit(&argc, argv);
  196.  
    glutInitDisplayMode (GLUT_DOUBLE | GLUT_RGB | GLUT_DEPTH);
  197.  
    glutInitWindowSize (500, 500);
  198.  
    glutInitWindowPosition (100, 100);
  199.  
    glutCreateWindow (argv[0]);
  200.  
    init ();
  201.  
    glutDisplayFunc(display);
  202.  
    glutReshapeFunc(reshape);
  203.  
    glutIdleFunc(spinDisplay);
  204.  
    glutMainLoop();
  205.  
    return 0;
  206.  
    }

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

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

OpenGL: 实现立体显示的更多相关文章

  1. 3D立体显示大屏幕拼接视频墙系统解决方案【转】

    http://shop.souvr.com/thread-123416-1-1.html 随着3D立体视像.全息影像等技术不断取得突破性进展,国内外越来越多的公司投身3D显示领域,产品层出不穷.3D技 ...

  2. CreatarGlobe实现多机立体显示方案(初稿)

    CreatarGlobe实现多机立体显示方案(初稿) 关键字 : 集群渲染 立体显示 大屏幕 边缘融合 多机同步 多机同步显示 关键字: 大屏幕投影融合系统解决方案 集群渲染 多机3D同步显示又称“集 ...

  3. 基于3D Vision眼镜的OSG立体显示 【转】

    http://blog.csdn.net/qq_20038925/article/details/50510565 OSG 立体显示 3D Vision眼镜:所实现的是被动立体. 1.本人最近在做os ...

  4. 【AR实验室】OpenGL ES绘制相机(OpenGL ES 1.0版本)

    0x00 - 前言 之前做一些移动端的AR应用以及目前看到的一些AR应用,基本上都是这样一个套路:手机背景显示现实场景,然后在该背景上进行图形学绘制.至于图形学绘制时,相机外参的解算使用的是V-SLA ...

  5. [OpenGL超级宝典]专栏前言

    我小时候的梦想呢,是做宇航员或者科学家或者是做一款属于自己的游戏,后来前面两个梦想都没有实现,于是我就来实现我的第三个梦想了,,,我呢,也算是零基础,因为我的专业是物联网工程,这个专业覆盖面之广,简直 ...

  6. OpenGL超级宝典笔记----渲染管线

    在OpenGL中任何事物都在3D空间中,但是屏幕和窗口是一个2D像素阵列,所以OpenGL的大部分工作都是关于如何把3D坐标转变为适应你屏幕的2D像素.3D坐标转为2D坐标的处理过程是由OpenGL的 ...

  7. OpenGL超级宝典笔记----框架搭建

    自从工作后,总是或多或少的会接触到客户端3d图形渲染,正好自己对于3d图形的渲染也很感兴趣,所以最近打算从学习OpenGL的图形API出发,进而了解3d图形的渲染技术.到网上查了一些资料,OpenGL ...

  8. 现代3D图形编程学习-基础简介(3)-什么是opengl (译)

    本书系列 现代3D图形编程学习 OpenGL是什么 在我们编写openGL程序之前,我们首先需要知道什么是OpenGL. 将OpenGL作为一个API OpenGL 通常被认为是应用程序接口(API) ...

  9. OpenGL shader 中关于顶点坐标值的思考

    今天工作中需要做一个事情: 在shader内部做一些空间距离上的计算,而且需要对所有的点进行计算,符合条件的显示,不符合条件的点不显示. 思路很简单,在vertex shader内知道顶点坐标,进行计 ...

随机推荐

  1. 通过wui登陆 sap 页面对数据进行高级 搜索

    1: 登陆QGL系统. 在 T-CODE搜索框输入wui 会跳到搜索的web页面,进行搜索. 或者浏览器输入: https://ldciqgl.wdf.sap.corp:44300/sap(bD1lb ...

  2. IOP知识点(3)-Modal.show

    1.position 模态框初始位置.可设为字符串 "左位置 上位置" 或数组 [左位置, 上位置],规则如下: 左位置 可设为 left|center|right 三者之一,上位 ...

  3. JS发送短信验证码

    <div> <input type="tel" id="mobile" name="mobile" placeholder ...

  4. 笔记:Python 字符串小记

    1. 字符串是以''或""括起来的任意文本,如果'本身也是一个字符,那就可以用""括起来,比如"I'm OK" >>> p ...

  5. 1021 Deepest Root

    这道题的关键在于如何求两个最远的结点,二叉树比较容易一直DFS就能找到,但是普通树就比较麻烦.要先找到一端,再去找另外一端,两端的并集就是答案.因为结点都是对称的,所以两端都是答案.还要注意去重,12 ...

  6. dotnet 命令

    以下用实例串起dotnet常用命令,带你玩转dotnet命令. 1.创建(dotnet new) 首先我们创建一个项目,这里我们创建控制台程序,命令如下图所示. dotnet new dotnet n ...

  7. 安装Esxi 6.5

    最详细安装Esxi 6.5     Exsi 是一款虚拟化系统,与VMware,VirtualBox不同,它不需要安装在其他操作系统上,直接运行在裸机上:占用系统资源很小,易于管理,所以被大多数中小型 ...

  8. [6]Windows内核情景分析 --APC

    APC:异步过程调用.这是一种常见的技术.前面进程启动的初始过程就是:主线程在内核构造好运行环境后,从KiThreadStartup开始运行,然后调用PspUserThreadStartup,在该线程 ...

  9. WebAppInitializer类,代替web.xml

    package com.ssm.yjblogs.config; import javax.servlet.MultipartConfigElement; import javax.servlet.Se ...

  10. scrapy:get cookie from response

    scrapy shell fetch('your_url') response.headers.getlist("Set-Cookie")https://stackoverflow ...