查看: 2185|回复: 9

NodeTrackerManipulator实现跟随飞机操作器,出现晃动

[复制链接]

该用户从未签到

发表于 2013-5-22 14:37:31 | 显示全部楼层 |阅读模式
如题,我用NodeTrackerManipulator实现跟随飞机操作器,飞行数据是读取的GPS的文件,初步怀疑是NodeTrackerManipulator移动和飞机模型的移动不能同步的原因,求大神指点。

该用户从未签到

发表于 2013-5-22 14:43:54 | 显示全部楼层
不能同步?每一帧都会更新同步

该用户从未签到

 楼主| 发表于 2013-5-22 14:47:51 | 显示全部楼层
本帖最后由 xubaolong 于 2013-5-22 14:49 编辑
liuzhiyu123 发表于 2013-5-22 14:43
不能同步?每一帧都会更新同步


是因为相机和模型之间的距离变化,照成的这种晃动的效果的吗?

该用户从未签到

发表于 2013-5-22 16:20:41 | 显示全部楼层
第一个要怀疑的就是您传输数据的时机,是否总是在相机位置已定之后才更改这一帧的模型位置

该用户从未签到

 楼主| 发表于 2013-5-22 17:02:14 | 显示全部楼层
array 发表于 2013-5-22 16:20
第一个要怀疑的就是您传输数据的时机,是否总是在相机位置已定之后才更改这一帧的模型位置

示意代码:
AnimationPathCallback* apc =new AnimationPathCallback(ap,0.0,1.0);
gliderMT->setUpdateCallback(apc);

NodeTrackerManipulator* ntm = new NodeTrackerManipulator();
ntm->setTrackerMode(...);
ntm->setRotationMode(...);
ntm->setTrackNode(gliderMT);


viewer->setCameraManipulator(ntm);

需要确定相机位置改变后,在移动这一帧模型的位置?

该用户从未签到

发表于 2016-3-22 15:33:29 | 显示全部楼层
xubaolong 发表于 2013-5-22 17:02
示意代码:
AnimationPathCallback* apc =new AnimationPathCallback(ap,0.0,1.0);
gliderMT->setUpdat ...

LZ 你好  我看到 你做 飞机飞行 然后视点跟随飞机  请问一下 现在你的这个代码还在 能否发一份给我

该用户从未签到

发表于 2016-3-22 17:16:38 | 显示全部楼层
lovebird_27 发表于 2016-3-22 15:33
LZ 你好  我看到 你做 飞机飞行 然后视点跟随飞机  请问一下 现在你的这个代码还在 能否发一份给我

你可以百度一下。参考官方示例example_osgsimulation,或看这帖子http://blog.sina.com.cn/s/blog_5432e0220102wg8m.html

该用户从未签到

发表于 2016-3-22 20:56:39 | 显示全部楼层
C1473173533 发表于 2016-3-22 17:16
你可以百度一下。参考官方示例example_osgsimulation,或看这帖子http://blog.sina.com.cn/s/blog_5432e0 ...

你好,我也是看到了这个方法,但是我实践失败了,我看了OSG官方例子osganimate,我就是想实现视点跟随飞机运动,你说的那个例子osgsimulation可能是我自己输入的原因,我没有实现 视点在飞机上,你能否加我QQ我们交流一下?303368828 或者是 你能否用这个方法 让osganimate的例子 视点随飞机移动,关键代码 贴给我看一下啊,谢谢了

该用户从未签到

发表于 2016-3-23 09:15:35 | 显示全部楼层
lovebird_27 发表于 2016-3-22 20:56
你好,我也是看到了这个方法,但是我实践失败了,我看了OSG官方例子osganimate,我就是想实现视点跟随飞 ...

官方例子太长了,我也没用过。但博客里给出了最简单的代码,虽然不完整。
        osg::Group *root = new osg::Group();
        osg::AnimationPath *ap = new osg::AnimationPath();
        ap->setLoopMode(osg::AnimationPath:OOP);
        ap->insert(0.0, osg::AnimationPath::ControlPoint(osg::Vec3(0, 0, 0)));
        ap->insert(5.0, osg::AnimationPath::ControlPoint(osg::Vec3(20, 0, 0)));
        ap->insert(10.0, osg::AnimationPath::ControlPoint(osg::Vec3(0, 0, 0)));
        osg::AnimationPathCallback *apc = new osg::AnimationPathCallback();
        apc->setAnimationPath(ap);
        osg::MatrixTransform *mt = new osg::MatrixTransform();
        mt->addUpdateCallback(apc);
        osg::Node *glider = osgDB::readNodeFile("cessna.osg");
        mt->addChild(glider);
        root->addChild(mt);

        osgGA::NodeTrackerManipulator *tm = new osgGA::NodeTrackerManipulator();
        tm->setTrackerMode(osgGA::NodeTrackerManipulator::NODE_CENTER_AND_ROTATION);
        tm->setRotationMode(osgGA::NodeTrackerManipulator::TRACKBALL);
        tm->setTrackNode(glider);

        root->addChild(osgDB::readNodeFile("cow.osg")); //作为参考

        osgViewer::Viewer viewer;
        viewer.setCameraManipulator(tm);
        viewer.setSceneData(root);
        viewer.setUpViewInWindow(20, 20, 1000, 800);
        viewer.addEventHandler(new osgViewer::StatsHandler());
        return viewer.run();

该用户从未签到

发表于 2016-3-24 15:18:32 | 显示全部楼层
C1473173533 发表于 2016-3-23 09:15
官方例子太长了,我也没用过。但博客里给出了最简单的代码,虽然不完整。
        osg::Group *root = new osg: ...

这个例子的方法  我是实现了的··但是和我想的 有点出入  我想知道有没有那种自定义矩阵的方式 自己去控制那个视角
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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