osgUtil.CullVisitor 是 OpenSceneGraph(OSG)中的一个重要类,用于裁剪访问器。CullVisitor 可以被用于遍历场景图(Scene Graph),并决定哪些对象应该在相机的视锥内进行渲染。
在 OSG 中使用 CullVisitor 前,需要创建一个实例以及相关的参数。通常,我们可以使用如下的方式进行创建:
osg::Camera* camera = …;
osg::ref_ptr<osgUtil::CullVisitor> cullVisitor = new osgUtil::CullVisitor();
cullVisitor->setCamera(camera);
在其它情况下,我们可能需要为 CullVisitor 指定一些额外的选项来进行遍历(例如加速结构、渲染状态、遮挡剔除等等)。这些选项可以通过 CullVisitor 的构造函数进行设置,例如:
osg::Camera* camera = …;
osg::ref_ptr<osgUtil::CullVisitor> cullVisitor =
new osgUtil::CullVisitor(
osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR |
osgUtil::CullVisitor::ENABLE_SAVAGE_BEHAVIOR,
camera);
构造函数中第一个参数是一个整数类型的标志,指定了一些额外的选项和信息;第二个参数是一个相机指针,指定了裁剪遍历使用的相机。通过这个方式,我们可以方便地控制裁剪遍历的行为和结果。
最后,我们需要把场景图的根节点传递给裁剪遍历器,并且调用其遍历方法。遍历过程中,CullVisitor 对场景图中的节点进行访问,计算出哪些节点需要渲染,哪些节点不需要渲染。
osg::Node* rootNode = …;
rootNode->accept(*cullVisitor);
CullVisitor 在遍历场景图的过程中,会依次访问每个节点(包括 Group、Geode、Transform 等等)并计算其与相机的距离、包围盒等信息。对于节点而言,CullVisitor 可以做出以下几个决策:
是否应该进一步遍历子节点
根据节点的计算结果,CullVisitor 可以决定是否需要遍历当前节点的子节点。如果节点已经在相机视锥之外,那么它的所有子节点会被跳过。
是否需要将节点添加到渲染队列中
对于可见的节点,CullVisitor 会根据一些额外的条件(例如节点的渲染状态、遮挡剔除等等)决定是否需要将其加入渲染排队队列中。如果节点已经被裁剪掉,则不需要将其添加到渲染队列中。
在裁剪遍历过程中,CullVisitor 进行了一系列的剪裁计算,例如:
CullVisitor 中定义了一些用于配置遍历器的 flag,例如:
CullVisitor::DO_NOT_COMPUTE_NEAR_FAR
不计算距离和接近平面、远端平面CullVisitor::ENABLE_SAVAGE_BEHAVIOR
开启保守算法,用于处理“绝对不需要旋转的节点”CullVisitor::CHECK_VISIBLE_BITS
检查节点的可见性标志位CullVisitor::COMPUTE_CULL_MASKS
计算节点的遮挡掩码例如,在这里我们可以使用 CullVisitor::DO_NOT_COMPUTE_NEAR_FAR
来关闭遍历器的距离计算,从而提高遍历的速度。
osg::ref_ptr<osgUtil::CullVisitor> cullVisitor =
new osgUtil::CullVisitor(osgUtil::CullVisitor::DO_NOT_COMPUTE_NEAR_FAR);