查看: 1834|回复: 16

OSG后视图问题

[复制链接]

该用户从未签到

发表于 2013-11-20 21:32:14 | 显示全部楼层 |阅读模式
小弟最近在看《Open Scence Graph一书 三维视景仿真技术开发详解》在看到后视图创建的时候发现后视图一直无法显示。这是我的代码,请大牛们华丽的找出问题。

  1. #ifdef _DEBUG
  2. #pragma comment(lib,"osgViewerd.lib")
  3. #pragma comment(lib,"OpenThreadsd.lib")
  4. #pragma comment(lib,"osgd.lib")
  5. #pragma comment(lib,"osgDBd.lib")
  6. #else
  7. #pragma comment(lib,"osgViewer.lib")
  8. #pragma comment(lib,"OpenThreads.lib")
  9. #pragma comment(lib,"osg.lib")
  10. #pragma comment(lib,"osgDB.lib")
  11. #endif

  12. #include <osgViewer/Viewer>
  13. #include <osgDB/ReadFile>
  14. #include <osg/Camera>
  15. #include <osg/GraphicsContext>
  16. #include <osg/Texture2D>
  17. #include <osg/ShapeDrawable>
  18. #include <iostream>
  19. #include <osg/StateSet>
  20. #include <osg/Geode>
  21. #include <osg/ShapeDrawable>
  22. #include <osg/Material>
  23. #include <osg/Image>
  24. #include <osg/Texture2D>

  25. osg::Geode * CreateScene()
  26. {
  27.     osg::Geode * gmode= new osg::Geode;
  28.         gmode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0,0.0,0.0),10.0,30.0,150.0)));
  29.         gmode->addDrawable(new osg::ShapeDrawable(new osg::Box(osg::Vec3(0.0,0,0.0),150.0,10.0,10.0)));
  30.        
  31.         return gmode;

  32. }

  33. void CreateCamera(osgViewer::Viewer * myViewer)
  34. {
  35.         if (!myViewer)
  36.         {
  37.                 return;
  38.         }
  39.         osg::GraphicsContext::WindowingSystemInterface *wsi= osg::GraphicsContext::getWindowingSystemInterface();
  40.         if (!wsi)
  41.         {
  42.                 return;
  43.         }
  44.         unsigned int width,height;
  45.         wsi->getScreenResolution(osg::GraphicsContext::ScreenIdentifier(0),width,height);
  46.         osg::ref_ptr<osg::GraphicsContext::Traits> traits= new osg::GraphicsContext::Traits ;
  47.         traits->x=0;
  48.         traits->y=0;
  49.         traits->width=width;
  50.         traits->height=height;
  51.         traits->windowDecoration=false;
  52.         traits->doubleBuffer=true;
  53.         traits->sharedContext=0;
  54.         osg::ref_ptr<osg::GraphicsContext> gc= osg::GraphicsContext::createGraphicsContext(traits);
  55.         if (!gc)
  56.         {
  57.                 return;
  58.         }
  59.         osg::ref_ptr<osg::Camera> master= new osg::Camera;
  60.         master->setGraphicsContext(gc);
  61.         master->setViewport(0,0,width,height);
  62.         myViewer->addSlave(master);
  63.         osg::ref_ptr<osg::Camera> leftCam= new osg::Camera;
  64.         leftCam->setViewport(0,0,width/2,height/2);
  65.         leftCam->setGraphicsContext(gc);
  66.         leftCam->setRenderOrder(osg::Camera::POST_RENDER);
  67.         myViewer->addSlave(leftCam,osg::Matrix::scale(0.5,0.5,0.5),osg::Matrix::rotate(osg::DegreesToRadians(180.0),1.0,0.0,0.0),true);
  68.         osg::ref_ptr<osg::Group> root= new osg::Group;
  69.         root->addChild(CreateScene());
  70.         myViewer->setSceneData(root);
  71.         return;

  72. }
  73. int main()
  74. {
  75.          osg::ref_ptr<osgViewer::Viewer> myViewer= new osgViewer::Viewer;
  76.          CreateCamera(myViewer);
  77.          myViewer->run();
  78.          return 0;
  79. }
复制代码

该用户从未签到

 楼主| 发表于 2013-11-20 21:36:37 | 显示全部楼层
图片1.bmp

该用户从未签到

 楼主| 发表于 2013-11-21 10:32:00 | 显示全部楼层
QQ截图20131121103032.png
其中红色圈住的部分是后视图区域,后视图中看不到效果

该用户从未签到

发表于 2013-11-21 22:40:49 | 显示全部楼层
本帖最后由 乖o就一下 于 2013-11-21 22:44 编辑

不是看不到,是你对camera的理解不够深,你把模型无限拉近试试,过程中你就会看到后视图了。但是主视图中看不到了,如下图

该用户从未签到

发表于 2013-11-21 22:43:03 | 显示全部楼层
QQ图片20131121224151.jpg

该用户从未签到

 楼主| 发表于 2013-11-22 10:09:10 | 显示全部楼层

能给出更具体的解释吗?先谢谢了。

该用户从未签到

 楼主| 发表于 2013-11-22 10:15:32 | 显示全部楼层
xiang_521 发表于 2013-11-22 10:09
能给出更具体的解释吗?先谢谢了。

我的代码中后摄像机与主摄像机关于X轴对称,他们的实景区域也应该对称吧?

该用户从未签到

发表于 2013-11-22 12:16:59 | 显示全部楼层
本帖最后由 乖o就一下 于 2013-11-22 12:29 编辑

怎么说呢  我也不是很懂,我把我的模型给你 代码用的是杨的多视口,然后你把模型拉近看看。而且,这个貌似绕y轴旋转才是后视图。还有,绕x轴旋转,建议你换个模型,不要用这么规整的,不然他是怎么转的你都看不出来。

当然,我的也只是基于抽象理解,具体什么也不太清楚。在用viewer浏览时,貌似先要计算一下包围球,让整个模型出现在视域中。

该用户从未签到

发表于 2013-11-22 12:19:29 | 显示全部楼层
本帖最后由 乖o就一下 于 2013-11-22 12:35 编辑
xiang_521 发表于 2013-11-22 10:15
我的代码中后摄像机与主摄像机关于X轴对称,他们的实景区域也应该对称吧?


模型:
a.mtl (97 Bytes, 下载次数: 0)

该用户从未签到

发表于 2013-11-22 13:40:57 | 显示全部楼层

算了,换个代码吧,这个我给搞乱了。

该用户从未签到

发表于 2013-11-24 12:28:02 | 显示全部楼层
你可以直接推导关于平面对称的算法矩阵,如下:
一平面P的方程为(a,b,c,d)(x,y,z,1) = 0, A(x0,y0,z0,w0)关于平面P的对称点A1(x1,y1,z1,w1)为A1=MA,则M为:
|(-a*a + b*b + c*c)                     -2ab                      -2ac  -2ad |
|                     -2ab  (a*a - b*b + c*c)                      -2bc  -2bd |
|                     -2ac                     -2bc   (a*a + b*b - c*c)  -2cd  |   / (a*a + b*b + c*c)
|                         0                         0                          0       1 |


你可以使用此矩阵作个转换。

该用户从未签到

 楼主| 发表于 2013-11-24 13:06:55 | 显示全部楼层
the_mercury 发表于 2013-11-24 12:28
你可以直接推导关于平面对称的算法矩阵,如下:
一平面P的方程为(a,b,c,d)(x,y,z,1) = 0, A(x0,y0,z0,w0) ...

辅助摄像机应该自动你能完成这样的功能吧?

该用户从未签到

 楼主| 发表于 2013-11-24 13:15:32 | 显示全部楼层

你说的这种情况,我也试了试,果然如你所说,但是还是不大明白辅助摄像机和主摄像机之间到底是怎么协同工作的?
QQ图片20131124131326.jpg

该用户从未签到

发表于 2013-11-26 15:44:26 | 显示全部楼层
xiang_521 发表于 2013-11-24 13:15
你说的这种情况,我也试了试,果然如你所说,但是还是不大明白辅助摄像机和主摄像机之间到底是怎么协同工 ...

偶也不是很懂,大概主辅相机就是在一点的吧,之前尝试改变辅相机的世界位置,但是太菜了,没成功。ni做这个弄什么呢?

该用户从未签到

发表于 2013-11-26 15:45:50 | 显示全部楼层
the_mercury 发表于 2013-11-24 12:28
你可以直接推导关于平面对称的算法矩阵,如下:
一平面P的方程为(a,b,c,d)(x,y,z,1) = 0, A(x0,y0,z0,w0) ...

高手呀

该用户从未签到

发表于 2014-5-14 20:51:51 | 显示全部楼层
我也遇到了同样的问题,虽然我也不知道camera的距离原理,但是参考了“乖o就一下”的回复(就是放大缩小)后,尝试着,在旋转相机(后视图是沿着y轴旋转180),之后,沿着负z轴方向,移动一定距离,即可显示,具体移动多少,自己尝试。
虽然过去很久了,肯定帮不到你了,但是希望对其他看到的人有所帮助。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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