#include <Windows.h>
#include <osgViewer/Viewer>
#include <osg/Math>
#include <osgDB/ReadFile>
#include <osg/NodeCallback>
#include <osg/MatrixTransform>
//從osg::NodeCallBack繼承一個新類,實現simpleCallBack的回調
class simpleCallBack:public osg::NodeCallback
{
public:
simpleCallBack():_angle(0)
{
}
virtual void operator()(osg::Node* node, osg::NodeVisitor* nv)
{
//建立矩陣轉換節點
osg::ref_ptr<osg::MatrixTransform> mt=dynamic_cast<osg::MatrixTransform*>(node);
//建立矩陣
osg::Matrix mx;
//繞著Z軸旋轉
mx.makeRotate(_angle,osg::Vec3(0.0,0.0,1.0));
//設定矩陣
mt->setMatrix(mx);
_angle+=0.01;
//繼續遍曆
traverse(node,nv);
}
public:
//旋轉角度
double _angle;
};
int main()
{
osg::ref_ptr<osgViewer::Viewer> viewer=new osgViewer::Viewer;
osg::ref_ptr<osg::Group> root=new osg::Group;
//讀模數型
osg::ref_ptr<osg::Node> node=osgDB::readNodeFile("cow.osg");
//建立矩陣變換節點
osg::ref_ptr<osg::MatrixTransform> mt=new osg::MatrixTransform;
mt->addChild(node.get());
//設定更新回呼函數
mt->setUpdateCallback(new simpleCallBack());
root->addChild(mt.get());
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
return 0;
}
所有繼承自NodeCallback類的子類,可重載operator()方法,對於OSG結點指定更新毀掉為類執行個體,結點會自動調用類的operator方法進行回調更新。