体积:烟、火与液体
体积是一盒体素,而不是一个表面:一缕烟柱、一团火焰、一场爆炸、一片水。Pixor 可以读取来自 Blender、EmberGen 和 Houdini 的 .vdb 文件,并自带几种,供你在没有模拟工具时使用。
体积没有几何体。它通过为每个像素在处理器上让一条射线穿过它来绘制,得到的结果与模型进入同一张图像——因此火焰可以位于手的前方,角色可以站在烟雾之中,色带、线条和清理对待它也与对待其他任何东西完全相同。
添加
在场景步骤中,大纲的 + 菜单,在一个体积下:
| 喷气 | 一团圆形的烟雾 |
| 火焰 | 下方炽热而窄,上方冷却而宽 |
| 云 | 宽大,底部平坦,顶部凹凸 |
| 薄雾 | 细、低且均匀 |
| 从 .vdb 文件… | 来自 Blender、EmberGen 或 Houdini 的模拟 |
体积是场景节点图中的一个体积节点,它在大纲中的行就是同一个节点:它后面接一个「行」就是一排体积,每个由其副本放置,没有接入任何地方的体积不在场景中。它的设置也在节点上(pxr project scene game.pixor --set flame.voxels=48,按体积的名称)。
在命令行中:--volume flame:0.5,0.8,0.5:0,0.55,0,数字依次是尺寸和位置,单位为米。.vdb 文件的路径也可以放在同一位置:--volume smoke.vdb:1.2。
附着于骨骼时,体积在每个片段中都跟随骨骼移动——手中火把的火焰——并且像火一样保持直立;此时它的位置相对于骨骼测量。命令行中,在末尾加上 @BONE:--volume flame:0.25:0,0.05,0@hand.r。
由效果的发射器携带时,体积就是该效果的一部分:它绘制在效果自己的行上,从效果的第一帧开始,跟随发射器所在的位置——在其骨骼上,或在片段关键帧移动它的地方——而不出现在其他行上。爆炸的烟、法术的火焰。此时它的位置相对于发射器测量。命令行中,用 @effect:N 指定项目的第 N 个效果:--effect explosion --volume puff:1.5@effect:1。
绘制方式
这些设置位于体积检查器中的绘制方式下。
- 厚度是一个像素需要多少体积才会被绘制。越高形状越紧实、越硬朗;越低则越缥缈。
- 柔和边缘指磨损边缘的宽度。边缘以固定在体积本身上的有序图案抖动消失,从不混合,因此每个像素都保持在调色板上,体积转动时图案也不会爬动。
- 自阴影指光线必须穿过体积时,体积在该处变暗的程度。
- 颜色是体积自己的颜色,其色阶由它生成。热色是燃烧部分的颜色;把它设为与颜色相同,就表示没有东西燃烧,这正是烟所需要的。发光覆盖表示某部分要多热,才会不论光照如何都取热色。
- 体素指体积沿最长边切分得有多细。一个精灵像素需要一到两个体素:更多只会闪烁,因为每一帧都有不同的体素赢得该像素。256³ 的模拟在加载时会被缩减到这个精度,这就是为什么 32 px 的烟柱能保持稳定。
- 采样数是每个体素沿射线查看的点数。在精灵尺寸下两个就够了;更多会更平滑,也更慢。
体积没有闪光:云本来就没有,而且它们着色所依据的密度起伏不平,如果允许闪光就会满是亮点。
序列:让它动起来
一个 .vdb 是一个静态体积。模拟每帧写出一个文件——fire_0001.vdb、fire_0002.vdb,依此类推——让 Pixor 指向其中第一个,就会依次播放其余的。
在体积的序列部分中:
| 帧 | 要播放的文件数,从你打开的那个开始往后数 |
| 每 | 每 N 个文件取一个:模拟通常写出的帧数比精灵需要的多 |
| 闭合循环,跨越 | 从末尾交叉淡入这么多帧回到开头,让精灵循环播放而不跳变。这些文件会变成淡入过渡,本身不播放:五个文件、淡入一帧,就是四帧 |
在命令行中,序列跟在尺寸和位置之后:--volume fire_0001.vdb:1.5::24,2,4——24 个文件,每隔一个取一个,最后四个淡入回第一个。
序列会随精灵表已有的运动一起播放:把一团火放在行走循环旁边,火的帧就是行走的帧。当没有其他东西在运动时,序列本身就是运动,并获得一个自己的动作,名为 volume。
每一帧都使用同一个变换,取自整个序列占据的包围盒,所以不断变大的烟柱不会让画面每帧缩回去。这也意味着尺寸是整个序列的尺寸,而不是第一帧的尺寸。
序列永远不会整个载入内存:每个文件先读取一次以确定包围盒,然后在精灵表或预览到达对应帧时再读取一次,并保留最近的三帧。长时间的模拟花费的是读取时间,而不是内存。
Pixor 能读取的内容
.vdb 文件:以常规树结构存放浮点或向量网格,数值可以直接存储、zip 压缩,或用 Blosc-LZ4 打包(是否按字节拆分为多个流,与 Blosc 1.14 及之后版本的写法一致),可以存储全部体素或仅活跃体素——也就是 Blender、EmberGen、Houdini 以及 OpenVDB 自带工具所写出的格式。像素化时使用名为 density、smoke、fog 或 d 的网格,然后用 temperature、flame、heat 或 fire 作为高温部分,再用 velocity 作为防闪烁步骤所用的运动。液体的表面(水平集)被读作边缘清晰、内部完全实心的厚度。
Pixor 无法读取的任何内容都会点名说明,而不是输出错误的结果:其他压缩方式、其他类型的树结构、带切变的变换。pxr inspect fire.vdb 会打印文件的网格、它们的大小以及体素大小。
尚未提供的功能
- 液体作为体积读取和绘制,没有泡沫和倒影。同时具有两者的水面是世界的水节点(世界)。