osg节点访问器

定义好三维的节点场景之后,有时会需要访问其中的节点,包括从头至尾的访问,或者从先向上的访问,这样就需要一个访问器。

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

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wb175208

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值