[TOC]
我们提供了 4 个 vdb
文件和 1 个 obj
文件,分别是两个 single-resolution 的 vdb
,两个 multi-resolution 的 vdb
,和一个单位球的 mesh。
这 4 个 vdb
来自于 fluid simulation,是速度场,因此是一个向量场。而各位需要对一个数量场做可视化,因此可以计算速度场的模值,随后调用 OpenVDB
的某些函数创建一个数量场。
一个 vdb
文件可能包含一个或多个 uniform grid。我们提供的 4 个文件中,single-resolution 的 vdb
包含 1 个 uniform grid,而 multi-resolution 的 vdb
文件包含 3 个 uniform grid。
我们在 vdb
文件的 metadata
中提供了 uniform grid 的世界坐标信息:
origin
: 类型为openvdb::Vec3S
或openvdb::Vec3d
中的一种 (猜猜是哪种呢?),记录了 uniform grid “左下角” 的坐标,dx
: 类型为float
或double
(再猜?),记录了 uniform grid 一个格子的宽度。
各位可以调用 OpenVDB
的某些函数来读取某个 uniform grid 的 metadata。
值得注意的是,grid cell 的 值总是存储在 cell 的 “角上”,而不是 cell 的中心。
举个例子:
- Cell
(0, 0, 0)
的世界坐标为p0 = origin + (0, 0, 0) * dx
,值存储在p0
处,而不是p0 + (0.5, 0.5, 0.5) * dx
, - Cell
(1, 2, 3)
的世界坐标为p1 = origin + (1, 2, 3) * dx
,值存储在p1
处,而不是p1 + (0.5, 0.5, 0.5) * dx
。
还需要注意,某些 cell 可能是被 “挖空” 的,比如你可以想象绝大多数位置只会落在 3 个 uniform grid 中的一个,各位需要调用 OpenVDB
的某些函数来判断某个 cell 是否是被 “挖空” 的。
我们提供的 vdb
和文章中的 AMR
非常像:
- Coarser 层
dx
总是为 finer 层dx
的两倍, - Coarser 层和 finer 层的格子是对齐的 (各位可以检查一下相邻两层 grid 的
origin
,就能理解了)。
但是也有一些小区别:
- 我们提供的
vdb
相邻两层可能会有 overlap,这时候请总是取 finer 那层的数据。
能够快速 (至少得加个 OpenMP) 而优美地可视化出这 4 个 vdb
文件。
能处理 volume 中嵌入 surface 的情况,即带上 sphere.obj
。球的世界坐标设为 (5, 2, 3)
,缩放设为 (4.0 / 3.0)
。
可以用 NanoVDB (OpenVDB 的 GPU 版) 搭配 CUDA 来实现,有亿点麻烦,我们不做要求。如果你真的想写 GPU 版,请单独联系我们,我们可以提供一些基本的帮助。
每周一、周三的上课时间各位可以向我们求助,但自己写的 bug 还是得自己 de。祝好!