FEMFX 仿真示例及运行流程
在 FEMFX/samples/FEMFXViewer/FEMFXViewer.cpp 中有基于 FEMFX 和 glfw 的一个简单示例程序。熟悉形变仿真及 glfw 的话,可以很快的划出基于 FEMFX 的仿真流程主框架,也就是,依次调用了那些函数,来实现仿真功能。
略去 glfw 的初始化,事件函数设置等,仿真过程主要由以下函数构成:
1、仿真场景 Scene
初始化:
InitScene("models/", gTimingsPath.c_str(), gNumThreads, gRandomSeed);
具体的内容,应该是建立仿真场景中的物体,等等。
2、仿真步计算:
Update();
这里面完成了所有的仿真计算,形变计算、碰撞检测、约束求解、碎片模拟等。全部的内容,都在这里面了。
3、仿真场景中物体的渲染:
DrawScene();
很简单,将计算得到的物体形态,实时渲染。
整个仿真流程,可以认为就包含了这么几部分:初始化,重复进行仿真计算、渲染。
FEMFX 引擎可以实现基于 CPU 的多线程 multi-threading 计算。在程序代码的角度,由于我不太熟悉多线程的编程实现方法,所以,对于我的阅读有许多困难。下面,我将试图从单线程的角度,去解释 FEMFX 中的仿真流程及代码执行步骤。
先不去管 DrawScene()
这一部分。因为该部分相对简单。直白一点,该部分的内容就是从 gScene
中调出 tetMesh
,渲染一下就好了。这没什么好说的。
具体分析一下 Update()
中的内容。我们发现,略去次要内容,Update()
中也只包含了两部分内容:FmUpdateScene(gScene, gTimestep);
和 UpdateObjects();
。其中,通过程序的仿真结果以及代码分析可知,UpdateObjects();
里面的内容,是驱动仿真场景中的物体运动,比如,让小车行驶,让车轮旋转等。因此,在对 FEMFX 框架的仿真中,就不做分析了。那么,FEMFX 中实现仿真的代码主体,即为 FmUpdateScene(gScene, gTimestep)
分析 FmUpdateScene(gScene, gTimestep)
中的内容:
这部分代码在 FEMFX/amd_femfx/src/Simulation/FEMFXSimulate.cpp 中
从单线程的角度分析代码执行过程,发现,FmUpdateScene(gScene, gTimestep)
主要包含了以下内容:
1、FmUpdateUnconstrained(scene, timestep, NULL, NULL);
2、FmFindContacts(scene, NULL, NULL);
3、FmWakeCollidedIslandsAndFindContacts(scene, NULL, NULL);
4、FmFindConstraintIslands(scene, NULL);
5、FmSceneConstraintSolve(scene, NULL, NULL);
后续的笔记中,将会分别分析,各部分代码,都做了些什么事情。并试图给出 FEMFX 中数据的存储结构,以及各部分数据的作用。