查看: 1979|回复: 2

动态改变场景中物体,osgGA::TrackballManipulator放大到一定程度失效

[复制链接]

该用户从未签到

发表于 2013-7-8 21:28:04 | 显示全部楼层 |阅读模式
class dynamicAdd:public osgGA::GUIEventHandler
{
public:
    dynamicAdd(){}
    ~dynamicAdd(){}
    bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa)
    {
       osg::ref_ptr<osgViewer::Viewer>viewer=dynamic_cast<osgViewer::Viewer*>(&aa);
       if (viewer)
       {
           osg::ref_ptr<osg::Group> root=viewer->getSceneData()->asGroup();
       osg::ref_ptr<osgGA::TrackballManipulator>trackball=dynamic_cast<osgGA::TrackballManipulator*>(viewer->getCameraManipulator());
           switch(ea.getEventType())
           {
           case osgGA::GUIEventAdapter::KEYDOWN:
               if (ea.getKey()=='a')
              {
                      osg::ref_ptr<osg::Node>child=osgDB::readNodeFile("lz.osg");
root->addChild(child);
                  trackball->home(ea,aa);
              }
              break;
           default:
              break;
           }
       }
       return false;
    }
};
int main()
{
    //创建Viewer对象,场景浏览器
    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();
    osg::ref_ptr<osg::Group> root = new osg::Group();
    //读取模型
    osg::ref_ptr<osg::Node> node = osgDB::readNodeFile("cow.osg");
    root->addChild(node.get());
    viewer->addEventHandler(new dynamicAdd);
    //优化场景数据
    osgUtil::Optimizer optimizer ;
    optimizer.optimize(root.get()) ;
    viewer->setSceneData(root.get());
    viewer->realize();
    viewer->run();
    return 0 ;
}
osg场景中一开始添加某个对象,然后动态添加一个比较大的模型后,操作鼠标追踪球操作器trackball,发现当放到到一定程度后就不能放大了,不知道是怎么回事:

该用户从未签到

发表于 2013-7-8 21:56:45 | 显示全部楼层
TrackBallManipulator的运动是相对于球心的,是不是Camera的移动方向一直朝着球心的方向,如果是这样达到了球心一定距离(好像是0.05)那么就不会再放大了。

该用户从未签到

发表于 2013-7-9 18:59:40 | 显示全部楼层
可以换用TerrainManipulator来漫游较大的类似大范围地面的场景
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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