OpenVDB MacOS端 開發(fā)環(huán)境搭建流程分享

背景

OpenVDB是一個(gè)得過很多學(xué)術(shù)獎(jiǎng)的流體模擬單元Voxel數(shù)據(jù)結(jié)構(gòu)某抓,因其目前免費(fèi)開源,在電影界各大主流電影特效制作軟件(如Maya,Houdini)中廣泛流傳使用乌叶。

我第一次接觸這個(gè)數(shù)據(jù)結(jié)構(gòu)是在學(xué)習(xí)Houdini的階段的時(shí)候了解到VDB,通過實(shí)際操作感受柒爸,VDB的某些Filter的計(jì)算速度和存儲(chǔ)體積都比Houdini內(nèi)置數(shù)據(jù)格式Volumn優(yōu)秀准浴。

最近,因工程設(shè)計(jì)需要捎稚,想要擺脫Houdini框架依賴乐横,開發(fā)自己想要的流體編輯器。就決定利用先前開發(fā)PixelsWorld的經(jīng)驗(yàn)今野,自己在電腦上搭建自己的OpenVDB工作站∑瞎現(xiàn)在網(wǎng)上關(guān)于OpenVDB搭建的外文手冊(cè)少之又少,更別提中文的了条霜。希望這篇文章能多多少少幫助到致力于開發(fā)OpenVDB的相關(guān)人士催什。

這篇文章只針對(duì)OpenVDB 7.0.0(后續(xù)版本的搭建請(qǐng)參考官方手冊(cè)

MAC端的搭建流程

首先我覺得想要開發(fā)這種東西的人應(yīng)該都掌握了科學(xué)上網(wǎng)CMakeHomebrew大法宰睡,就不贅述了蒲凶。

?1:搭建依賴項(xiàng)目

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

其實(shí)這里還需要blosc庫。但是OpenVDB說:

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

也就是Homebrew提供的blosc是很前面的版本了拆内。但我覺得豹爹,一開始的話,為了快速寫一個(gè)OpenVDB的hello world矛纹,大家可以用Homebrew安裝(因?yàn)槲覝y試Homebrew下的Blosc能正常編譯一個(gè)簡單的hello VDB程序臂聋,反正之后還能卸載)。

用Homebrew安裝:

brew install c-blosc

如果后面你覺得OpenVDB適合你,你確實(shí)需要OpenVDB搭建進(jìn)你的工程孩等,請(qǐng)使用下面指令安裝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

這里報(bào)錯(cuò)的話,一般是指令cmake ..檢測到某個(gè)依賴沒安裝上去肄方,按照?qǐng)?bào)錯(cuò)信息填補(bǔ)即可冰垄。若仍有報(bào)錯(cuò),請(qǐng)參考這里

?3:編譯Hello world

做一個(gè)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%不能運(yùn)行虹茶,你需要把zzstarsound改成你自己的用戶名,如果仍然報(bào)錯(cuò)隅要,請(qǐng)確認(rèn)對(duì)應(yīng)include位置確實(shí)有文件夾蝴罪。

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:執(zhí)行

./helloVDB

運(yùn)行結(jié)果

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為我們節(jié)省敲編譯代碼的時(shí)間步清。我制作的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即可要门。運(yùn)行結(jié)果:

輸入代碼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$ 
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末廓啊,一起剝皮案震驚了整個(gè)濱河市欢搜,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌谴轮,老刑警劉巖炒瘟,帶你破解...
    沈念sama閱讀 219,039評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異第步,居然都是意外死亡唧领,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,426評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門雌续,熙熙樓的掌柜王于貴愁眉苦臉地迎上來斩个,“玉大人,你說我怎么就攤上這事驯杜∈苌叮” “怎么了?”我有些...
    開封第一講書人閱讀 165,417評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵鸽心,是天一觀的道長滚局。 經(jīng)常有香客問我,道長顽频,這世上最難降的妖魔是什么藤肢? 我笑而不...
    開封第一講書人閱讀 58,868評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮糯景,結(jié)果婚禮上嘁圈,老公的妹妹穿的比我還像新娘省骂。我一直安慰自己,他們只是感情好最住,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,892評(píng)論 6 392
  • 文/花漫 我一把揭開白布钞澳。 她就那樣靜靜地躺著,像睡著了一般涨缚。 火紅的嫁衣襯著肌膚如雪轧粟。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,692評(píng)論 1 305
  • 那天脓魏,我揣著相機(jī)與錄音兰吟,去河邊找鬼。 笑死茂翔,一個(gè)胖子當(dāng)著我的面吹牛混蔼,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播檩电,決...
    沈念sama閱讀 40,416評(píng)論 3 419
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼府树!你這毒婦竟也來了俐末?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,326評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤奄侠,失蹤者是張志新(化名)和其女友劉穎卓箫,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體垄潮,經(jīng)...
    沈念sama閱讀 45,782評(píng)論 1 316
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡烹卒,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,957評(píng)論 3 337
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了弯洗。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片旅急。...
    茶點(diǎn)故事閱讀 40,102評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖牡整,靈堂內(nèi)的尸體忽然破棺而出藐吮,到底是詐尸還是另有隱情,我是刑警寧澤逃贝,帶...
    沈念sama閱讀 35,790評(píng)論 5 346
  • 正文 年R本政府宣布谣辞,位于F島的核電站,受9級(jí)特大地震影響沐扳,放射性物質(zhì)發(fā)生泄漏泥从。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,442評(píng)論 3 331
  • 文/蒙蒙 一沪摄、第九天 我趴在偏房一處隱蔽的房頂上張望躯嫉。 院中可真熱鬧纱烘,春花似錦、人聲如沸和敬。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,996評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽昼弟。三九已至啤它,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舱痘,已是汗流浹背变骡。 一陣腳步聲響...
    開封第一講書人閱讀 33,113評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留芭逝,地道東北人塌碌。 一個(gè)月前我還...
    沈念sama閱讀 48,332評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像旬盯,于是被迫代替她去往敵國和親台妆。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,044評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容