osg帖子摘抄--阴影

1. osg对一个大场景中的树添加阴影的问题

具体是这样的!我已经获得了一个建好的场景模型,里面有树木还有房子,当然还有地形(草地)。之前别人建模的时候没有加阴影贴图的。现在我的任务是在原来的场景模型下给树木加上阴影
我目前的做法是首先通过节点访问把我需要加阴影的那些树的节点找到,比如说就一棵树!然后对这个节点进行setNodeMask(),同样用这种方法把地形的节点也找到,也setNodeMask(),然后把整个大场景模型加光源,阴影技法用的是ShadowMap,可是没有什么反应。不知道大家有没有什么建议,或者我这种方法本来就有问题。非常感谢!!!

setNodeMask这件事没什么问题,产生实时阴影这个想法有问题。因为大场景的实时阴影计算在目前来看依然很难(不是OSG的问题,而是技术发展的问题)。您不如直接在3dsmax烘焙阴影贴图最简单


2.阴影与OverlayNode的区别

OverlayNode演示了RTT(渲染到纹理)的一种应用,即,把某个子场景绘制到另一个对象的纹理上。阴影的实现也可以用到RTT技术,不过具体的实现方法还是有很多不同的

3. 

阴影的锯齿一般有两种:
persp alias是投影的远近关系产生的,可以用lispsm来改善
proj alias是因为光照方向与物体表面正好平行导致采样数不够而产生的,实践中基本无解
当然直接提升shadow texture的分辨率是通用的解决方案,只是不能无度而已;一些tiled的方案也可以考虑
最后,大一统的阴影算法是不存在的,如果您想在自己的场景里取得较好的效果,请从模型,美术,布置,坐标精度等多方面考虑

4. 参与阴影的节点一定要放在ShadowedScene节点下


5. 地形阴影问

 
 m_Model->setNodeMask(CastsShadowTraversalMask);
 m_Model->setNodeMask(ReceivesShadowTraversalMask);
 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);
 shadowedScene->addChild(m_Model);

代码如上,对地形增加光照阴影,希望地形既是投影者也是被投影者,怎么没有效果呢?

搞出来了,原来我的法线都设定的同一个向上的值,现在用smooth使用了后才成功,可惜速度慢了点









### osgEarth 缓存功能的数据种子初始化 osgEarth 是一个用于地球可视化和地理空间数据处理的强大库。它支持多种数据源以及高效的缓存机制来优化性能。以下是关于如何配置和使用 osgEarth 的缓存功能进行数据种子初始化的相关说明。 #### 配置缓存路径 在 osgEarth 中,可以通过 `earth.xml` 文件中的 `<cache>` 节点定义缓存的位置和其他属性。例如: ```xml <cache type="filesystem"> <path>/path/to/cache</path> </cache> ``` 此配置指定了文件系统的缓存存储位置[^4]。如果未指定,则默认会使用操作系统的临时目录作为缓存路径。 #### 数据种子初始化命令 为了预加载特定区域的地图瓦片或其他资源到缓存中,可以使用 osgEarth 提供的 `seed_cache` 工具。该工具允许通过命令行参数设置范围、缩放级别以及其他选项来进行批量缓存填充。 基本语法如下: ```bash seed_cache --config earth.xml --bounds minx,miny,maxx,maxy --levels start_level:end_level ``` - **--config**: 指定包含地图配置的 XML 文件。 - **--bounds**: 定义感兴趣区域的边界框(以经纬度表示)。 - **--levels**: 设置需要缓存的缩放级别范围。 例如,假设希望为某个城市创建离线地图并预先缓存第 1 到第 15 层级的数据,可运行以下命令: ```bash seed_cache --config city_map.xml --bounds 120.7,31.0,121.8,32.0 --levels 1:15 ``` 这将触发 osgEarth 对指定区域内所有对应层级的地图瓦片请求,并将其保存至本地磁盘上的缓存目录中[^5]。 #### 自动化脚本示例 对于更复杂的场景或者频繁更新需求的情况,编写自动化脚本来管理多个任务可能是更好的选择。下面给出 Python 实现的一个简单例子: ```python import subprocess def run_seed_command(config_file, bounds, levels): command = [ 'seed_cache', '--config', config_file, '--bounds', ','.join(map(str, bounds)), '--levels', f'{levels[0]}:{levels[1]}' ] result = subprocess.run(command, capture_output=True, text=True) if result.returncode != 0: raise Exception(f"Error seeding cache: {result.stderr}") print(result.stdout) if __name__ == "__main__": try: run_seed_command('city_map.xml', [120.7, 31.0, 121.8, 32.0], [1, 15]) except Exception as e: print(e) ``` 以上代码片段展示了如何利用标准库模块 `subprocess` 来执行外部程序,并捕获其输出以便进一步分析或记录日志信息。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值