查看: 1994|回复: 4

双通道拼接融合问题

[复制链接]

该用户从未签到

发表于 2012-8-23 10:12:29 | 显示全部楼层 |阅读模式
版主们你们好:
    有问题急需请教,困扰了我一段时间了!
最近需要实现环形幕的双通道拼接融合的效果,程序分别运行在两台机器上,用两台投影仪投到环形幕上,中间是融合区,融合区的大小都知道,融合是用软件实现的融合,现在困扰我的是如何让这两台机器上的三维场景在中间区域能很好的拼接显示一个完整的场景。请版主们提供一下思路!另一方面,我找了一些相关的资料了解到,Osg中可以通过设置投影矩阵(透视投影中的对称视锥,和非对称视锥不知道用哪一种?)将视椎各自朝融合区水平偏移一定角度进行拼接,而我了解osgcluster例子中又是设置观察矩阵将视点偏移一定角度(也就是通过SetViewMatrix函数实现偏移Camera_offset)。我比较迷糊,请版主们指点!
这是我找到的相关论文设置拼接的代码,可能是以前的代码,现在有很多函数都没有了,如果方面的画,帮忙用现在的函数翻译一下,非常感谢!呵呵,问题比较多!
//ar为投影面宽高比
  double ar = m_pCamera->getLensAspectRatio();
  //通过视锥水平张角m_DisFovX(由用户给定)得到垂直张角
  double vfov = RadiansToDegrees(
  2.0 * atan( tan(osg:egreesToRadians(m_DisFovX*0.5))/ar ) );
  //设置视锥
  m_pCamera ->setLensPerspective(m_DisFovX,vfov,1.0,1e6);
  //对称视锥(对应环形幕)
  double hfov = m_pCamera ->getLensHorizontalFov();
  double vfov = m_pCamera ->getLensVerticalFov();
  //设置偏移矩阵,m_OverlapX、m_OverlapY为融合区大小
  Matrix mat = Matrix::rotate(
  osg::inDegrees(m_OffsetX*(1-m_OverlapX)*hfov),Y_AXIS) ;
  mat *=Matrix::rotate(
   osg::inDegrees(-m_OffsetY*(1-m_OverlapY)*vfov),X_AXIS);
  //偏移视锥
  m_pCamera ->setOffset(mat.ptr(),0.0,0.0);

m_pCamera ->setOffset(mat.ptr(),0.0,0.0); 这个函数是偏移视椎还是偏移视点?

该用户从未签到

发表于 2012-8-23 11:19:39 | 显示全部楼层
有一个小软件叫做projection designer,你可以看一下

该用户从未签到

发表于 2012-8-28 10:43:37 | 显示全部楼层
N * M屏的拼接设置投影矩阵就可以了,osgposter例子使用这种方法来实现一个超大海报图的拼接输出的,多通道的矩阵设置与此类似

该用户从未签到

发表于 2012-8-30 15:25:07 | 显示全部楼层
环行幕最好还是设置观察矩阵吧

该用户从未签到

发表于 2012-9-6 17:07:52 | 显示全部楼层
环幕的正确做法是设置投影矩阵,但是要保证重合区域正确显示会比较麻烦。一个思路是先绘制无重合的各个幕画面,然后合并成一张完整的图再重新划分重合区域并渲染到各个屏幕~~当然其中如何保证同步和效率就是另一个问题了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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