日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

OpenGL: 实现立体显示

發(fā)布時間:2023/12/10 编程问答 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 OpenGL: 实现立体显示 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

立體顯示原理:設(shè)沒有立體顯示的模型視圖矩陣ModelView為Mv,投影矩陣為Mp,則、物體空間的任何一點為P,則變換到屏幕坐標P*=Mp×Mv×P;注意前面已經(jīng)說過opengl里面坐標列優(yōu)先,所以矩陣都是右乘。

左眼和右眼的變換都是由中間的變換矩陣變換而來,則立體顯示中左眼的變換矩陣公式為:

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

右眼的矩陣變換公式為:

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

其中Ms,Mt是立體顯示需要而增加的變換。

程序里面有幾個參數(shù),現(xiàn)實世界眼睛到屏幕的距離Fd,兩眼之間的距離Sd,比例尺R,如圖:

如上圖:沒有立體顯示,視點位于就是中間的藍色位置,立體顯示就是將左眼(紅色),右眼(綠色)的視圖分開繪制。

程序中左眼用紅色去畫,右眼同時用綠色和藍色繪制。

?

代碼:

[cpp] view plaincopy
  • #include?<windows.h>??
  • #include?<GL/glut.h>??
  • #include?<math.h>??
  • ??
  • #pragma?comment(lib,"glut32.lib")??
  • #pragma?comment(lib,"glu32.lib")??
  • #pragma?comment(lib,"opengl32.lib")??
  • ??
  • 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);??
  • }??
  • /**//*----------------------------------------------------------------------------?
  • *????初始化參數(shù)?????
  • */??
  • 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函數(shù)里面的參數(shù)??
  • GLfloat?fovy?=?60.0;????????????????????????//張角??
  • GLfloat?f?=?1?/?tan(?(fovy?*?PI)?/?(2?*?180)?);????//f=ctg(fovy/2);??
  • ??
  • //列優(yōu)先的矩陣模型視圖矩陣,投影矩陣??
  • 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?View?port??
  • ????glMatrixMode(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?View?port??
  • ????glMatrixMode(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)??
  • {??
  • ????if?(h?==?0)??
  • ????{??
  • ????????h?==?1;??
  • ????}??
  • ????glViewport?(0,?0,?(GLsizei)?w,?(GLsizei)?h);??
  • ????glMatrixMode?(GL_PROJECTION);??
  • ????glLoadIdentity();??
  • ????//投影矩陣:Mp??
  • ?????gluPerspective(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;??
  • }?
  • 總結(jié)

    以上是生活随笔為你收集整理的OpenGL: 实现立体显示的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。