查看: 1609|回复: 5

关于osg键盘交互的基础问题

[复制链接]

该用户从未签到

发表于 2010-4-15 13:41:33 | 显示全部楼层 |阅读模式
我在学校图书馆找到的新书《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键场景会在两个不同模型中切换。

到底问题在哪里?还请各位高手救救我。

该用户从未签到

发表于 2010-4-15 14:26:19 | 显示全部楼层
我想OSG 2.2版本是不能正确运行这个例子程序的内容的,原因是当时还不存在这个虚函数;
  1. handle(const osgGA::GUIEventAdapter &ea,
  2.   osgGA::GUIEventAdapter &aa,osg::Object*, osg::NodeVisitor*)
复制代码
请使用2.8的版本

该用户从未签到

 楼主| 发表于 2010-4-15 20:07:28 | 显示全部楼层
谢谢您。其实我原来用的是2.8的,但是无论编译什么代码都出现“应用程序初始化错误”,所以从学长那里拷了2.2的include和lib文件夹替换。之后程序能运行了但又遇上今天这样的尴尬。
不知道有没有适合2.2版本的教材。以前的1.几的太老,新书又有的用不上,我是初学者,很迷茫。能帮忙推荐一下吗?

该用户从未签到

发表于 2010-4-15 21:18:53 | 显示全部楼层
LZ你代码都写错了当然没反应了= =

看这一句:
virtual bool handle(const osgGA::GUIEventAdapter &ea,
  osgGA::GUIEventAdapter &aa,osg::Object*, osg::NodeVisitor*)

看粗体

应该是GUIActionAdapter

该用户从未签到

发表于 2010-4-15 21:21:06 | 显示全部楼层
还有你用的2.8是自己编译的吗?

自己编译的话应该没问题的

该用户从未签到

发表于 2010-4-16 10:24:58 | 显示全部楼层
有没有适合2.2版本的教材
原则上我不会再编写这类教材了,因为它已经过时了

此外NeroMustDie的意见也请您看一下:如果这不是您的笔误的话,那么您的虚函数重写写错了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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