您的位置:首页 > 编程语言

OSG学习:阴影代码示例

2017-07-12 14:17 260 查看
效果图:



代码示例:

#include <osgViewer/Viewer>

#include <osg/Node>
#include <osg/Geode>
#include <osg/Group>
#include <osg/Camera>
#include <osg/ShapeDrawable>
#include <osg/ComputeBoundsVisitor>
#include <osg/BoundingBox>
#include <osg/BoundingSphere>
#include <osg/AnimationPath>

#include <osgDB/ReadFile>
#include <osgDB/WriteFile>

#include <osgShadow/ShadowedScene>
#include <osgShadow/ShadowVolume>
#include <osgShadow/ShadowTexture>
#include <osgShadow/ShadowMap>
#include <osgShadow/SoftShadowMap>
#include <osgShadow/ParallelSplitShadowMap>

#include <osgUtil/Optimizer>

#include <iostream>

//标识阴影接收对象
const int ReceivesShadowTraversalMask = 0x1;
//标识阴影投影对象
const int CastsShadowTraversalMask = 0x2;

//创建场景数据
osg::ref_ptr<osg::Node> createModel()
{
osg::Vec3 center(0.0f, 0.0f, 0.0f);
float radius = 100.0f;
osg::Vec3 lightPosition(center + osg::Vec3(0.0f, 0.0f, radius));

osg::ref_ptr<osg::Node> shadower = osgDB::readNodeFile("D:\\OSGmodel\\WKZ005_JZ_24.OSGB");
shadower->setNodeMask(CastsShadowTraversalMask);

osg::ref_ptr<osg::Node> shadowed = osgDB::readNodeFile("D:\\OSGmodel\\floor.OSGB");
shadowed->setNodeMask(ReceivesShadowTraversalMask);

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

group->addChild(shadowed.get());
group->addChild(shadower.get());

return group.get();
}

//创建一个光照
osg::ref_ptr<osg::Node> createLight(osg::ref_ptr<osg::Node> model)
{
osg::ComputeBoundsVisitor cbbv;
model->accept(cbbv);
osg::BoundingBox bb = cbbv.getBoundingBox();

osg::Vec4 lightpos;

lightpos.set(bb.center().x(), bb.center().y(), bb.zMax() + bb.radius()*2.0f, 1.0f);

osg::ref_ptr<osg::LightSource> ls = new osg::LightSource();
ls->getLight()->setPosition(lightpos);

ls->getLight()->setAmbient(osg::Vec4(0.2, 0.2, 0.2, 1.0));
ls->getLight()->setDiffuse(osg::Vec4(0.8, 0.8, 0.8, 1.0));

return ls.get();
}

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

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

//创建一个阴影节点,并标识接收对象和投影对象
osg::ref_ptr<osgShadow::ShadowedScene> shadowedScene = new osgShadow::ShadowedScene();
shadowedScene->setReceivesShadowTraversalMask(ReceivesShadowTraversalMask);
shadowedScene->setCastsShadowTraversalMask(CastsShadowTraversalMask);

//创建阴影纹理
osg::ref_ptr<osgShadow::ShadowTexture> st = new osgShadow::ShadowTexture();
//关联阴影纹理
shadowedScene->setShadowTechnique(st);

osg::ref_ptr<osg::Node> node = new osg::Node();
node = createModel();

//添加场景数据并添加光源
shadowedScene->addChild(createLight(node.get()));
shadowedScene->addChild(node.get());

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

//优化场景数据
osgUtil::Optimizer optimizer;
optimizer.optimize(root.get());

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

viewer->realize();

viewer->run();

return 0;
}


注:模型的路径需要修改。

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