查看: 1001|回复: 2

osg的ortho定义跟opengl不一致?

[复制链接]

该用户从未签到

发表于 2014-4-1 00:38:40 | 显示全部楼层 |阅读模式
  1. #include <osgDB/ReadFile>
  2. #include <osg/Texture2D>
  3. #include <osgViewer/Viewer>
  4. #include <osg/ShapeDrawable>

  5. #ifdef _DEBUG

  6. #pragma comment(lib,"osgGAd.lib")
  7. #pragma comment(lib,"osgViewerd.lib")
  8. #pragma comment(lib,"osgDBd.lib")
  9. #pragma comment(lib,"OpenThreadsd.lib")
  10. #pragma comment(lib,"osgd.lib")
  11. #pragma comment(lib,"osgUtild.lib")

  12. #else

  13. #pragma comment(lib,"osgGA.lib")
  14. #pragma comment(lib,"osgViewer.lib")
  15. #pragma comment(lib,"osgDB.lib")
  16. #pragma comment(lib,"OpenThreads.lib")
  17. #pragma comment(lib,"osg.lib")
  18. #pragma comment(lib,"osgUtil.lib")
  19. #pragma comment(lib,"osgText.lib")
  20. #pragma comment(lib,"Winmm.lib")
  21. #endif
  22. int main()
  23. {
  24.         osgViewer::Viewer *viewer = new osgViewer::Viewer;

  25.         {
  26.                 osg::Camera *c = new osg::Camera;

  27.                 c->setViewport(0,0,800,600);
  28.                 c->setViewMatrixAsLookAt(osg::Vec3(0,0,0),osg::Vec3(0,0,-1),osg::Vec3(0,1,0));
  29.                 c->setProjectionMatrixAsOrtho(0,800,0,600,-5,5);

  30.                 c->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
  31.                 c->setRenderOrder(osg::Camera::POST_RENDER);

  32.                 osg::Geode *bg = new osg::Geode;
  33.                 bg->addDrawable(new osg::ShapeDrawable( new osg::Box(osg::Vec3(100,600/2,-1),20,40,1) ) );
  34.                 bg->addDrawable(new osg::ShapeDrawable( new osg::Box(osg::Vec3(300,600/2,0),50,50,1) ) );
  35.                 bg->addDrawable(new osg::ShapeDrawable( new osg::Box(osg::Vec3(500,600/2,1),100,50,1) ) );

  36.                 c->addChild(bg);
  37.                 viewer->setSceneData(c);
  38.         }

  39.         while (!viewer->done())
  40.         {
  41.                 viewer->frame();
  42.         }
  43.         return 0;
  44. }
复制代码


第三个osg::Box死活要修改ViewMatrix,让视点再后退一点才行。在测试中发现应该是osg需要顶点位于镜头前面才能进行显示。
但是按照opengl的定义,代码里面这个默认的ViewMatrix加上(0,800,0,600,-5,5)的ortho已经足以显示z坐标位于(-5,5)之间的顶点。
第三个Box明显应该能显示出来才对。

what happened? 哪位大神能测试,给个解释?

该用户从未签到

发表于 2014-4-2 21:17:48 | 显示全部楼层
应该是自动计算远近平面造成的问题
设置
  1. c->setComputeNearFarMode(osg::Camera::DO_NOT_COMPUTE_NEAR_FAR);
复制代码

默认的远近平面自动计算是不会超出到眼睛后面的,而且肯定是大于0,那么你那个盒子正好也就被重新计算的近平面裁减掉了,所以你设置DO_NOT_COMPUTE或者把盒子的zWidth修改成一个更大的值应该都可以

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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