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…

linux下 如何调试php,linux下使用gdb对php源码调试

title: linux下使用gdb对php源码调试date: 2018-02-11 17:59:08tags:---linux下使用gdb进行php调试调试了一些php的漏洞&#xff0c;记录一下大概的过程安装编译phpsudo apt-get install -y autoconf libtool re2c libxml2-dev openssl libcurl4-openssl-dev libbz2-dev libjpe…

安装sqlserver2008,重新启动计算机不通过的解决办法

安装sqlserver2008&#xff0c;重新启动计算机不通过的解决办法 解决步骤&#xff1a;a 、重启机器&#xff0c;再进行安装&#xff0c;如果发现还有该错误&#xff0c;请按下面步骤b、在开始->运行中输入regeditc、到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\…

php调用数据二行一组,PHPCMS v9指定行数从第2条或第N条开始调用数据的方法

在PHPCMSV9的模板中&#xff0c;如果想调用数据时&#xff0c;经常会遇到第一条新闻有缩略图文字&#xff0c;从第二条开始是文字列表&#xff1b;或者第一条标题字号字体和颜色特殊&#xff0c;第二条开始正常列表&#xff0c;这时候如果我们调用两次的话&#xff0c;会导致同…

线段树(单点更新(模板)) 之 hdu 1166

// [7/24/2014 Sjm] /* 第一道用线段树做的题&#xff0c;照着大神的代码风格写的&#xff0c;&#xff0c;就当作线段树单点更新的模板吧。。。。(当年用树状数组做的&#xff1a;代码见这里) */ 1 #include <iostream>2 #include <cstdlib>3 #include <cstdi…

深入浅出MFC文档/视图架构之文档模板

在"文档/视图"架构的MFC程序中&#xff0c;提供了文档模板管理者类CDocManager&#xff0c;由它管理应用程序所包含的文档模板。我们先看看这个类的声明&#xff1a; / // CDocTemplate manager object class CDocManager : public CObject {DECLARE_DYNAMIC(CDocMa…

深入浅出MFC文档/视图架构之文档

1、文档类CDocument在"文档/视图"架构的MFC程序中&#xff0c;文档是一个CDocument派生对象&#xff0c;它负责存储应用程序的数据&#xff0c;并把这些信息提供给应用程序的其余部分。CDocument类对文档的建立及归档提供支持并提供了应用程序用于控制其数据的接口&a…

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…

linux学习之一

忙啦几天&#xff0c;今天终于又有时间在这里打理本园子啦&#xff0c;今天写一下linux下磁盘如何自动挂载其实很简单&#xff0c;要让某些 partition 在开机的时候就自动挂载&#xff0c;写入 /etc/fstab 当中&#xff0c;或者是将指令完整的写到 /etc/rc.d/rc.local&#xff…

MFC 多文档源码分析1

添加模板在复写的CWinApp::InitInstance()函数中添加下面代码 CMultiDocTemplate* pDocTemplate; pDocTemplate new CMultiDocTemplate(IDR_SMARTTTYPE,RUNTIME_CLASS(CCosiWorksDoc),RUNTIME_CLASS(CChildFrame), // custom MDI child frameRUNTIME_CLASS(CCosiWorksView)); …

matlab求零空间,matlab求矩阵的零空间的一组整数基,该怎样操作?

匿名用户1级2015-09-18 回答第一部分&#xff1a;矩阵基本知识一、矩阵的创建直接输入法利用Matlab函数创建矩阵利用文件创建矩阵二、矩阵的拆分矩阵元素矩阵拆分特殊矩阵三、矩阵的运算算术运算关系运算逻辑运算四、矩阵分析对角阵三角阵矩阵的转置与旋转矩阵的翻转矩阵的逆与…

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;然后对消息进行出来…

php和python的多线程,Python多线程以及线程锁简单理解(代码)

本篇文章给大家带来的内容是关于Python多线程以及线程锁简单理解(代码)&#xff0c;有一定的参考价值&#xff0c;有需要的朋友可以参考一下&#xff0c;希望对你有所帮助。多线程threading 模块创建线程创建自己的线程类线程通信线程同步互斥方法线程锁需要了解&#xff01;&a…

现实地形导入UE4全流程

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

php对象存储hadoop存储,三个理由告诉你对象存储替换HDFS还不错

Hadoop使企业能够对庞大的非结构化数据集进行大规模分析处理。这个数据集可以包含数以百万计&#xff0c;甚至数十亿个需要读取的文件。为了降低成本并提高数据处理性能&#xff0c;数据和应用程序应该存在于相同的物理硬件上。这样做使数据无需移动&#xff0c;就地处理&#…

Web请求中同步与异步的区别

普通的B/S模式就是同步&#xff0c;而AJAX技术就是异步&#xff0c;当然XMLHttpReques有同步的选项。 同步&#xff1a;提交请求->等待服务器处理->处理完毕返回。这个期间客户端浏览器不能干任何事。 异步: 请求通过事件触发->服务器处理&#xff08;这是浏览器仍然可…

大地形pawn抖动问题

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

php蓝牙连接不上,蓝牙音响连接不上手机怎么办 两种方法轻松解决连接问题

我们听歌一般用耳机和音响。现在蓝牙音频越来越普及&#xff0c;但毕竟是无线产品。信号不时中断或不连接是正常的。蓝牙音频连不上手机真的很头疼。出现这种情况的原因是什么&#xff0c;如何解决&#xff1f;为什么蓝牙音频不能连接到手机1.蓝牙音频没有进入匹配状态&#xf…