标签:
更新回调(Update Callback)涉及到一个类:osg::NodeCallback。这个类重载了函数调用操作符。当回调动作发生时,将会执行这一操作符的内容。
如果节点绑定了更新回调函数,那么在每一帧系统遍历到此节点时,回调函数都会被调用。
下面给出一个例子:
#include <osg/io_utils> #include <osg/PositionAttitudeTransform> #include <osgDB/ReadFile> #include <osgViewer/Viewer> #include <iostream> class RotateCallback: public osg::NodeCallback { public: RotateCallback():_rotateZ(0.0){} virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) { osg::PositionAttitudeTransform *pat = dynamic_cast<osg::PositionAttitudeTransform*>(node); if (pat) { osg::Quat quat(osg::DegreesToRadians(_rotateZ), osg::Z_AXIS); pat->setAttitude(quat); _rotateZ += 0.5; } traverse(node, nv); } protected: double _rotateZ; }; class InfoCallback: public osg::NodeCallback { public: virtual void operator()(osg::Node* node, osg::NodeVisitor* nv) { osg::PositionAttitudeTransform *pat = dynamic_cast<osg::PositionAttitudeTransform*>(node); if (pat) { double angle = 0.0; osg::Vec3 axis; pat->getAttitude().getRotate(angle, axis); std::cout<<"Node is rotating around the("<<axis<<")axis," <<osg::RadiansToDegrees(angle)<<" degrees"<<std::endl; } traverse(node, nv); } }; int main(int argc, char **argv) { osg::ArgumentParser arguments(&argc, argv); osg::Node *model = osgDB::readNodeFiles(arguments); if(!model) model = osgDB::readNodeFile("cow.osg"); osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform; pat->addChild(model); pat->setUpdateCallback(new RotateCallback); pat->addUpdateCallback(new InfoCallback); osgViewer::Viewer viewer; viewer.setSceneData(pat.get()); return viewer.run(); }
标签:
原文地址:http://www.cnblogs.com/gattaca/p/4562885.html