|
版主们你们好:
有问题急需请教,困扰了我一段时间了!
最近需要实现环形幕的双通道拼接融合的效果,程序分别运行在两台机器上,用两台投影仪投到环形幕上,中间是融合区,融合区的大小都知道,融合是用软件实现的融合,现在困扰我的是如何让这两台机器上的三维场景在中间区域能很好的拼接显示一个完整的场景。请版主们提供一下思路!另一方面,我找了一些相关的资料了解到,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); 这个函数是偏移视椎还是偏移视点? |
|