osg.Callback
是一个 OpenSceneGraph 库中的回调类,可用于在场景图节点更新时添加自定义行为。该类主要是回调函数的容器,这些回调函数会在节点的状态发生变化时被调用。
OpenSceneGraph 在渲染每一帧的时候都会遍历场景图中所有节点,并在节点状态发生变化时调用注册的回调函数。你可以使用 osg::Camera
类中的 setUpdateCallback
或 setCullCallback
方法来注册回调函数。 setUpdateCallback
方法会在场景图遍历时被调用,而 setCullCallback
方法会在节点进行裁剪时调用。
osg.SimpleCallback
是一个用于做示例的简单回调类。它将节点的名称和状态打印到控制台。
class SimpleCallback : public osg::Callback
{
public:
virtual bool run(osg::Object* object, osg::Object* data)
{
osg::Node* node = dynamic_cast<osg::Node*>(object);
osg::notify(osg::NOTICE)<<"SimpleCallback: "<<node->getName()<<" has been updated."<<std::endl;
osg::State* state = dynamic_cast<osg::State*>(data);
if (state)
osg::notify(osg::NOTICE)<<"State: "<<state->getName()<<std::endl;
return traverse(object, data);
}
};
该回调函数重载了 osg::Callback
类中的 run
方法,该方法会在节点更新时被调用。在该方法中,我们可以指定节点更新时要执行的任务。在上面的示例中,我们打印了节点的名称和状态信息。
现在,我们来看看如何使用 osg.SimpleCallback
类。首先,我们创建一个场景图节点。我们将创建一个三角形,并将其添加到场景图中,然后将这个节点的 setUpdateCallback
方法设置为 SimpleCallback 回调函数。
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
osg::ref_ptr<osg::Vec3Array> vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(-0.5, -0.5, 0.0));
vertices->push_back(osg::Vec3( 0.5, -0.5, 0.0));
vertices->push_back(osg::Vec3( 0.0, 0.5, 0.0));
geom->setVertexArray(vertices.get());
osg::ref_ptr<osg::DrawElementsUInt> primitiveSet = new osg::DrawElementsUInt(osg::PrimitiveSet::TRIANGLES, 0);
primitiveSet->push_back(0);
primitiveSet->push_back(1);
primitiveSet->push_back(2);
geom->addPrimitiveSet(primitiveSet.get());
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(geom.get());
geode->setName("Triangle");
geode->setUpdateCallback(new SimpleCallback);
现在,我们使用 OpenSceneGraph 的渲染管道来渲染场景图:
osgViewer::Viewer viewer;
viewer.setSceneData(geode.get());
viewer.realize();
while (!viewer.done())
{
viewer.frame();
}
输出结果将显示以下内容:
SimpleCallback: Triangle has been updated.