查看: 2817|回复: 12

如何程序控制键盘事件???

[复制链接]

该用户从未签到

发表于 2009-8-31 17:47:07 | 显示全部楼层 |阅读模式
我通过osgGA::KeySwitchMatrixManipulator定义了一些键盘事件,从窗口中键入相应键可以相应,但我想通过程序控制响应相应事件,我尝试osgGA::GUIEventAdapter *pEvent = new osgGA::GUIEventAdapter();
pEvent->setKey('v');
m_Viewer.getEventQueue()->addEvent(pEvent );
没有反应。

请高人指点!!!!!

该用户从未签到

发表于 2009-8-31 20:29:29 | 显示全部楼层
不会有反应的,因为handle()函数是处理已经完成的事件,在其中加入新事件通常是不会有结果的(因为会被随即清空)。
要自己传入事件的话,可以考虑自己派生新的GraphicsWindow类并重写checkEvents函数,不过这肯定非常麻烦

该用户从未签到

发表于 2009-9-4 18:37:38 | 显示全部楼层
如果是使用类似Qt这样的GUI库 是不是可以模拟向Viewer所在的QGLWidget发送键盘事件?

该用户从未签到

发表于 2009-9-4 21:47:47 | 显示全部楼层
用Hook系统钩子的话,当然可以;不过我个人觉得只是进行试验的话,这样做未免有些太过繁琐,不知您具体想实现什么功能

该用户从未签到

发表于 2009-9-6 12:03:46 | 显示全部楼层
我也有这样的问题 我是自己定义了一个操作器COperation,然后
        osg::ref_ptr<osg::Camera> camera=new osg::Camera;
        camera->setGraphicsContext(gc);
        camera->setViewport(new osg::Viewport(traits->x,traits->y,traits->width,traits->height));
        m_viewer->addSlave(camera.get());
        //m_viewer->setCameraManipulator(keyswichmanipulator.get());
           m_viewer->setCameraManipulator(new COperation());
        m_viewer->setSceneData(m_root.get());
                用上边注释掉的那个keyswitchmanipulator.get() 选择默认操作器就可以实现 而用我的这个 new COperation 运行后模型不见了 操作也没有 这是怎么回事?谢谢

该用户从未签到

发表于 2009-9-6 16:32:28 | 显示全部楼层
我不知道您的COperation的内容,不太可能猜出您的问题所在

该用户从未签到

发表于 2009-9-6 16:47:32 | 显示全部楼层
COperation里面的内容有
virtual bool handle(const osgGA::GUIEventAdapter& ea,osgGA::GUIActionAdapter& aa);
//handle里面有各种控制方向的操作
float m_fAngle;//屏幕角度 用于视角旋转
void Highlight(float x,float y,osg::ref_ptr<osg::Node> modelname);
void ChangePosition(osg::Vec3& delta);

float getSpeed();
void setSpeed(float);

//设置视点位置
void setViewPosition(osg::Vec3& position);
void setViewPosition(double*);
osg::Vec3 getViewPosition();
void computeHomePosition();
如果这些还不够的话我再把cpp文件发来 谢谢了

该用户从未签到

发表于 2009-9-6 17:01:20 | 显示全部楼层
getMatrix和getInverseMatrix这两个函数是漫游器的核心,如果您没有实现它们的功能,那么漫游器不可能起作用。

该用户从未签到

发表于 2009-9-6 17:21:02 | 显示全部楼层
我实现的是这个
osg::Matrixd mat;
然后设置 mat的makeRotate
然后返回 return mat* osg::Matrixd::translate(m_vPosition);

相应的Inverse 也是如此方法 还有什么要补充的吗

该用户从未签到

发表于 2009-9-6 18:18:24 | 显示全部楼层
那么您需要随时保证mat和m_vPosition的正确性。除此之外没有要注意的了

该用户从未签到

发表于 2009-9-6 18:59:45 | 显示全部楼层
哦 那么我在调用COperation的时候 m_viewer->setCameraManipulator(new COperation()) 应该可以实现的吧 可是运行后只有蓝色背景 我本来定影s键是向后退 可是按下s后还是默认的出现帧率等数据的状况
我是在mfc下写的程序 这个操作器在InitOSG里面 然后在**view类中 我的**View::OnInitialUpdate()调用了InitOSG这个函数(里面是读入模型、初始化窗口矩形、初始化相机
osg::ref_ptr<osg::Camera> camera=new osg::Camera;
        camera->setGraphicsContext(gc);
        camera->setViewport(new osg::Viewport(traits->x,traits->y,traits->width,traits->height));
        m_viewer->addSlave(camera.get());
        //m_viewer->setCameraManipulator(keyswichmanipulator.get());
           m_viewer->setCameraManipulator(new COperation());
        m_viewer->setSceneData(m_root.get());
        m_viewer->realize();)
再麻烦老师分析一下 谢谢

该用户从未签到

发表于 2009-9-6 19:49:54 | 显示全部楼层
按下s后还是默认的出现帧率,这是addHandler(StatesHandler)的效果,去掉这一行才可以。
运行后只有蓝色背景,说明您没有把computeHomePosition的结果传递给您的观察矩阵,请检查自己的代码编写

该用户从未签到

发表于 2009-9-6 20:53:28 | 显示全部楼层
好的 我再试试 谢谢老师了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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