不废话直接上!
1、osg::NodeVistor
继承模式:
osg::Node
继承方式:
2、要想监视某个物,必须要有一个方法
osg所有节点的监视方式,由继承于父亲节点即(osg::Node)与监视器(osg::NodeVistor)合并使用的方法来完成,那么入口呢?使用方式呢?
osg::Node提供了虚函数入口方式
- virtual void accept(NodeVisitor& nv);
- virtual void ascend(NodeVisitor& nv);
- virtual void traverse(NodeVisitor& /nv/) {}
在NodeVistort提供了很多apply方法,使用自带接口都是具有目的性的,其中osg视察器已经定义了很多,可以从其中选择一个适合当前要做的操作,比如计算节点包络框,也可以利用c++特性,继承NodeVisitor来实现自己节点想要的操作;
virtual void accept(NodeVisitor& nv);
定义:
void Node::accept(NodeVisitor& nv)
{
//判断Node是否要遍历操作;其中最为关键,也是最为方便的决定此
//模型是否要被操作取决于 node.getNodeMask(),相当于Node的遍历的开关
if (nv.validNodeMask(this))
{
// 加入父节点
nv.pushOntoNodePath(this);
// 调用视察器方法
nv.apply(this);
// 使用完毕踢出
nv.popFromNodePath();
}
}
** virtual void ascend(NodeVisitor& nv);
向上遍历
irtual void traverse(NodeVisitor& /nv/) {}
向下遍历