查看: 1405|回复: 4

两个更新回调

[复制链接]

该用户从未签到

发表于 2011-3-27 12:17:11 | 显示全部楼层 |阅读模式
有两个更新回调,更新回调1为奶牛运动,更新回调2为小飞机运动,现在想实现的功能是,奶牛每个100ms移动一次,小飞机每隔50ms移动一次。但是使用Sleep()函数好像并没有达到我想要的功能,代码如下
  1. //轨迹更新回调,奶牛
  2. class TransformCow:public osg::NodeCallback
  3. {
  4. public:
  5. TransformCow():_angle(0.0){}

  6. virtual void operator()(osg::Node *node, osg::NodeVisitor *nv)
  7. {
  8. osg::MatrixTransform *pat = dynamic_cast<osg::MatrixTransform*>(node);
  9. if(pat)
  10. {
  11. pat->setMatrix(osg::Matrix::translate(5*cos(_angle), 0.0, 5*sin(_angle)));
  12. _angle+=1.0/50;
  13. Sleep(100); //100ms
  14. }
  15. traverse(node, nv);
  16. }
  17. protected:
  18. float _angle;
  19. };

  20. //轨迹更新回调,小飞机
  21. class TrasformGlider:public osg::NodeCallback
  22. {
  23. public:
  24. TrasformGlider():_angle(0.0){}
  25. virtual void operator()(osg::Node *node, osg::NodeVisitor *nv)
  26. {
  27. osg::MatrixTransform *pat = dynamic_cast<osg::MatrixTransform*>(node);
  28. if(pat)
  29. {
  30. pat->setMatrix(osg::Matrix::translate(2.0*cos(_angle), 0.0, 2.0*sin(_angle)));
  31. _angle+=1.0/100;
  32. Sleep(50); //50ms
  33. }
  34. traverse(node, nv);
  35. }
  36. protected:
  37. float _angle;

  38. };
  39. int main(int argc, char **argv)
  40. {
  41. osg::ref_ptr<osg::Node> modelcow = osgDB::readNodeFile("cow.osg");
  42. osg::ref_ptr<osg::Node> modelglider = osgDB::readNodeFile("glider.osg");

  43. osg::ref_ptr<osg::MatrixTransform> Matrixcow = new osg::MatrixTransform;
  44. osg::ref_ptr<osg::MatrixTransform> Matrixglider = new osg::MatrixTransform;

  45. Matrixcow->addChild(modelcow);
  46. Matrixglider->addChild(modelglider);

  47. Matrixcow->setUpdateCallback(new TransformCow);
  48. Matrixglider->addUpdateCallback(new TrasformGlider);

  49. osg::ref_ptr<osg::Group> group = new osg::Group;
  50. group->addChild(Matrixcow);
  51. group->addChild(Matrixglider);

  52. osgViewer::Viewer viewer;
  53. viewer.setSceneData(group);

  54. return viewer.run();
  55. }
复制代码


向别人请教,是因为Sleep只是对数据处理线程起作用,而对osg渲染线程不会起作用。
各位大侠,请问如何修改代码才能实现我想要的功能呢?

该用户从未签到

发表于 2011-3-27 14:46:23 | 显示全部楼层
如果是想控制运动速度,可以在回调的循环中获取一帧的时间(两个getTickCount即可),然后自己设置一个速度,乘上时间后再进行相应的变换。

该用户从未签到

 楼主| 发表于 2011-3-27 16:47:12 | 显示全部楼层
回复 2# linkedqueue

翻了一下书,没有找到你所说的获取一帧时间的函数getTickCount ,??

该用户从未签到

发表于 2011-3-28 08:55:09 | 显示全部楼层
nv->getFrameStamp()就可以得到当前的时刻和帧数了

该用户从未签到

发表于 2011-3-28 09:47:53 | 显示全部楼层
回复 3# wangq
getTickCount获取当前时刻,程序中设置两个时刻,一个记录上一帧时刻,另一个记录当前帧时刻,相减就是一帧耗费的时间。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

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

联系我们

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