OpenGL: 实现立体显示

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

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

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

 

代码:

[cpp] view plaincopy
  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;  

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432426.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数学 之 hdu 4861

// [7/23/2014 Sjm] /* 对于此题&#xff0c;举出数据找规律&#xff0c;即可AC。。。 不过悲催的WA了好多次&#xff0c;后来发现竟把"YES"打印成"Yes"了。。。。 注释掉的代码是用来找规律的。。。 */ 1 #include <iostream>2 #include <cs…

centos 6 安装mysql,CentOS6.5安装MySQL教程(完整教程)

Step 1&#xff1a;检测系统是否安装MYSQL# yum list installed | grep mysql顺便提下如果yum有如下提示不能用的情况&#xff1a;yum在自动更新原因是yum在自动更新 只要关掉它就OK了解决方案&#xff1a;直接输入# rm -f /var/run/yum.pid或者&#xff1a;# /etc/init.d/y…

php通过条件来定义const,php用const出错是什么原因

大家都知道define是定义常量的,如果在类中定义常量呢&#xff1f;当然不能用define&#xff0c;而用const&#xff0c;如下例&#xff1a;<?php //在类外面通常这样定义常量define("PHP","phpernote.com");class MyClass{ //常量的值将始终保持不变。在…

UE4角色Location远距离时动画抖动问题(float精度不够)解决方案

正题&#xff1a;关于UE4引擎当角色Location超过9999.999后&#xff0c;角色动画更新抖动问题的解决思路。 前提&#xff1a; 1.UE4引擎中距离单位是厘米(cm)&#xff0c;也就说我们制作好1.8米的角色在UE4中为180个虚幻单位。这样做个人愚见是为了提高浮点值&#xff08;float…

android Handler的使用(一)

Handler的使用(一) Handler基本概念&#xff1a; Handler主要用于异步消息的处理&#xff1a;当发出一个消息之后&#xff0c;首先进入一个消息队列&#xff0c;发送消息的函数即刻返回&#xff0c;而另外一个部分逐个的在消息队列中将消息取出&#xff0c;然后对消息进行出来…

现实地形导入UE4全流程

制作地形方法很多&#xff0c;今天给大家分享一种原创野套路。此方法特点是将现实中的地形于UE4中呈现&#xff0c;而不是手动绘制地形。首先从地理空间数据云获得指定区域的地理数据&#xff0c;然后使用GlobalMapper更准确选出区域并把数据转换成WorldMachine可识别的格式&am…

大地形pawn抖动问题

在pawn的event tick里调用下面函数即可

Bootstrap页面布局16 - BS导航菜单和其响应式布局以及导航中的下拉菜单

代码&#xff1a; <div classcontainer-fluid><h2 classpage-header>导航</h2><!--    .navrbar navbar-fixed-top:导航固定显示在顶部&#xff0c;对应的navbar-fixed-bottom:导航固定显示在页面底部    .brand:提示文字或者主题    .active…

hdu 1874(Dijkstra + Floyd)

链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid1874 畅通工程续 Time Limit: 3000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 27692 Accepted Submission(s): 10019 Problem Description某省自从实行了很多年…

Web 开发中很实用的10个效果【附源码下载】

在工作中&#xff0c;我们可能会用到各种交互效果。而这些效果在平常翻看文章的时候碰到很多&#xff0c;但是一时半会又想不起来在哪&#xff0c;所以养成知识整理的习惯是很有必要的。这篇文章给大家推荐10个在 Web 开发中很有用的效果&#xff0c;记得收藏&#xff01; 超炫…

蓝图中实现人物移动2

从Pawn继承一个蓝图类并编写下面代码&#xff0c;并添加摄像机组件 1. 实现前后移动2. 实现左右移动3. 实现鼠标移动方向4. 实现鼠标俯仰

实现两个pawn的切换

在playercontroller里面编写下面代码并把两个pawn放置到场景中

steam程序员php玩的游戏,Steam:又一款烧脑的编程游戏上线,宅男回家了也要开心加班!...

原标题&#xff1a;Steam&#xff1a;又一款烧脑的编程游戏上线&#xff0c;宅男回家了也要开心加班&#xff01;要是小伙伴们喜欢什么解谜、编程类游戏&#xff0c;相信Steam上的《程序员升职记》应该都是绿了的游戏&#xff0c;这款给宅男们设计智力游戏能让你享受到从底层到…

spline 用法

控制actor在level中沿着一个spline path运动。 由finterp to 函数的输出数值来控制每一帧actor运动的距离。 从开始位置到spline path的终点的时间&#xff0c;是1/interp speed。假如我们控制actor从开头到终点运动的总时间是1秒&#xff0c;那么 interp speed就传入0.5&#…

HTML5 Canvas 高仿逼真 3D 布料图案效果

HTML5 规范引进了很多新特性&#xff0c;其中最令人期待的之一就是 Canvas 元素&#xff0c;HTML5 Canvas 提供了通过 JavaScript 绘制图形的方法&#xff0c;非常强大。下面给大家分享一个 HTML5 Canvas 绘制的 3D 布料图案效果。 温馨提示&#xff1a;为保证最佳的效果&#…

本地windows主机无法访问虚拟机里主机解决办法

一&#xff1a;设置虚拟机里IP&#xff0c;使其与本地计算机IP在同一网段 本地计算机网络IP设置如下&#xff1a; 虚拟机里ip为192.168.1.9 设置IP步骤请参考&#xff1a;Linux里如何设置IP(RED HAT) 二&#xff1a;将虚拟机网络连接方式设为桥接 假如&#xff0c;VirtualBox不…

linux服务器3306端口,linux系统对外开放3306、8080等端口,防火墙设置详解

linux系统对外开放3306、8080等端口&#xff0c;防火墙设置详解发布时间&#xff1a;2020-10-10 23:08:49来源&#xff1a;脚本之家阅读&#xff1a;141作者&#xff1a;julielele栏目&#xff1a;服务器我们很多时候在liunx系统上安装了web服务应用后(如tomcat、apache等)&…

hdu--1231--并查集连分量的个数

我觉得 这题 是纯粹的 并查集 可以算成 入门题吧 问你有几章桌子 就是问你有几个 连通块嘛 一个道理 touch me 这题 我采用了下 father[x]开始 初始化为-1 1 #include <iostream>2 #include <cstring>3 using namespace std;4 5 const int size 1010;6 int fathe…

landscape 1

1. 创建出landscape的分层材质2. 把材质添加给landscape后&#xff0c;可以在landscape的画刷模式下看到3. 通过点击右侧的加号&#xff0c;依次添加layer后&#xff0c;就可以使用他们进行地形的绘制。 通过右键菜单可以快速填充和清除对应的layer4. 用下面的方法修改材质的法…

linux进程和线程教程,Linux下查看进程和线程

在Linux中查看线程数的三种方法1、top -H手册中说&#xff1a;-H : Threads toggle加上这个选项启动top&#xff0c;top一行显示一个线程。否则&#xff0c;它一行显示一个进程。2、ps xH手册中说&#xff1a;H Show threads as if they were processes这样可以查看所有存在的线…