OSG学习二

今天试验了一下OSG的回调函数和几个旋转平移函数,用于实时更新节点状态;

首先回调函数要用到osg中的回调函数类osg::NodeCallBack。我们要重写回调类中的operator()虚函数来实现功能。

同时我们需要在osg::Node类中使用setUpdateCallback()函数来将回调类添加到场景中去。

下面我们实现一个模型旋转的动画。首先我们要重写回调类。

class RotateCallBack: public osg::NodeCallback
{
public:
RotateCallBack():m_rotate(0.0){}
virtual void operator()(osg::Node *node,osg::NodeVisitor *viewer)
{
osg::PositionAttitudeTransform *p_transform = dynamic_cast(node);//向下转型
osg::Quat p_Quat(osg::DegreesToRadians(m_rotate),osg::Z_AXIS);//Z_AXIS是指Z轴的单位向量
p_transform->setAttitude(p_Quat);
m_rotate+=1.0;
traverse(node,viewer);
}
private:
double m_rotate;
};

详解一下这里用到了一个C++的仿函数的概念,由于重载了()导致看上去operator()和函数基本一样。

int _tmain(int argc, _TCHAR* argv[])
{
osg::Node *model = osgDB::readNodeFile("cow.osg");

//osg::ref_ptr root = new osg::Group;
//root->addChild(CreatMatrixtransform(-5.0,osg::PI_4,model));
//root->addChild(CreatAutotransform(0.0,model));
//root->addChild(CreatPositiontransform(5.0,-osg::PI_4,model));
osg::ref_ptr root = new osg::PositionAttitudeTransform;
root->addChild(model);
root->addCullCallback(new RotateCallBack);
osgViewer::Viewer viewer;
viewer.setSceneData(root.get());

return viewer.run();
}

这时候能看到一个旋转的图像。

你可能感兴趣的:(osg和osgearth,osg,c++)