跟随Nils Thurey的脚步慢慢实现了Free Surface LBM模型,看到他将自己的源码贡献给了Blender的一个project之后,便急切地想见见大牛亲自操刀的源代码。
那么,开始了~
首先是Blender的官网,一切从这里开始: http://www.blender.org/
找到 Development -> Building Blender
按照上面的步骤: 我参照的是 Build Blender with Microsoft Visual C++ and CMake,整个过程是难得地轻松愉快。
编译了DEBUG版本的blender之后便可以正常运行。
首先找了视频教程学习Fluid Simulation模块的使用,发现的确非常方便,就跟在3d max中建立一个小场景是一样的。只是Fluid的演化并不是实时的(毕竟是极大的计算量),需要经过一段时间的BAKE,才能看到连贯的动画。
至此,blender的Fluid Simulation功能就算是会用了,觉得很熟悉,也很新奇。熟悉是因为在opengl中见惯了这样的场景,新奇是因为这样的功能居然整合到了建模软件里面,对于这个模块3d max之类的暂时也无法望其项背了。
那么接下来最关心的部分就是源代码了,Fluid Simulation对应的模块在源码中叫做Elbeem,一个命名为bf_intern_elbeem的子项目。不得不说牛人的代码真的不是一般人能看懂的...好歹我也已经走通了大部分原理,也依葫芦画瓢的实现了简单的Free Surface LBM,但看着一片接一片的宏,也只能望洋心叹。
看了N个小时总算是找到了主要的代码段,原本要改进这个模块的想法只能先放一放,先看懂整个步骤再说了。
BAKE键触发的是 static int fluidsimBake(bContext *C, ReportList *reports, Object *fsDomain, short do_job) 函数,也就是整个模拟的开始点。
然后从ntlWorld -> SimulationObject -> LbmFsgrSolver
而LBM的演化步骤都在 LbmFsgrSolver::mainLoop(int lev) 函数中。
郁闷的是stream and collision步都写在了宏里面:DEFAULT_STREAM 和 DEFAULT_COLLIDEG; 这个演化在一个由两个宏: GRID_LOOP_START() 、 GRID_LOOPREG_END() 生成的一个大循环里面,难找又难读。
继续努力吧...
Blender_Fluid Simulation 初探
最新推荐文章于 2024-09-03 09:49:42 发布