OSG程序设计之更新回调
阅读原文时间:2023年07月10日阅读:2

  更新回调(Update Callback)涉及到一个类:osg::NodeCallback。这个类重载了函数调用操作符。当回调动作发生时,将会执行这一操作符的内容。

  如果节点绑定了更新回调函数,那么在每一帧系统遍历到此节点时,回调函数都会被调用。

  下面给出一个例子:

#include
#include
#include
#include
#include

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 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();
}

手机扫一扫

移动阅读更方便

阿里云服务器
腾讯云服务器
七牛云服务器

你可能感兴趣的文章