您的位置:首页 > 其它

osg入门系列13-几何体简化

2014-09-20 14:03 549 查看
#include <osgViewer/Viewer>

#include <osgViewer/ViewerEventHandlers>

#include <osg/Node>

#include <osg/Geode>

#include <osg/Group>

#include <osg/PositionAttitudeTransform>

#include <osgDB/ReadFile>

#include <osgDB/WriteFile>

#include <osgGA/StateSetManipulator>

#include <osgUtil/Optimizer>

#include <osgUtil/Simplifier>

#include <iostream>

using namespace std;

int main()

{

    osg::ref_ptr<osgViewer::Viewer> viewer = new osgViewer::Viewer();

    viewer->addEventHandler(new osgGA::StateSetManipulator(

                                viewer->getCamera()->getOrCreateStateSet()));

    osg::ref_ptr<osg::Group> root = new osg::Group();

    osg::StateSet* stateset = new osg::StateSet;

    osg::PolygonMode* polymode = new osg::PolygonMode;

    polymode->setMode(osg::PolygonMode::FRONT_AND_BACK, osg::PolygonMode::LINE);

    stateset->setAttributeAndModes(polymode, osg::StateAttribute::OVERRIDE|osg::StateAttribute::ON);

    osg::ref_ptr<osg::Node> node1 = osgDB::readNodeFile("/home/zhaogang/work/thirdparty/OpenSceneGraph-3.2.1/data/cow.osg");

    osg::ref_ptr<osg::Node> node2 = (osg::Node*)(node1->clone(osg::CopyOp::DEEP_COPY_ALL));

    osg::ref_ptr<osg::PositionAttitudeTransform> pat = new osg::PositionAttitudeTransform();

    pat->setPosition(osg::Vec3(10.0f, 0.0f, 0.0f));

    pat->addChild(node2.get());

    float sampleRatio = 0.2f;

    float maxError = 4.0f;

    osgUtil::Simplifier simplifier(sampleRatio, maxError);

    pat->accept(simplifier);

    osg::ref_ptr<osg::Group> wireframe_subgraph = new osg::Group;

    wireframe_subgraph->setStateSet(stateset);

    wireframe_subgraph->addChild(node1.get());

    wireframe_subgraph->addChild(pat.get());

    root->addChild(wireframe_subgraph.get());

    osgUtil::Optimizer optimizer;

    optimizer.optimize(root.get());

    viewer->setSceneData(root.get());

    viewer->realize();

    viewer->run();

    return 0;

}

---

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: