查看: 2190|回复: 11

怎么取消osg自带的鼠标左右键功能,自己定义或选择相应的功能?谢谢!

[复制链接]

该用户从未签到

发表于 2009-10-15 09:00:34 | 显示全部楼层 |阅读模式
怎么取消osg自带的鼠标左右键功能,自己定义或选择相应的功能?谢谢!

该用户从未签到

发表于 2009-10-15 10:43:16 | 显示全部楼层
自定义操作器就可以了,,继承自osg::MatrixManipulator类,,重新handle()~~~~~可以参照TrackballManipulator的源码~~~~~

该用户从未签到

 楼主| 发表于 2009-10-21 13:24:27 | 显示全部楼层
具体从那可以找到鼠标操作的源码?

该用户从未签到

发表于 2009-10-21 13:26:37 | 显示全部楼层
bool TrackballManipulator::handle(const GUIEventAdapter& ea,GUIActionAdapter& us)


if (buttonMask==GUIEventAdapter:EFT_MOUSE_BUTTON)
    {

        // rotate camera.

        osg::Vec3 axis;
        float angle;

        float px0 = _ga_t0->getXnormalized();
        float py0 = _ga_t0->getYnormalized();
        
        float px1 = _ga_t1->getXnormalized();
        float py1 = _ga_t1->getYnormalized();
        

        trackball(axis,angle,px1,py1,px0,py0);

        osg:uat new_rotate;
        new_rotate.makeRotate(angle,axis);
        
        _rotation = _rotation*new_rotate;

        return true;

    }
    else if (buttonMask==GUIEventAdapter::MIDDLE_MOUSE_BUTTON ||
        buttonMask==(GUIEventAdapter::LEFT_MOUSE_BUTTON|GUIEventAdapter::RIGHT_MOUSE_BUTTON))
    {

        // pan model.

        float scale = -0.3f*_distance;

        osg::Matrix rotation_matrix;
        rotation_matrix.makeRotate(_rotation);

        osg::Vec3 dv(dx*scale,dy*scale,0.0f);

        _center += dv*rotation_matrix;
        
        return true;

    }
    else if (buttonMask==GUIEventAdapter::RIGHT_MOUSE_BUTTON)
    {

        // zoom model.

        float fd = _distance;
        float scale = 1.0f+dy;
        if (fd*scale>_modelScale*_minimumZoomScale)
        {

            _distance *= scale;

        }
        else
        {

            // notify(DEBUG_INFO) << "ushing forward"<<std::endl;
            // push the camera forward.
            float scale = -fd;

            osg::Matrix rotation_matrix(_rotation);

            osg::Vec3 dv = (osg::Vec3(0.0f,0.0f,-1.0f)*rotation_matrix)*(dy*scale);

            _center += dv;

        }

        return true;

    }

该用户从未签到

 楼主| 发表于 2009-10-21 22:00:57 | 显示全部楼层
您这是一个osg自带的左右鼠标操作源码嘛?

该用户从未签到

 楼主| 发表于 2009-10-21 22:08:10 | 显示全部楼层
这是一个osg程序自带的左右鼠标操作源码嘛?在visual 2005中怎么操作找到的源码?

该用户从未签到

发表于 2009-10-22 01:39:32 | 显示全部楼层
你去源码库里面去找,,,osgManipulator这个文件夹里面~······

该用户从未签到

 楼主| 发表于 2009-10-22 14:25:37 | 显示全部楼层
那我要取消自带的鼠标的操作就需要自己定义类似的操作器类,继承于osg::Manipulator,然后判断鼠标操作的代码中写不做事件的代码,是这样?我是osg的最初级的新手,希望高手不弃赐教!谢谢

该用户从未签到

发表于 2009-10-22 15:19:16 | 显示全部楼层
不要使用setCameraManipulator(),并且使用仿真循环
while ( !viewer.done() ) viewer.frame();
替代
viewer.run();

该用户从未签到

 楼主| 发表于 2009-10-22 16:24:20 | 显示全部楼层
我试了不可以,并且我先前载入的图像也没有了???

该用户从未签到

发表于 2009-10-22 16:33:46 | 显示全部楼层
模仿库里面的操作控制器类,复制粘贴做一个新类很简单的;
看不见以前图像,可能视点没设置对(按空格到合适视点),也可能是透视投影矩阵没设置好

该用户从未签到

发表于 2009-10-22 17:13:54 | 显示全部楼层
10# cuixinxin

去掉漫游器的话,您得自己定义正确的观察矩阵和投影矩阵才可以啊!在运行前或者回调中适时设置getCamera()的矩阵
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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