• OSG学习:阴影代码示例


    效果图:
    这里写图片描述

    代码示例:

    #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;
    }

    注:模型的路径需要修改。
    附加:图中两个模型下载

  • 相关阅读:
    cf #363 c
    cf #363 b
    cf #363 a
    跑rbgirshick的fast-rcnn代码
    改文件夹名称
    cmake安装
    argparse模块
    which,whereis,locate,find
    FastRCNN 训练自己数据集 (1编译配置)
    视觉一般的面试问题
  • 原文地址:https://www.cnblogs.com/huahai/p/7270931.html
Copyright © 2020-2023  润新知