定义好三维的节点场景之后,有时会需要访问其中的节点,包括从头至尾的访问,或者从先向上的访问,这样就需要一个访问器。
osg::NodeVisitor就是这样的一个访问器。它遍历场景节点有几种方式:
TRAVERSE_NONE - 仅访问当前节点,不继续遍历
TRAVERSE_PARENTS - 向父节点推进
TRAVERSE_ALL_CHILDREN - 向子节点推进
函数:
void traverse(Node& node)//向下一个节点推进
访问节点时,采用的深度优先遍历,尽可能的深度搜索,知道末端节点,在逐步返回到上一级尚未访问的节点。
#pragma once
#include <osg/NodeVisitor>
class InfoVisitor : public osg::NodeVisitor {
public:
InfoVisitor();
~InfoVisitor();
virtual void apply(osg::Node &node)override;
};
#include "InfoVisitor.h"
#include <QDebug>
#include <QString>
#include <string>
#include <stdio.h>
using namespace std;
InfoVisitor::InfoVisitor():osg::NodeVisitor(TRAVERSE_ALL_CHILDREN){
}
InfoVisitor::~InfoVisitor() {
}
void InfoVisitor::apply(osg::Node &node) {
printf("%s\n", node.getName().c_str());
//向下一个节点推进访问器
traverse(node);
}
void createNode() {
osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer;
viewer->addEventHandler(new osgViewer::WindowSizeHandler());
osg::ref_ptr<osg::Group> root = new osg::Group;
root->setName("root");
osg::ref_ptr<osg::MatrixTransform> mt = new osg::MatrixTransform;
mt->setName("MatrixTransform");
osg::Matrix matrix;
matrix.preMultScale(osg::Vec3(0.2, 0.2, 0.2));
matrix.preMultTranslate(osg::Vec3(-7.0, 0.0, 0.0));
mt->setMatrix(matrix);
osg::ref_ptr<osg::Node> cow = osgDB::readNodeFile("cow.osgt");
cow->setName("cow");
mt->addChild(cow);
root->addChild(mt);
root->addChild(osgDB::readNodeFile("xyz.osgt"));
InfoVisitor infoVisitor;
root->accept(infoVisitor);
viewer->setSceneData(root.get());
viewer->realize();
viewer->run();
}
运行结果:
遍历结果:
aaa