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; }
注:模型的路径需要修改。
附加:图中两个模型下载。
相关文章推荐
- OSG学习:阴影代码示例
- ASP.NET2.0学习5--N层代码示例
- ASP.NET学习5--N层代码示例
- json 入门学习笔记 示例代码
- Swing学习_文件选择框(JFileChooser)框示例代码
- Oracle学习之示例代码
- ASP.NET2.0学习5--N层代码示例
- 微软企业库4.1学习笔记(二十三)加解密模块3 示例代码
- OpenMP学习之--任务划分与调度(代码示例)
- OpenMP学习之--数据环境(代码示例)
- AJAX 学习笔记[二] 我编写的AJAX 测试代码示例
- ASP.NET2.0学习5--N层代码示例
- ASP.NET2.0学习--N层代码示例
- ASP.NET学习5--N层代码示例(CSDN)
- C#图片计数器代码[WEB学习示例]
- ASP.NET学习5--N层代码示例
- ASP.NET2.0学习--N层代码示例
- ASP.NET学习--N层代码示例
- 微软企业库4.1学习笔记(二十三)加解密模块3 示例代码
- 黑马程序员-javascript学习之代码示例