zoukankan      html  css  js  c++  java
  • 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]
  • 相关阅读:
    javascript删除JSON元素
    State ,Getter , Mutation , Action , Module
    mutation和action区别
    图片懒加载
    git命令合并分支代码
    vue 项目生产环境下去重console
    rem px pt em (区别)
    npm 安装依赖 以及dependencies 和 devDependencies的区别
    仿百度搜索
    h5页面在移动端需要注意的一些事情
  • 原文地址:https://www.cnblogs.com/wghou09/p/12698843.html
Copyright © 2011-2022 走看看