|
有两个更新回调,更新回调1为奶牛运动,更新回调2为小飞机运动,现在想实现的功能是,奶牛每个100ms移动一次,小飞机每隔50ms移动一次。但是使用Sleep()函数好像并没有达到我想要的功能,代码如下- //轨迹更新回调,奶牛
- class TransformCow:public osg::NodeCallback
- {
- public:
- TransformCow():_angle(0.0){}
- virtual void operator()(osg::Node *node, osg::NodeVisitor *nv)
- {
- osg::MatrixTransform *pat = dynamic_cast<osg::MatrixTransform*>(node);
- if(pat)
- {
- pat->setMatrix(osg::Matrix::translate(5*cos(_angle), 0.0, 5*sin(_angle)));
- _angle+=1.0/50;
- Sleep(100); //100ms
- }
- traverse(node, nv);
- }
- protected:
- float _angle;
- };
- //轨迹更新回调,小飞机
- class TrasformGlider:public osg::NodeCallback
- {
- public:
- TrasformGlider():_angle(0.0){}
- virtual void operator()(osg::Node *node, osg::NodeVisitor *nv)
- {
- osg::MatrixTransform *pat = dynamic_cast<osg::MatrixTransform*>(node);
- if(pat)
- {
- pat->setMatrix(osg::Matrix::translate(2.0*cos(_angle), 0.0, 2.0*sin(_angle)));
- _angle+=1.0/100;
- Sleep(50); //50ms
- }
- traverse(node, nv);
- }
- protected:
- float _angle;
- };
- int main(int argc, char **argv)
- {
- osg::ref_ptr<osg::Node> modelcow = osgDB::readNodeFile("cow.osg");
- osg::ref_ptr<osg::Node> modelglider = osgDB::readNodeFile("glider.osg");
- osg::ref_ptr<osg::MatrixTransform> Matrixcow = new osg::MatrixTransform;
- osg::ref_ptr<osg::MatrixTransform> Matrixglider = new osg::MatrixTransform;
- Matrixcow->addChild(modelcow);
- Matrixglider->addChild(modelglider);
- Matrixcow->setUpdateCallback(new TransformCow);
- Matrixglider->addUpdateCallback(new TrasformGlider);
- osg::ref_ptr<osg::Group> group = new osg::Group;
- group->addChild(Matrixcow);
- group->addChild(Matrixglider);
- osgViewer::Viewer viewer;
- viewer.setSceneData(group);
- return viewer.run();
- }
复制代码
向别人请教,是因为Sleep只是对数据处理线程起作用,而对osg渲染线程不会起作用。
各位大侠,请问如何修改代码才能实现我想要的功能呢? |
|