您的位置:首页 > 其它

osg入门系列6- 遮挡查询节点

2014-09-18 14:09 399 查看
#include <iostream>

using namespace std;

#include <osgViewer/Viewer>

#include <osg/Node>

#include <osg/Geode>

#include <osg/Geometry>

#include <osg/Group>

#include <osg/OccluderNode>

#include <osg/StateSet>

#include <osg/ConvexPlanarOccluder>

#include <osg/BoundingBox>

#include <osg/BoundingSphere>

#include <osgDB/ReadFile>

#include <osgDB/WriteFile>

#include <osgUtil/Optimizer>

osg::ref_ptr<osg::Node> createOccluder(const osg::Vec3& v1,

                                       const osg::Vec3& v2,

                                       const osg::Vec3& v3,

                                       const osg::Vec3& v4)

{

    osg::ref_ptr<osg::OccluderNode> occluderNode = new osg::OccluderNode();

    osg::ref_ptr<osg::ConvexPlanarOccluder> cpo = new osg::ConvexPlanarOccluder;

    occluderNode->setOccluder(cpo.get());

    occluderNode->setName("occluder");

    osg::ConvexPlanarPolygon& occluder = cpo->getOccluder();

    occluder.add(v1);

    occluder.add(v2);

    occluder.add(v3);

    occluder.add(v4);

    osg::ref_ptr<osg::Geometry> geom = new osg::Geometry;

    osg::ref_ptr<osg::Vec3Array> coords = new osg::Vec3Array(occluder.getVertexList().begin(),

                                                             occluder.getVertexList().end());

    geom->setVertexArray(coords);

    osg::ref_ptr<osg::Vec4Array> colors = new osg::Vec4Array(1);

    (*colors)[0].set(1.0f, 1.0f, 1.0f, 0.5f);

    geom->setColorArray(colors.get());

    geom->setColorBinding(osg::Geometry::BIND_OVERALL);

    geom->addPrimitiveSet(new osg::DrawArrays(osg::PrimitiveSet::QUADS, 0, 4));

    osg::ref_ptr<osg::Geode> geode = new osg::Geode;

    geode->addDrawable(geom.get());

    osg::ref_ptr<osg::StateSet> stateset = new osg::StateSet();

    stateset->setMode(GL_LIGHTING, osg::StateAttribute::OFF);

    stateset->setMode(GL_BLEND, osg::StateAttribute::ON);

    stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);

    geom->setStateSet(stateset.get());

    occluderNode->addChild(geode.get());

    return occluderNode.get();

}

osg::ref_ptr<osg::Group> createOccludersAroundModel(osg::ref_ptr<osg::Node> model)

{

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

    scene->setName("OccluderScene");

    scene->addChild(model.get());

    model->setName("cow.osg");

    const osg::BoundingSphere bs = model->getBound();

    osg::BoundingBox bb;

    bb.expandBy(bs);

    scene->addChild(createOccluder(bb.corner(0),

                                   bb.corner(1),

                                   bb.corner(5),

                                   bb.corner(4)));

    scene->addChild(createOccluder(bb.corner(1),

                                   bb.corner(3),

                                   bb.corner(7),

                                   bb.corner(5)));

    scene->addChild(createOccluder(bb.corner(2),

                                   bb.corner(0),

                                   bb.corner(4),

                                   bb.corner(6)));

    scene->addChild(createOccluder(bb.corner(3),

                                   bb.corner(2),

                                   bb.corner(6),

                                   bb.corner(7)));

    return scene.get();

}

int main()

{

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

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

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

    root->addChild(createOccludersAroundModel(node.get()));

    osgUtil::Optimizer optimizer;

    optimizer.optimize(root.get());

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

    viewer->realize();

    viewer->run();

    return 0;

}
----

LIBS += -L/usr/local/lib/

LIBS += -lOpenThreads

LIBS += -losg

LIBS += -losgDB

LIBS += -losgFX

LIBS += -losgGA

LIBS += -losgManipulator

LIBS += -losgParticle

LIBS += -losgShadow

LIBS += -losgSim

LIBS += -losgTerrain

LIBS += -losgText

LIBS += -losgUtil

LIBS += -losgViewer

-----

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