osgUtil.EdgeCollector是OpenSceneGraph库中的一个实用工具,用于收集模型中的边,以便之后进行边缘细分和线框渲染。
class EdgeCollector : public osg::NodeVisitor
EdgeCollector(float threshold=10, bool verbose=false);
参数:
threshold
:边界的阈值,用于控制边缘细分的程度。默认值为10。verbose
:是否打印详细信息。默认值为false。apply(osg::Node& node)
重载自osg::NodeVisitor
,用于访问场景中的节点并提取边。
osg::Vec3Array* getVertexArray()
返回提取的顶点数组。
osg::DrawElementsUInt* getEdgeDrawElements()
返回提取的边元素数组。
#include <osg/EdgeCollector>
#include <osgDB/ReadFile>
#include <osgViewer/Viewer>
int main()
{
osg::ref_ptr<osg::Node> model = osgDB::readNodeFile("cow.osg");
osgUtil::EdgeCollector ec;
model->accept(ec);
//获取提取的边和顶点数组
osg::ref_ptr<osg::DrawElementsUInt> edges = ec.getEdgeDrawElements();
osg::ref_ptr<osg::Vec3Array> vertices = ec.getVertexArray();
//使用提取的边绘制模型的线框
osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;
geom->setVertexArray(vertices.get());
geom->addPrimitiveSet(edges.get());
osg::ref_ptr<osg::Geode> geode = new osg::Geode;
geode->addDrawable(geom.get());
osg::ref_ptr<osg::Group> root = new osg::Group;
root->addChild(model.get());
root->addChild(geode.get());
osgViewer::Viewer viewer;
viewer.setSceneData(root.get());
return viewer.run();
}