Blender_Fluid Simulation 初探

来源:互联网 发布:php仿360导航源码 编辑:程序博客网 时间:2024/05/22 01:31

        跟随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()   生成的一个大循环里面,难找又难读。

        继续努力吧...

原创粉丝点击