查看: 1366|回复: 2

osgRecipes 控制四视图

[复制链接]

该用户从未签到

发表于 2013-8-17 18:32:08 | 显示全部楼层 |阅读模式
共有四个视图,一个视图默认轨迹球操作,其他三个操作调用下面的操作器!可是为什么轨迹球视图变化后,其他三个视图不随着变化啊?求解答

class AuxiliaryViewUpdater : public osgGA::GUIEventHandler
{
public:
    AuxiliaryViewUpdater()
    :   _distance(-1.0), _offsetX(0.0f), _offsetY(0.0f),
        _lastDragX(-1.0f), _lastDragY(-1.0f)
    {}
   
    virtual bool handle( const osgGA::GUIEventAdapter& ea, osgGA::GUIActionAdapter& aa )
    {
        osgViewer::View* view = static_cast<osgViewer::View*>(&aa);
        if ( view )
        {
            switch ( ea.getEventType() )
            {
            case osgGA::GUIEventAdapter:USH:
                _lastDragX = -1.0f;
                _lastDragY = -1.0f;
                break;
            case osgGA::GUIEventAdapter:RAG:
                if ( _lastDragX>0.0f && _lastDragY>0.0f )
                {
                    if ( ea.getButtonMask()==osgGA::GUIEventAdapter:EFT_MOUSE_BUTTON )
                    {
                        _offsetX += ea.getX() - _lastDragX;
                        _offsetY += ea.getY() - _lastDragY;
                    }
                    else if ( ea.getButtonMask()==osgGA::GUIEventAdapter::RIGHT_MOUSE_BUTTON )
                    {
                        float dy = ea.getY() - _lastDragY;
                        _distance *= 1.0 + dy / ea.getWindowHeight();
                        if ( _distance<1.0 ) _distance = 1.0;
                    }
                }
                _lastDragX = ea.getX();
                _lastDragY = ea.getY();
                break;
            case osgGA::GUIEventAdapter::FRAME:
                if ( view->getCamera() )
                {
                    osg::Vec3d eye, center, up;
                    view->getCamera()->getViewMatrixAsLookAt( eye, center, up );
                    
                    osg::Vec3d lookDir = center - eye; lookDir.normalize();
                    osg::Vec3d side = lookDir ^ up; side.normalize();
                    
                    const osg::BoundingSphere& bs = view->getSceneData()->getBound();
                    if ( _distance<0.0 ) _distance = bs.radius() * 3.0;
                    center = bs.center();
                    
                    center -= (side * _offsetX + up * _offsetY) * 0.1;
                    view->getCamera()->setViewMatrixAsLookAt( center-lookDir*_distance, center, up );
                }
                break;
            }
        }
        return false;
    }
   
protected:
    double _distance;
    float _offsetX, _offsetY;
    float _lastDragX, _lastDragY;
};

该用户从未签到

 楼主| 发表于 2013-8-19 14:05:44 | 显示全部楼层
怎么都没有人看啊?版主哪里呢???

该用户从未签到

发表于 2013-8-20 10:18:48 | 显示全部楼层
您可以运行原本的例子,是可以控制同时运动的
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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