Google 今天發表了一個新的 LiquidFun 函式庫,可以用來在各種作業系統或手機上模擬流體的物理現象。

LiquidFun 是一個以 C++ 所開發的 2D 流體模擬函式庫,它以 Box2D 為基礎,並且實作了以利子為基礎(particle-based)的流體模擬,這個函式庫可以讓手機遊戲的開發者很容易在遊戲中加入近似實際流體的效果。

由於 LiquidFun 是以 C++ 開發的,所以除了手機之外,任何有 C++ 編譯器的作業系統或平台都可以運用這個函式庫,Google 除了將 LiquidFun 的原始碼放在 GitHub 之外,也提供了許多在 Windows、Mac OS X 與 Linux 上的應用程式範例與 unit tests。


在 Linux 中安裝與使用 LiquidFun

接下來我們示範如何在 Linux 系統中使用這套函式庫,我們以 Ubuntu Linux 的環境來示範。首先從 GitHub 下載 LiquidFun 的原始碼並解壓縮。

https://github.com/google/liquidfun/archive/master.zip
unzip master.zip
cd liquidfun-master/

解壓縮之後,就可以看到 LiquidFun 的原始程式碼了,而在進行編譯之前,要先安裝好下面幾個程式與函式庫:

  • Cmakecmake
  • OpenGL(libglapi-mesa
  • GLU(libglu1-mesa-dev

這些在 Ubuntu 下面可以使用 apt 安裝:

sudo apt-get install cmake libglapi-mesa libglu1-mesa-dev

如果是剛裝好的 Ubuntu 系統,記得也要裝一下編譯相關的工具:

sudo apt-get install build-essential

接著進入 liquidfun/Box2D 目錄,產生 Makefile:

cd liquidfun/Box2D
cmake -G'Unix Makefiles'

再執行 make

make

正常來說等到 make 跑完就編譯完成了,但是如果你的系統中缺少某些編譯需要用到的函式庫時,在編譯的過程就會被迫中斷,然後出現類似這樣的訊息:
In file included from /home/seal/liquidfun/liquidfun-master/freeglut/src/fg_internal.h:193:0,
from /home/seal/liquidfun/liquidfun-master/freeglut/src/fg_callbacks.c:29:
/home/seal/liquidfun/liquidfun-master/freeglut/src/x11/fg_internal_x11.h:42:35: fatal error: X11/extensions/XInput.h: No such file or directory
compilation terminated.
make[2]: *** [freeglut/CMakeFiles/freeglut.dir/src/fg_callbacks.c.o] Error 1
make[1]: *** [freeglut/CMakeFiles/freeglut.dir/all] Error 2
make: *** [all] Error 2

這個問題就是它找不到 X11/extensions/XInput.h 這個表頭檔,這時候可以嘗試利用 apt-cache 搜尋一下,看看有沒有類似的函式庫套件:

apt-cache search xinput

其輸出為
libxi-dev -- X11 Input extension library (development headers)
libxi6 -- X11 Input extension library
libxi6-dbg -- X11 Input extension library (debug package)
[略]

看這些套件的說明感覺就很有可能會包含 X11/extensions/XInput.h 這個表頭檔,而因為我們需要的是開發用的表頭檔,在安裝的時候要選擇 libxi-dev 這個開發用的套件:

sudo apt-get install libxi-dev

接著再重新執行 make,繼續編譯。這裡會碰到的編譯問題可能每個系統都不同,但基本上處理這類問題的流程大致上都差不多。

等到編譯完成之後,就可以執行 liquidfun/Box2D/Testbed/Testbed 這個測試程式看看有沒有成功。

./Testbed/Testbed

如果有編譯成功的話,就會看到這樣的模擬畫面了。

liquidfun-ubuntu

如果你在開發的過程中有更改到 LiquidFun 的原始碼,那麼在修改之後可以利用 liquidfun/Box2D/Testbed/Testbed 這個指令稿進行 unit test。

./Unittests/run_tests.sh

在 Mac OS X 中安裝與使用 LiquidFun

因為 LiquidFun 的視窗界面是使用 XWindow 的架構,所以在 Mac OS X 中如果要讓它可以正常運作,要先安裝 Xquartz 這個程式,提供一個 Mac OS X 中的 XWindow 環境。

接著一樣從 GitHub 下載 LiquidFun 的原始碼並解壓縮。

unzip master.zip
cd liquidfun-master/liquidfun/Box2D

按照官方的做法設定 CMake:

cmake -G"Xcode"

在我的 Mac OS X 10.9 中,會出現這樣的錯誤:
CMake Error: The following variables are used in this project, but they are set to NOTFOUND.
Please set them or make sure they are set and tested correctly in the CMake files:
OPENGL_INCLUDE_DIR (ADVANCED)
used as include directory in directory /Users/seal/Desktop/liquidfun/liquidfun-master/freeglut
used as include directory in directory /Users/seal/Desktop/liquidfun/liquidfun-master/freeglut
used as include directory in directory /Users/seal/Desktop/liquidfun/liquidfun-master/liquidfun/Box2D/glui
used as include directory in directory /Users/seal/Desktop/liquidfun/liquidfun-master/liquidfun/Box2D/Testbed

看起來是找不到 OpenGL 函式庫的位置,後來感覺用命令列太麻煩,我直接開 CMake 的 GUI 介面。

cmake-gui -G"Xcode" .

OPENGL_INCLUDE_DIR 設定為 liquidfun/Box2D/freeglut 就解決了。

cmake-gui-make

修改了 OPENGL_INCLUDE_DIR 之後,要按下「Configure」與「Generate」才會產生 Xcode 用的 Box2D.xcodeproj 這個檔案。接著用滑鼠對它點兩下用 Xcode 開啟這個檔案,然後在 Xcode 的「Product」選單中選擇「Build」編譯。

xcode-build

接著選擇一個範例 Scheme,例如「Testbed」->「My Mac 64-bit」。

xcode-scheme

然後按下工具列最左邊的 Build and Run 按鈕,這樣就會出現這個測試程式了。

liquidfun-mac-os-x

如果要進行 unit test,同樣可以使用 liquidfun/Box2D/Unittests/run_tests.sh 這個指令稿。

在 LiquidFun 的官方教學文件中,也敘述了 WindowsAndroid 平台的安裝與使用方式,有興趣的人可以參考看看。

參考資料:Google Open Source Blog