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 中数据的存储结构,以及各部分数据的作用。

graph LR A[FmUpdateScene] A --> B[FmUpdateUnconstrained] B --> B1[一些参数的计算和设置] B --> B2[FmWakeIslandsChangedBetweenSteps] B --> B3[FmFindMeshConnectedComponents] B --> B4[FmCollectTetMeshIds & FmCollectRigidBodyIds] B --> B5[写入了一些参数] B --> B6[FmTaskFuncStepVelocityRebuildBvh] B6 --> B61[FmTaskFuncTetMeshStepVelocityRebuildBvh] B61 --> B611[FmStepVelocityImplicitEuler] B61 --> B612[FmBuildHierarchy] B61 --> B613[FmAddDeformationConstraints] B6 --> B62[FmTaskFuncRbStepVelocityRebuildBvh] A --> C[FmFindContacts] A --> D[FmWakeCollidedIslandsAndFindContacts] A --> E[FmFindConstraintIslands] A --> F[FmSceneConstraintSolve]
原文地址:https://www.cnblogs.com/wghou09/p/12698843.html