osgUtil.UpdateVisitor
是一个继承自osg::NodeVisitor
的类,用于在场景图中更新所有节点的状态和变换矩阵。
osgUtil::UpdateVisitor::UpdateVisitor();
创建一个新的osgUtil::UpdateVisitor
对象。
virtual void apply(osg::Node& node);
virtual void apply(osg::Transform& transform);
virtual void apply(osg::Geode& geode);
这些方法是osg::NodeVisitor
类中的虚函数,在osgUtil::UpdateVisitor
中被重写。这些方法分别处理节点、变换和几何体节点,更新它们的状态和变换矩阵。
void resetVisitor();
重置访问器以便在场景图中再次使用。这个函数会将当前的节点指针重置为根节点,并将状态还原为默认状态。
osg::NodePath& getNodePath();
获取当前访问器的节点路径。可以使用这个路径来查询节点的状态、矩阵等。
const osg::NodePath& getNodePath() const;
与getNodePath
类似,但返回一个只读的节点路径。
void pushOntoNodePath(osg::Node* node);
将指定节点添加到当前节点路径中。
void popFromNodePath();
从当前节点路径中弹出最后一个节点。
osg::RefMatrix* getModelMatrix();
获取当前的世界变换矩阵。这个矩阵将节点的本地变换矩阵和父节点的世界变换矩阵组合起来。
首先创建一个osgUtil::UpdateVisitor
对象,并将其应用于场景图根节点。例如:
osg::ref_ptr<osg::Node> root = ...;
osgUtil::UpdateVisitor updateVisitor;
root->accept(updateVisitor);
这将更新整个场景图中所有节点的状态和变换矩阵。你可以在节点的update()
函数中进行一些自定义的更新操作,例如模拟物理或动画效果。
class MyNode : public osg::Node
{
public:
virtual void update(osg::NodeVisitor* nv)
{
osg::Timer_t tick = osg::Timer::instance()->tick();
_angle += osg::Timer::instance()->delta_s(_lastTick, tick) * _speed;
osg::Matrixd rotate;
rotate.makeRotate(_angle, osg::Vec3(0, 0, 1));
osg::Matrixd translate;
translate.makeTranslate(_pos);
osg::Matrixd transform = rotate * translate;
setMatrix(transform);
_lastTick = tick;
}
private:
double _angle = 0.0;
osg::Vec3d _pos = osg::Vec3d(0, 0, 0);
double _speed = 1.0;
osg::Timer_t _lastTick = osg::Timer::instance()->tick();
};
你可以将这个MyNode
添加到场景图中,并在更新访问器osgUtil::UpdateVisitor
中调用它的update()
函数。
osg::ref_ptr<MyNode> myNode = new MyNode();
root->addChild(myNode);
...
root->accept(updateVisitor);
这样,MyNode
就会在场景图中按指定的速度旋转和平移。