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
-----
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
-----
相关文章推荐
- osg入门系列4- 分页细节层次节点
- Linq系列教程三(入门之查询简介)
- GPU遮挡查询入门介绍
- MySQL---数据库从入门走向大神系列(四)-子查询、表与表之间的关系
- 框架学习系列 mybatis 第五篇 mybatis入门程序之需求开发2根据用户名模糊查询
- [27] Window PowerShell DSC 学习系列----DSC 5.x 查询节点注册和执行报告(Report)查询
- Linq系列教程三(入门之查询简介)
- Ceph实战入门系列(一)——三节点Ceph集群的安装与部署
- OSG MFC入门基础系列
- 转:[Silverlight入门系列]使用MVVM模式(9): 想在ViewModel中控制TreeView节点展开?
- mongodb3.6系列教程10--查询操作符之节点操作符
- .NET RIA Service入门系列文章六:排序和查询
- osg入门系列8-一个地球
- osg入门系列7- 一个小房子
- 【ztree系列】树节点的模糊查询
- osg入门系列14-狄落泥三角网
- [Silverlight入门系列]Prism中TreeView真正实现MVVM模式和Expanded发生时异步动态加载子节点(WCFRiaService)
- osg入门系列10-以索引方式的几何体绘制
- arcgis api for js入门开发系列四地图查询
- 查询操作 -- Django从入门到精通系列教程