|
我在学校图书馆找到的新书《osg三维渲染引擎设计与实践》
第8章中的键盘交互程序,代码如下
# include <osg/Switch>
# include <osgDB/ReadFile>
# include <osgGA/GUIEventHandler>
# include <osgViewer/Viewer>
class KeyboardHandler:public osgGA::GUIEventHandler
{
public :
virtual bool handle(const osgGA::GUIEventAdapter &ea,
osgGA::GUIEventAdapter &aa,osg::Object*, osg::NodeVisitor*)
{
osgViewer::Viewer* viewer=
dynamic_cast<osgViewer::Viewer*>(&aa);
if(!viewer)return false;
switch(ea.getEventType())
{
case osgGA::GUIEventAdapter::KEYDOWN:
if(ea.getKey()==osgGA::GUIEventAdapter::KEY_Space)
{
int width=ea.getWindowWidth();
int height=ea.getWindowHeight();
viewer->requestWarpPointer(width*0.5,height*0.5);
}
else
{
osg::Switch* root=
dynamic_cast<osg::Switch*>(viewer->getSceneData());
if(!root)return false;
if(ea.getKey()=='1')
{
root->setValue(0,true);
root->setValue(1,false);
}
else if(ea.getKey()=='2')
{
root->setValue(0,false);
root->setValue(1,true);
}
return true;
}
break;
default:break;
}
return false;
}
};
int main(int argc,char **argv)
{
osg::ref_ptr<osg::Switch>root=new osg::Switch;
root->addChild(osgDB::readNodeFile("cessna.osg"),true);
root->addChild(osgDB::readNodeFile("cessnafire.osg"),false);
osgViewer::Viewer viewer;
viewer.setSceneData(root.get());
viewer.addEventHandler(new KeyboardHandler);
return viewer.run();
}
我用的是vc2005版本,osg是2.2版本。其他配置都正确的,而且程序能够跑起来;
但是无论如何我按下相应的键(已经确定输入法为英文)模型就是没有反应;
而书上说这段代码要实现的功能是按下空格键鼠标指针会回到中心点,而按下1,2键场景会在两个不同模型中切换。
到底问题在哪里?还请各位高手救救我。 |
|