請教一篇siggraph上比較好實現的論文?

關於fluid simulation的,代碼量最好不要太大,易於模擬。


來歪一下樓。最簡單的流體效果,莫過於不用模擬,直接生成速度場,例如動畫、遊戲中都非常流行的Curl noise[1],也是「Brid神」的,只需3頁。

[1] Bridson, Robert, Jim Houriham, and Marcus Nordenstam. "Curl-noise for procedural fluid flow." ACM Transactions on Graphics (TOG). Vol. 26. No. 3. ACM, 2007. https://www.cct.lsu.edu/~fharhad/ganbatte/siggraph2007/CD2/content/papers/046-bridson.pdf


關於 Fluid Simulation,我談談使用基於 SPH 方法模擬水的 Siggraph 論文,這類基於 SPH 的方法代碼量不大,實現比較容易。

(1) Siggraph 09" 有篇基於 SPH 的文章 「Predictive-corrective incompressible SPH」 ,簡稱為 PCISPH 方法。這個挺容易實現的,可以參見我的 github 項目"基於CUDA技術的高效流體模擬演算法" (Gfans/ISPH_NVIDIA_CUDA_CONTEST · GitHub),裡面有CPU和GPU實現。代碼框架基於 rchoetzlein/fluids3 · GitHub .

我使用 PCISPH 模擬水的效果圖:

(2) Siggraph 11" 同一作者的一篇 SPH paper "Two-scale particle simulation" 這個我也實現過,不過不太完美,PCISPH 理論性更強,實現簡單,而這篇 paper 感覺 hack 多一點,不作推薦。這個實現不完美,就不上圖了(囧)。

(3) Siggraph 12" 一篇文章 "Versatile rigid-fluid coupling for incompressible SPH" 也不錯,使用Bullet 模擬剛體(也可以使用 PhysX/Havok 等其他物理引擎負責剛體模擬),流體部分可以用 WCSPH/PCISPH 實現,這個Fluid-Solid Coupling 技術不錯。我實現過 Gpu Gems 3 上的 Real-Time Rigid Body Simulation on GPUs 模擬剛體(也可以只取單層表面粒子用於剛體受力計算),然後使用這篇 Sig 12" paper 中的 Coupling 技術完成流固耦合模擬,效果還不錯,實現也容易。

對應的Github項目鏈接:Gfans/UnifiedParticleFrameworkCUDA · GitHub (GPU 實現利用了CUDA 的 fast shared memory,參考了 SCA 10" paper "Interactive SPH Simulation and Rendering on the GPU")

效果圖:

類似方法可以模擬複雜固體邊界,效果圖:

(4) Siggraph 12" "Ghost SPH for animating water" 這個沒實現過,不過應該也很容易,題主感興趣的話可以試試。就沖著大神 Robert Bridson ( 流體模擬大牛 @張心欣 的老闆,我只是拋磚引玉,大牛勿噴 ^-^ )也可以去嘗試下,這篇貌似是他們組唯一一篇基於 SPH 的 paper。希望這些能夠對題主有一點點啟發。


visual simulation of smoke. 煙比水容易些,寫吧


煙的模擬,可以先看看Stable Fluids和visual simulation of smoke,Stable Fluids二維版本的代碼只有100行左右,改成三維的基本沒有難度。煙霧的模擬可以很容易擴展到火焰的模擬,參考Physically Based Modeling and Animation of Fire。

水的模擬,可以看看Robert Bridson 和 Christopher Batty的文章。FLIP(Animating sand as a fluid)演算法是比較好實現的,Bridson網頁有二維的代碼,Batty也有簡單的3D流體模擬的完整代碼。

至於用到Level Set Method,主要是Animation and Rendering of Complex Water Surfaces這個文章。具體實現可以參考Fedkiw組開放的部分代碼和ETH的mentaflow。

值得一提的是,Blender中的流體模擬代碼。水的模擬是N. Thuerey的LBM+Level set實現,煙和火焰的模擬是Cornell大學的Wavelet Turbulence的移植。效果都很不錯。

至於粒子法,主要就是SPH和Position Based Fluids,其他人都大概提到了。


謝 @vczh 邀。

我沒怎麼研究過fluid simulation,只是略看過http://mmacklin.com/pbf_sig_preprint.pdf 和另一篇基於sdf的,名字都不記得了。。。


樓上各位大神,能不能多回答小弟一個問題,我在看"Real Time Fluid Dynamics for Games",也是Jos Stam大神寫的。在page 6里為什麼說"we could build the matrix for this linear system and then call a standard matrix inversion routine",小弟愚鈍,沒看出來哪裡需要矩陣求逆(當然論文是說不需要求逆,只用了Gauss–Seidel iteration)

還有個小問題:

#define IX(i,j) (i + (N+2) * j)

難道不應該是 ((i+1) + (N + 2) * j) 嗎?我改了後沒看出什麼差別

還有h=1/N,難道不該是1/(N+2) 嗎?

是不是不應該較真這些細節。。。(?ω?。)?


Tenssendorf 「Simulating Ocean Water」.我是菜鳥 ,現在在做這一篇,感覺比較容易。


推薦閱讀:

WebGL2.0標準的發展和普及如何?
光線追蹤器在實現光線折射時,玻璃球出現奇怪的黑圈?
OpenGL shader如何調試?
path tracing 渲染bunny glass材質,為什麼會有奇怪的黑色?
像玻璃球這種透明且帶有折射現象的物體如何進行實時渲染?

TAG:C | 計算機圖形學 |