osg.ConstValueVisitor是一个实现访问节点中常量值的OSC API。
osg.ConstValueVisitor继承自osg::NodeVisitor,用于访问节点中的常量值。由用户派生出来,实现自己的访问器,方便访问场景图中的节点。
用户需要为osg.ConstValueVisitor类提供实现,以便在场景图中访问节点中的常量值。
当派生类需要访问节点值时,需要覆盖protected方法apply()。这个方法是ConstValueVisitor中唯一需要实现的那个方法。apply()方法的参数是常量节点的指针,允许对该节点执行访问。
class MyConstValueVisitor : public osg::ConstValueVisitor
{
public:
    MyConstValueVisitor() : osg::ConstValueVisitor() {}
 
    //重载apply方法
    void apply(const osg::FloatArray& array)
    {
        //检查该节点中包含的浮点值的数量
        std::cout << "Float array length: " << array.size() << std::endl;
    }
};
然后我们可以创建并使用MyConstValueVisitor的实例来访问场景图中的节点。需要使用ConstValueVisitor的accept()方法处理节点,该方法继承自基类NodeVisitor。
//创建场景图节点
osg::ref_ptr<osg::Geode> geode = new osg::Geode();
osg::ref_ptr<osg::FloatArray> floatArray = new osg::FloatArray();
floatArray->push_back(1.0f);
floatArray->push_back(2.0f);
floatArray->push_back(3.0f);
geode->addDrawable(new osg::Geometry());
geode->getDrawable(0)->setVertexAttribArray(osg::Drawable::AttributeBinding::BIND_OFF);
geode->getDrawable(0)->setVertexArray(floatArray.get());
//创建并使用访问器
osg::ref_ptr<MyConstValueVisitor> visitor = new MyConstValueVisitor();
geode->accept(*visitor);
完成上述操作之后,我们应该会在控制台上看到输出:
Float array length: 3
这表明我们成功地从节点中读取了三个浮点数。