查看: 3507|回复: 3

OSG中键盘响应问题?

[复制链接]

该用户从未签到

发表于 2008-4-1 21:57:07 | 显示全部楼层 |阅读模式
初学OSG,对其中很多还不懂.关于键盘响应问题,近几日一直解决不了,请各位帮忙看一下代码错在哪里?

#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
using namespace std;

class PickHandler : public osgGA::GUIEventHandler
{
        bool handle( const osgGA::GUIEventAdapter& ea,
                osgGA::GUIActionAdapter& aa )
        {
                osgViewer::Viewer* viewer =
                        dynamic_cast<osgViewer::Viewer*>( &aa );
                if (!viewer)
                        return false;

                switch(ea.getEventType())
                {
                case(osgGA::GUIEventAdapter::KEY_Down):
                        {
                                if (ea.getKey() == 'q')
                                {
                                     //do something
                                int a;
                                cin>>a;
                                return false;
                                }
                        }
                default:
                        return false;
                }
                return false;
        }
};



        int main()
{
        osgViewer::Viewer viewer;

        osg::Group* root = new osg::Group;
          viewer.addEventHandler(new PickHandler());
        //改变背景演色
        osg::ClearNode* clearNode = new osg::ClearNode;
        clearNode->setClearColor(osg::Vec4(0.3f,0.4f,0.5f,1.0f));
        root->addChild(clearNode);
        //加载T72
         osg::Node* T72 =  osgDB::readNodeFile( "models//t72.ive" );
         root->addChild(T72);

        osg::Node* cessnaNode = NULL;
        cessnaNode = osgDB::readNodeFile("models//cessna.osg");
        root->addChild(cessnaNode);


       viewer.setSceneData( root);        
       osg::notify(osg::INFO) << "hello world" << std::endl;
        return viewer.run();

}

以上代码可运行,但在键盘上按下键时,代码没有任何响应,也就是PickHandler中的代码没有用,why?
另外,
osg::notify(osg::INFO) << "hello world" << std::endl;
这一句也没有输出.头大.

该用户从未签到

发表于 2008-4-2 00:04:04 | 显示全部楼层
当读取用户用户从GUI控件输入时,应尽量不适用cin输入,因为此回调属于用户线程~~~~~

osg::notify(osg::INFO) << "hello world" << std::endl;没有输出,原因很简单,你没有理解osg:;notify()中参数的意思~~~~~
00030     ALWAYS=0,
00031     FATAL=1,
00032     WARN=2,
00033     NOTICE=3,
00034     INFO=4,
00035     DEBUG_INFO=5,
00036     DEBUG_FP=6
这几个参数,理解一下吧,呵呵~~~~~~~~~~~~~

该用户从未签到

发表于 2008-4-2 00:13:22 | 显示全部楼层
通常而言,把参数设置为NOTICE~~~~~~~~~~

该用户从未签到

发表于 2008-4-6 00:33:36 | 显示全部楼层
你可以把输出改为:
std::cout&lt;&lt;&quot;Hello xxx&quot;&lt;&lt;std::endl;
这样就可以看到。
还有,你可以在回调中设置断点,发生事件的时候就会停下来,这样方便些。
你可以在函数入口处就标记一个断点,这样比较好。另外handler实现了一些虚函数,可以照着OSG其他Handler里面的函数写一个,osgVolume.cpp就有一个简单的键盘回调。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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