关于Houdini中体积SDF,fog,volume,vdb的一些理解和区别

本文深入探讨了三维体积数据的多种表示方式,包括体积雾、SDF(Signed Distance Field)、VDB(OpenVDB)等,解释了它们的特性和用途,以及在图像学和游戏开发中的应用,如raymarching材质、UE4的dfao效果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

首先是显示模式

这里有体积雾之类有三种显示模式

smoke,iso和poly显示(这个可以在属性里面加号点出来看具体显示状态)

smoke就是雾的显示状态,比如iso offset里面的fog volume,直接就是一个可视化的向量场

iso就是很多始终面向摄像机的小方块,比如iso offset里面的SDF volume

poly就是正常的模型显示,比如iso offset里面的iso surface和tetra mesh

 

volume(就是直接建立的节点),volume是向量场,默认以smoke方式显示,但是这个节点默认没有值,所以看不到,可以随便给个初始值

 

SDF 就是 距离场(Signed Distance Field),这个是图像学里常用的表示三维空间的方式,类似应用有ray marching材质,ue4里面的dfao之类

以iso显示,实际也是体素形式存储的,从中可以得到距离,方向等数据

 

vdb是open vdb,是一种更新的通用体积数据类型,可以导出vdb格式作为通用素材,这个里面包含了多种密度等体积数据

是比fog,SDF等更大的一个合集数据

 

convert vdb可以转换之间的关系

convert volume可以转换到poly或者fog显示方式

可以用volumevisualization可视化雾的显示颜色等

可以看出因为里面有几种显示状态,节点产生的体素数据又不同,所以产生了不同的转换关系

参考网站

https://forums.odforce.net/topic/24157-vdb-sdf-wtf/

https://forums.odforce.net/topic/23278-what-are-signed-distance-field-sdf-and-isooffset/

http://www.tokeru.com/cgwiki/index.php?title=Smoke_and_Pyro

http://www.sidefx.com/docs/houdini/nodes/sop/isooffset.html

http://www.tokeru.com/cgwiki/?title=Houdini#Volumes

### HoudiniSDFVolume区别Houdini中,SDF (Signed Distance Field) Volume 是用于不同目的的体积数据结构。 #### Fog Volume特性 Fog volume是一种特殊的体积类型,在这种情况下,每个体素都存储了密度值。这些值通常用来表示雾、烟或其他形式的气体的存在浓度。对于流体模拟来说非常有用,因为可以精确控制物质如何扩散以及与其他物体相互作用的方式[^1]。 ```python # 创建一个简单的Fog Volume示例 import hou geo = hou.node('/obj').createNode('geo', 'new_geo') volume_node = geo.createOutputNode('volume') # 设置参数以创建Fog Volume volume_node.parm('type').set('fog') # 将其设置为Fog Volume ``` #### SDF Volume特性 相比之下,SDF volumes则记录的是距离信息而不是密度。具体而言,它们保存着从当前点到最近表面之间的有符号距离——正值意味着该位置位于对象外部;负值表明处于内部;而零正好对应表面上的位置。这使得SDF非常适合处理碰撞检测等问题,因为它可以直接通过读取体素值得知某一点相对于模型边界的相对位置[^2]。 ```python # 转换几何体至SDF并调整属性 sdf_volume = geo.createOutputNode('vdbfrompolygons') sdf_volume.parm('conversionmethod').set('signeddistancefield') # 设定转换方式为SDF ``` ### 使用场景对比 - **Fog Volumes**: 主要应用于需要表达介质分布特性的场合,比如火焰效果、云朵形态或是其他任何涉及连续变化状态的现象建模上。 - **SDF Volumes**: 更多时候被用作物理仿真中的辅助工具,尤其是在涉及到刚体动力学计算时能够提供高效的边界判定机制。此外还可以作为变形操作的基础,允许艺术家们轻松改变形状而不必担心拓扑约束。 ### 修改SDF轮廓的例子 下面给出了一段基于VEX脚本修改SDF轮廓的具体实现: ```cpp // 在Volume Wrangle节点内编写如下代码片段 float val = sin(@P.y * M_PI * chi("num") + @Time * 10) * chf("dist"); @surface += val; ``` 这段程序会根据时间变量`@Time`周期性地改变Y轴方向上的SDF值,从而形成波动的效果[^3]。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值