查看: 1996|回复: 11

新手请问如何通过键盘响应切换到自己设计的漫游器?

[复制链接]

该用户从未签到

发表于 2011-4-24 20:25:17 | 显示全部楼层 |阅读模式
如何从osg一开始的漫游方式通过响应键盘的按键切换到自己设计的漫游器?如下代码错在哪里?
main中
viewer->addEventHandler(new TravelManipulator(viewer));
TravelManipulator为漫游器

在TravelManipulator中的handle响应切换
if(ea.getKey()=='m')
        {
      osg::ref_ptr<TravelManipulator>tm=new TravelManipulator();
      viewer->setCameraManipulator(tm);
                         return true;
     }

该用户从未签到

发表于 2011-4-25 09:11:16 | 显示全部楼层
切换漫游器请参考KeySwitchMatrixManipulator的做法

该用户从未签到

 楼主| 发表于 2011-4-25 13:04:59 | 显示全部楼层
回复 2# array


    我在主函数上加入
osg::ref_ptr<TravelManipulator>tm=new TravelManipulator;//自定义操作器
osgGA::KeySwitchMatrixManipulator *k = new osgGA::KeySwitchMatrixManipulator();
k->addMatrixManipulator('m',"change",tm);
viewer->setCameraManipulator(k);
可一运行直接就是自定义操作器,似乎这几句都没起作用
附上main函数,自定义漫游器就是很普通的设置正逆矩阵,加上一个handle函数。
int main()
{
osg::ref_ptr<osgViewer::Viewer>viewer=new osgViewer::Viewer;
osg::ref_ptr<osg::Group>group=new osg::Group;
  osg::ref_ptr<osg::Node>node=osgDB::readNodeFile("station.ive");
osg::ref_ptr<TravelManipulator>tm=new TravelManipulator;
osgGA::KeySwitchMatrixManipulator *k = new osgGA::KeySwitchMatrixManipulator();
k->addMatrixManipulator('m',"change",tm);
viewer->setCameraManipulator(k);
viewer->setSceneData(group);
  viewer->run();
}

该用户从未签到

 楼主| 发表于 2011-4-25 17:38:28 | 显示全部楼层
回复 2# array

锐哥上边的问题解决了,还有一个小问题请教一下,如何让一个node节点的模型加载.path文件,让其在场景中按路径运动?是用AnimationPathManipulator么?node节点应该调用什么方法取AnimationPathManipulator对象?

该用户从未签到

发表于 2011-4-25 18:05:18 | 显示全部楼层
可以参考osg自带的相关animationPath的例子

该用户从未签到

 楼主| 发表于 2011-4-25 20:25:39 | 显示全部楼层
回复 5# tianxiao888
您看一下如下程序为啥运行时崩溃掉了?

osg::ref_ptr<osgViewer::Viewer>viewer=new osgViewer::Viewer;
osg::ref_ptr<osg::Group>group=new osg::Group;
osg::ref_ptr<osg::Node>node=osgDB::readNodeFile("station.ive");
osg::ref_ptr<osg::Node>node2=osgDB::readNodeFile("bmw.osg");
osg::ref_ptr<osg::AnimationPath>path=new osg::AnimationPath;
std::string filename("a.path");
std::ifstream s(filename.c_str());
path->read(s);
s.close();
node2->setUpdateCallback (new osg::AnimationPathCallback(path));
group->addChild(node2);
group->addChild(node);
viewer->setSceneData(group);
viewer->run();

该用户从未签到

 楼主| 发表于 2011-4-25 20:46:07 | 显示全部楼层
回复 5# tianxiao888


   问题 已解决笑哥~~

该用户从未签到

发表于 2011-4-26 14:29:51 | 显示全部楼层
std::string filename("a.path");
std::ifstream s(filename.c_str());
path->read(s);
s.close();
这点怪怪的,是标准的path路径读取方法么?

希望能分享解决办法

该用户从未签到

发表于 2011-4-27 08:23:49 | 显示全部楼层
这个方法没有什么问题

该用户从未签到

 楼主| 发表于 2011-4-30 00:06:09 | 显示全部楼层
回复 9# array

我在使用vs2010编写std::ifstream s(filename.c_str());这段程序的时候,报出std::ifstream 是无法解释的外部符号,但相同代码在vs05上就完美运行,什么原因呢?

该用户从未签到

发表于 2011-5-3 08:49:29 | 显示全部楼层
可能您没有附带正确的系统依赖库,或者某些配置不正确

该用户从未签到

发表于 2012-11-22 10:16:47 | 显示全部楼层
大神 你实现的是切换操作器么? 就是默认和自己的 可以随时切换
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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