查看: 1218|回复: 3

如何实现地面立体效果

[复制链接]

该用户从未签到

发表于 2013-8-28 21:26:12 | 显示全部楼层 |阅读模式
本帖最后由 xingshujun 于 2013-8-29 19:38 编辑

  我用的是trackingball漫游器,想对osg库进行扩展。实现一系列立体,如红蓝,左右,上下等。
下面是displaysettings.cpp的源代码中的一部分,用于设置右眼视图的projection和view矩阵,其中projection左乘一个错切矩阵,view矩阵乘以一个水平方向平移矩阵。
  1. osg::Matrixd DisplaySettings::computeRightEyeProjectionImplementation(const osg::Matrixd& projection) const
  2. {
  3.     double iod = getEyeSeparation();
  4.     double sd = getScreenDistance();
  5.     double scale_x = 1.0;
  6.     double scale_y = 1.0;

  7.     if (getSplitStereoAutoAdjustAspectRatio())
  8.     {
  9.         switch(getStereoMode())
  10.         {
  11.             case(HORIZONTAL_SPLIT):
  12.                 scale_x = 2.0;
  13.                 break;
  14.             case(VERTICAL_SPLIT):
  15.                 scale_y = 2.0;
  16.                 break;
  17.             default:
  18.                 break;
  19.         }
  20.     }

  21.     if (getDisplayType()==HEAD_MOUNTED_DISPLAY)
  22.     {
  23.         // head mounted display has the same projection matrix for left and right eyes.
  24.         return osg::Matrixd::scale(scale_x,scale_y,1.0) *
  25.                projection;
  26.     }
  27.     else
  28.     {
  29.         // all other display types assume working like a projected power wall
  30.         // need to shjear projection matrix to account for asymetric frustum due to eye offset.
  31.         return osg::Matrixd(1.0,0.0,0.0,0.0,
  32.                            0.0,1.0,0.0,0.0,
  33.                            -iod/(2.0*sd),0.0,1.0,0.0,
  34.                            0.0,0.0,0.0,1.0) *
  35.                osg::Matrixd::scale(scale_x,scale_y,1.0) *
  36.                projection;
  37.     }
  38. }

  39. osg::Matrixd DisplaySettings::computeRightEyeViewImplementation(const osg::Matrixd& view, double eyeSeperationScale) const
  40. {
  41.     double iod = getEyeSeparation();
  42.     double es = 0.5*iod*eyeSeperationScale;

  43.     return view *
  44.            osg::Matrixd(1.0,0.0,0.0,0.0,
  45.                        0.0,1.0,0.0,0.0,
  46.                        0.0,0.0,1.0,0.0,
  47.                        -es,0.0,0.0,1.0);
  48. }
复制代码
为什么在垂直方向上projection左乘一个错切矩阵,在view上右乘一个平移矩阵。人站于地面屏幕前,就得不到下面的立体效果
新建位图图像.jpg

该用户从未签到

发表于 2013-8-29 13:52:03 | 显示全部楼层
我不认为computeRightEyeProjectionImplementation和computeRightEyeViewImplementation是DisplaySettings的虚函数,因此您这么写osg也不会去调用它

该用户从未签到

 楼主| 发表于 2013-8-29 19:41:29 | 显示全部楼层
不是虚函数,更改了,效果不对,是不是和漫游器有关系,在垂直方向上没有移轴效果

该用户从未签到

发表于 2013-9-10 09:26:58 | 显示全部楼层
如果这个函数是您自己写的,那么您并没有说它是如何被调用的,我也无法猜测。osg的所有立体效果实现都在SceneView当中,您可以参考它的做法进行扩展
您需要登录后才可以回帖 登录 | 注册

本版积分规则

OSG中国官方论坛-有您OSG在中国才更好

网站简介:osgChina是国内首个三维相关技术开源社区,旨在为国内更多的技术开发人员提供最前沿的技术资讯,为更多的三维从业者提供一个学习、交流的技术平台。

联系我们

  • 工作时间:09:00--18:00
  • 反馈邮箱:1315785073@qq.com
快速回复 返回顶部 返回列表