osg.ConvexPlanarOccluder
类表示了一个凸多边形遮挡器。该遮挡器由osg::Vec3Array
类型的顶点和一个osg::Plane
类型的平面定义。该遮挡器可以用于优化场景渲染,只对相机所在位置后面的场景进行渲染,从而提高渲染效率。
下面是该类的构造函数:
osg::ConvexPlanarOccluder::ConvexPlanarOccluder();
该构造函数创建了一个空的凸多边形遮挡器。
该类还具有以下方法:
void osg::ConvexPlanarOccluder::set(const osg::Vec3Array* vertices);
该方法使用osg::Vec3Array
类型的顶点数组来设置凸多边形遮挡器。该方法会自动计算出该多边形所在的平面。
const osg::Plane& osg::ConvexPlanarOccluder::getPlane() const;
该方法返回该凸多边形所在的平面。
const osg::Vec3Array* osg::ConvexPlanarOccluder::getVertices() const;
该方法返回该凸多边形的顶点数组。
bool osg::ConvexPlanarOccluder::contains(const osg::Vec3d& point) const;
该方法返回true
当且仅当给定点在该多边形内部。
osgbCollision::ConvexPolyhedron* osg::ConvexPlanarOccluder::getConvexPolyhedron() const;
该方法返回该凸多边形的凸多面体表示,用于与其他凸多面体进行碰撞检测。
例如,下面的代码演示如何使用凸多边形遮挡器来实现遮挡剔除:
osg::ConvexPlanarOccluder occluder;
// 设置凸多边形遮挡器的顶点
osg::Vec3Array* vertices = new osg::Vec3Array;
vertices->push_back(osg::Vec3(-100,-100,-100));
vertices->push_back(osg::Vec3(100,-100,-100));
vertices->push_back(osg::Vec3(100,100,-100));
vertices->push_back(osg::Vec3(-100,100,-100));
occluder.set(vertices);
// 创建相机节点
osg::ref_ptr<osg::Camera> camera = new osg::Camera;
camera->setClearColor(osg::Vec4(1, 1, 1, 1));
camera->setViewport(0, 0, 1280, 720);
camera->setProjectionMatrixAsPerspective(60, 1280.0/720.0, 0.1, 1000);
camera->setReferenceFrame(osg::Transform::ABSOLUTE_RF);
camera->setViewMatrixAsLookAt(osg::Vec3(0, -10, 0), osg::Vec3(0, 0, 0), osg::Vec3(0, 0, 1));
// 设置遮挡剔除
camera->setCullMask(osg::CullSettings::CLIP_PLANE_CULL_MASK);
camera->addCullCallback(new osg::ConvexPlanarOccluderCallback(occluder));
// 加载模型
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cessna.osg");
// 添加模型节点和相机节点至场景图中
osg::ref_ptr<osg::Group> root = new osg::Group;
root->addChild(model);
root->addChild(camera);
// 创建渲染器并运行
osgViewer::Viewer viewer;
viewer.setSceneData(root);
viewer.run();
在以上代码中,我们首先创建了一个凸多边形遮挡器occluder
,并将其设置为一个正方形,四个顶点坐标为$(-100,-100,-100)$、$(100,-100,-100)$、$(100,100,-100)$和$(-100,100,-100)$。然后创建了一个相机节点camera
,并设置其使用遮挡剔除。最后加载了一个飞机模型model
,并将其添加到了根节点root
中。然后创建了一个渲染器并运行。当我们运行程序时,将只显示在正方形之前的场景,从而减少了场景的渲染开销。