OpenVDB MacOS端 开发环境搭建流程分享

背景

OpenVDB是一个得过很多学术奖的流体模拟单元Voxel数据结构,因其目前免费开源,在电影界各大主流电影特效制作软件(如Maya,Houdini)中广泛流传使用。

我第一次接触这个数据结构是在学习Houdini的阶段的时候了解到VDB,通过实际操作感受,VDB的某些Filter的计算速度和存储体积都比Houdini内置数据格式Volumn优秀。

最近,因工程设计需要,想要摆脱Houdini框架依赖,开发自己想要的流体编辑器。就决定利用先前开发PixelsWorld的经验,自己在电脑上搭建自己的OpenVDB工作站。现在网上关于OpenVDB搭建的外文手册少之又少,更别提中文的了。希望这篇文章能多多少少帮助到致力于开发OpenVDB的相关人士。

这篇文章只针对OpenVDB 7.0.0(后续版本的搭建请参考官方手册

MAC端的搭建流程

首先我觉得想要开发这种东西的人应该都掌握了科学上网CMakeHomebrew大法,就不赘述了。

♪1:搭建依赖项目

brew install cmake                     # CMake
brew install ilmbase                   # IlmBase
brew install openexr                   # OpenEXR
brew install tbb                       # TBB
brew install zlib                      # zlib
brew install boost                     # Boost
brew install boost-python              # Boost-python
brew install python                    # Python
brew install numpy                     # NumPy
brew install cppunit                   # CppUnit
brew install glfw                      # GLFW
brew install doxygen                   # Doxygen

♯1:搭建Blosc

其实这里还需要blosc库。但是OpenVDB说:

Blosc 1.16 is only available through Homebrew and currently requires manual installation for 1.5.

也就是Homebrew提供的blosc是很前面的版本了。但我觉得,一开始的话,为了快速写一个OpenVDB的hello world,大家可以用Homebrew安装(因为我测试Homebrew下的Blosc能正常编译一个简单的hello VDB程序,反正之后还能卸载)。

用Homebrew安装:

brew install c-blosc

如果后面你觉得OpenVDB适合你,你确实需要OpenVDB搭建进你的工程,请使用下面指令安装Blosc

git clone https://github.com/Blosc/c-blosc.git
cd c-blosc
git checkout tags/v1.5.0 -b v1.5.0
mkdir build
cd build
cmake ..
make -j4
make install
cd ../..

上面的指令也不一定能一直管用,如果不行需要参考Blosc官方的README.md

♪2:安装OpenVDB库

git clone https://github.com/AcademySoftwareFoundation/openvdb.git
cd openvdb
mkdir build
cd build
cmake ..
make -j4
make install

这里报错的话,一般是指令cmake ..检测到某个依赖没安装上去,按照报错信息填补即可。若仍有报错,请参考这里

♪3:编译Hello world

做一个HelloVDB文件夹,放入main.cppMakefile

mkdir helloVDB
cd helloVDB
touch main.cpp Makefile

在main.cpp里面写入

#include <openvdb/openvdb.h>
#include <iostream>
int main()
{
    // Initialize the OpenVDB library.  This must be called at least
    // once per program and may safely be called multiple times.
    openvdb::initialize();
    // Create an empty floating-point grid with background value 0.
    openvdb::FloatGrid::Ptr grid = openvdb::FloatGrid::create();
    std::cout << "Testing random access:" << std::endl;
    // Get an accessor for coordinate-based access to voxels.
    openvdb::FloatGrid::Accessor accessor = grid->getAccessor();
    // Define a coordinate with large signed indices.
    openvdb::Coord xyz(1000, -200000000, 30000000);
    // Set the voxel value at (1000, -200000000, 30000000) to 1.
    accessor.setValue(xyz, 1.0);
    // Verify that the voxel value at (1000, -200000000, 30000000) is 1.
    std::cout << "Grid" << xyz << " = " << accessor.getValue(xyz) << std::endl;
    // Reset the coordinates to those of a different voxel.
    xyz.reset(1000, 200000000, -30000000);
    // Verify that the voxel value at (1000, 200000000, -30000000) is
    // the background value, 0.
    std::cout << "Grid" << xyz << " = " << accessor.getValue(xyz) << std::endl;
    // Set the voxel value at (1000, 200000000, -30000000) to 2.
    accessor.setValue(xyz, 2.0);
    // Set the voxels at the two extremes of the available coordinate space.
    // For 32-bit signed coordinates these are (-2147483648, -2147483648, -2147483648)
    // and (2147483647, 2147483647, 2147483647).
    accessor.setValue(openvdb::Coord::min(), 3.0f);
    accessor.setValue(openvdb::Coord::max(), 4.0f);
    std::cout << "Testing sequential access:" << std::endl;
    // Print all active ("on") voxels by means of an iterator.
    for (openvdb::FloatGrid::ValueOnCIter iter = grid->cbeginValueOn(); iter; ++iter) {
        std::cout << "Grid" << iter.getCoord() << " = " << *iter << std::endl;
    }
}

♭♪3:试编译

注意

下面的代码在你的电脑上100%不能运行,你需要把zzstarsound改成你自己的用户名,如果仍然报错,请确认对应include位置确实有文件夹。

g++ -c -o main.o main.cpp -Wall -std=c++11 -O2 -I/Users/zzstarsound/openvdb/include
g++ -o helloVDB main.o -Wl,-rpath,/Users/zzstarsound/openvdb/lib -L/Users/zzstarsound/openvdb/lib -L/usr/local/Cellar/tbb/2019_U9/lib -L/usr/local/Cellar/ilmbase/2.3.0/lib -lopenvdb -ltbb -lHalf

♪4:执行

./helloVDB

运行结果

Testing random access:
Grid[1000, -200000000, 30000000] = 1
Grid[1000, 200000000, -30000000] = 0
Testing sequential access:
Grid[-2147483648, -2147483648, -2147483648] = 3
Grid[1000, -200000000, 30000000] = 1
Grid[1000, 200000000, -30000000] = 2
Grid[2147483647, 2147483647, 2147483647] = 4

♪5:制作Makefile

上面的编译指令很长,我们需要用Makefile为我们节省敲编译代码的时间。我制作的Makefile如下:

你仍然需要把zzstarsound换成你自己的用户名

# Makefile, by ZzStarSound

PROGRAM=helloVDB
CFLAGS=-Wall -std=c++11 -O2
OPENVDBINC=-I/Users/zzstarsound/openvdb/include
OUTERLIBINC=-Wl,-rpath,/Users/zzstarsound/openvdb/lib -L/Users/zzstarsound/openvdb/lib -L/usr/local/Cellar/tbb/2019_U9/lib -L/usr/local/Cellar/ilmbase/2.3.0/lib
LINKOUTERDY=-lopenvdb -ltbb -lHalf
OBJS=main.o


.PHONY: all
all: $(PROGRAM)

$(PROGRAM):$(OBJS)
    g++ -o $@ $^ $(OUTERLIBINC) $(LINKOUTERDY)
    @echo $(PROGRAM) Successfully generated!

main.o:main.cpp
    g++ -c -o $@ $< $(CFLAGS) $(OPENVDBINC)

.PHONY: clean
clean:
    $(RM) $(PROGRAM) $(OBJS)

这样每次编译只需要输入make即可。运行结果:

输入代码make./helloVDB

ZzStarSunddeMBP:src zzstarsound$ make
g++ -c -o main.o main.cpp -Wall -std=c++11 -O2 -I/Users/zzstarsound/openvdb/include
g++ -o helloVDB main.o -Wl,-rpath,/Users/zzstarsound/openvdb/lib -L/Users/zzstarsound/openvdb/lib -L/usr/local/Cellar/tbb/2019_U9/lib -L/usr/local/Cellar/ilmbase/2.3.0/lib -lopenvdb -ltbb -lHalf
helloVDB Successfully generated!
ZzStarSunddeMBP:src zzstarsound$ ./helloVDB
Testing random access:
Grid[1000, -200000000, 30000000] = 1
Grid[1000, 200000000, -30000000] = 0
Testing sequential access:
Grid[-2147483648, -2147483648, -2147483648] = 3
Grid[1000, -200000000, 30000000] = 1
Grid[1000, 200000000, -30000000] = 2
Grid[2147483647, 2147483647, 2147483647] = 4
ZzStarSunddeMBP:src zzstarsound$ 

顺带一提make clean可以清空生成文件。

ZzStarSunddeMBP:src zzstarsound$ make clean
rm -f helloVDB main.o
ZzStarSunddeMBP:src zzstarsound$ 
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,222评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,455评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,720评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,568评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,696评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,879评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,028评论 3 409
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,773评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,220评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,550评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,697评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,360评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,002评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,782评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,010评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,433评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,587评论 2 350

推荐阅读更多精彩内容