查看: 1126|回复: 5

回调函数问题

[复制链接]

该用户从未签到

发表于 2013-1-6 11:06:00 | 显示全部楼层 |阅读模式
让场景不翻过去。下面是我的思路,有些问题。
mViewer->setCamera(camera.get());
    camera->addUpdateCallback(new viewcontrol());
//事件处理函数
void  viewcontrol:perator()( osg::Node* node, osg::NodeVisitor* nv )
{
       
        //
        osg::Camera* camera =dynamic_cast<osg::Camera*>( node );
        camera->getViewMatrixAsLookAt(position,center,up);
        if(position[2]<0)
        {
                osg::Vec3 positionnew(0,-100,100) ;
                        osg::Vec3 centernew(0,0,0) ;
                       osg::Vec3 upnew(0,0,1) ;
                camera->setViewMatrixAsLookAt(positionnew,centernew,upnew);
                                 //这个里面如何让mViewer重新绘制
        }         
  
}
各位高手  谁有更好的办法。

该用户从未签到

发表于 2013-1-6 12:02:03 | 显示全部楼层
??

该用户从未签到

发表于 2013-1-6 12:43:31 | 显示全部楼层
有一个办法你可以尝试用一下:
  1. class CameraManipulatorProxy :public osgGA::CameraManipulator
  2. {
  3. public:
  4.         CameraManipulatorProxy(osgGA::CameraManipulator *manipulator)
  5.         _manipulator(manipulator){}
  6.        
  7.         //...
  8.         void setByMatrix(const osg::Matrixd & matrix);
  9.         void setByInverseMatrix(const osg::Matrixd & matrix);
  10.         osg::Matrixd getMatrix()const;
  11.         osg::Matrixd getInverseMatrix()const;
  12.         void doFilter(osg::Vec3d & eye,osg::Vec3d &center,osg::Vec3d &up);
  13.         //...
  14. private:
  15.         osg::ref_ptr<osgGA::CameraManipulator> _manipulator;
  16. };

  17. void CameraManipulatorProxy::setByMatrix(const osg::Matrixd & matrix)
  18. {
  19.         //
  20.         osg::Vecd3 eye,center,up;
  21.        
  22.         osg::Matirxd mat;
  23.         matrix->getLookAt(&eye,&center,&up);
  24.         doFilter(eye,center,up);
  25.        
  26.         mat.makeLookAt(eye,center,up);
  27.         _manipulator->setByMatrix(mat);
  28. }

  29. void CameraManipulatorProxy::setByInverseMatrix(const osg::Matrixd & matrix)
  30. {
  31.         //
  32.         osg::Vecd3 eye,center,up;
  33.         osg::Matirxd matinv,mat,mat_result;
  34.         matinv = osg::Matrixd::inverse(matrix);
  35.         matinv->getLookAt(&eye,&center,&up);
  36.         doFilter(eye,center,up);
  37.         mat_result.makeLookAt(eye,center,up);
  38.         _manipulator->setByMatrix(mat_result);
  39. }

  40. osg::Matrixd CameraManipulatorProxy::getMatrix()const
  41. {
  42.         return _manipulator->getMatrix();
  43. }

  44. osg::Matrixd CameraManipulatorProxy::getInverseMatrix()const
  45. {
  46.         return _namipulator->getInverseMatrix();
  47. }

  48. void doFilter(osg::Vec3d & eye,osg::Vec3d &center,osg::Vec3d &up)
  49. {
  50.         //在这里做你自己想要的过滤
  51. }
复制代码

该用户从未签到

发表于 2013-1-6 12:46:52 | 显示全部楼层
在客户端这样写:
  1. osg::ref_ptr<CameraManipulatorProxy> proxy = new CameraManipulatorProxy(new osgGA::TrackballManipulator());

  2. mViewer->setCamera(proxy);
复制代码

该用户从未签到

 楼主| 发表于 2013-1-6 14:19:49 | 显示全部楼层
我的意思是 给相机增加一个监控事件,防止场景翻过去,就是视点z>0.

该用户从未签到

发表于 2013-1-6 22:09:42 | 显示全部楼层
编写自己的漫游器通过漫游器实现~
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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