My OpenVDB HandBook:1. Overview

孙膑
• 阅读 6216

OpenVDB 是Vlometric Dynamic B+ tree like 的缩写,作为梦工厂的开源体渲染解决的方案,发展到今天它已经不仅仅是一种体素存储格式了,还包含了各种无所不包的工具,包括体素转mesh,mesh转体素,各种加速工具,Viewer和一个简单的volume renderer等. 不过VDB的文档至今仍然十分不完善,写这个cookbook是为了记录自己的学习过程. 第一篇就先讨论VDB的各种概念和它本身的代码特点.

1. Tree & Grid

OpenVDB的理论基础和数据结构特点都在 Ken Museth 的这篇paper里

http://www.museth.org/Ken/Publications_files/Museth_TOG13.pdf

强烈推荐阅读,而我对OpenVDB存储结构的总结就是:

- Height balanced N-tree with Hash map

也就是说VDB是类似八叉树一样的树形结构,但是VDB的branching factor每层不同,保证了随机访问不需要查找很多层,而对于root节点VDB使用了Hashmap 加速. 和数据库中常用的B+ 树一样,VDB也有Internal Node Leaf Node 等各层节点,而真正的体素值,是存储于Leaf Node上的.

OpenVDB的voxel值的存储分成inactive和active两种状态,这一特点在表示某些特殊类型的体积数据时会很有用,下面会说到.

所以VDB里最基础的结构也就是openvdb::tree. VDB是一个TML heavily used 的库,而在定义各种tree时VDB也是用模板参数确定树的结构的. 例如最常用的FloatTree:

typedef tree::Tree4<float,   5, 4, 3>::Type     FloatTree;

这是一个四层的树(root node; Internal node; Internal node; Leaf node),每层的branching factor为 5,4,3.(这也是VDB规定的一般的树形结构).

而Grid则是VDB对Tree类型的封装,加上了BBox等非常重要的信息. 可以由Grid得到Tree(Grid.tree()).

2.Tile, Voxel, and Background Values

一般而言voxel是存储在LeafNode里用(i,j,k)这样的index索引的值,不过一个非LeafNode也可以有value, 也就是tile value. 比如一个InterNode(888)有tile value 1,也就是相当于一个888的均匀的值为1的立方体. 一个Grid的Background value是指当你的(i,j,k)索引索引不到Node或者Voxel时返回给你的值

3.Level set & fog

OpenVDB 经常用来表示和存储的就是Level sets 和 fog volumes. 利用上面说到的voxel的两种状态,Level set水平集是由一个外部区域(voxel为inactive,并且到levelset平面有正的距离(常量)),一个内部区域(voxel也为inactive,到levelset平面有负的距离(常量)),和一个非常狭窄的Active voxels的平面构成. level set 适合表示水面等形状的体积数据

Fog volume也由类似的三部分区域构成,只不过对于fog volume. 内部体素的值都是1,外部体素的值都为0.

4.Iterators

访问树形结构的iterators. OpenVDB提供了三种:

  • Tree:ValueIter : 访问每个value一次,也就是上面所说的tile 或者是 voxel,同时也提供了得到Bounding box的方法
  • Tree::LeafIter : 只访问树的最底层也就是Leaf Node.
  • Tree::NodeIter : 访问每个Node一次,可以方便得到Node的所有信息.

5.Value Accessor

OpenVDB一个很大的优势就是加速了体素的随机访问,Value Accessor就是很方便的查询(i,j,k)坐标的体素, 同时还提供了方法能把world space坐标转化为Index space coordinates, 可以非常方便的访问体素, 用Gird.getAccessor()可以很方便的拿到ValueAccessor类.

ValueAccessor是拥有cache based acceleration的,因此当多个线程访问同一个grid的时候,需要给每个线程都分配一个Accessor.

点赞
收藏
评论区
推荐文章
blmius blmius
4年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
美凌格栋栋酱 美凌格栋栋酱
10个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
Wesley13 Wesley13
4年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Stella981 Stella981
4年前
Scapy 从入门到放弃
0x00前言最近闲的没事,抽空了解下地表最强的嗅探和收发包的工具:scapy。scapy是一个python模块,使用简单,并且能灵活地构造各种数据包,是进行网络安全审计的好帮手。0x01安装因为2020年python官方便不再支持python2,所以使用python3安装。!(https://oscimg.oschina.net/os
Wesley13 Wesley13
4年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
4年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Stella981 Stella981
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
4年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Easter79 Easter79
4年前
SpringBoot整合Redis乱码原因及解决方案
问题描述:springboot使用springdataredis存储数据时乱码rediskey/value出现\\xAC\\xED\\x00\\x05t\\x00\\x05问题分析:查看RedisTemplate类!(https://oscimg.oschina.net/oscnet/0a85565fa
Wesley13 Wesley13
4年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
孙膑
孙膑
Lv1
城中桃李愁风雨,春在溪头荠菜花。
文章
4
粉丝
0
获赞
0