osg 半透明遮挡实现

今天需要实现一个osg半透明遮挡场景,在网上查了好多帖子,都不好用,不是遮挡不对,就是所有物体全透明了。最后终于在google找到一篇英文帖子,解决了问题。

具体实现半透明效果的代码如下:

osg::MatrixTransform* createDoor3()
{
    osg::ref_ptr<osg::ShapeDrawable> doorShape =
        new osg::ShapeDrawable( new osg::Box(osg::Vec3(0.0f, 0.0f, 0.0f), 2.0f, 2.0f, 2.0f) );
    doorShape->setColor( osg::Vec4(0.0f, 1.0f, 1.0f, 0.5f) );   // alpha value

    osg::StateSet* stateset = doorShape->getOrCreateStateSet();

    osg::ref_ptr<osg::BlendFunc> blendFunc = new osg::BlendFunc();  // blend func    
    blendFunc->setSource(osg::BlendFunc::SRC_ALPHA);       
    blendFunc->setDestination(osg::BlendFunc::ONE_MINUS_SRC_ALPHA);        
    stateset->setAttributeAndModes( blendFunc );
    stateset->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);  


    osg::ref_ptr<osg::Geode> geode = new osg::Geode;
    geode->addDrawable( doorShape.get() );

    osg::ref_ptr<osg::MatrixTransform> trans = new osg::MatrixTransform;
    trans->addChild( geode.get() );
    return trans.release();
}

然后把这个结点加载到场景中就可以了,效果如下图(场景中心红色立方体和边角的蓝色立方体就是上面的代码去掉半透明那部分代码):


  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
osgEarth提供了一些功能来处理地形遮挡。其中一个示例是osgearth_los,它可以通过创建模型动画路径来演示透视的用法。透视是指当两个点之间的视线不被遮挡时,将其绘制为绿色,而被遮挡的部分则设置为红色。在加载earth文件时,需要同时加载地形文件。\[2\] 此外,当模型数量较多时,可以使用osgEarth::Util::ClusterNode节点对象来处理。可以创建一个osg::NodeList,将需要绘制的节点添加到其中,然后将osg::NodeList添加为osgEarth::Util::ClusterNode的子节点。通过控制osgEarth::Util::ClusterNode的半径范围,可以控制节点的显示密集程度,从而处理地形遮挡的问题。\[3\] 需要注意的是,osgEarth还提供了其他处理地形遮挡的功能,具体可以根据实际需求选择合适的方法。 #### 引用[.reference_title] - *1* *3* [osgEarth示例分析——osgearth_cluster](https://blog.csdn.net/qq_34732729/article/details/128183626)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [osgEarth示例分析——osgearth_los](https://blog.csdn.net/qq_34732729/article/details/128256747)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值