尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

16-SOFA_仿真背后的力学(总结)

16-SOFA_仿真背后的力学(总结) 1.AnimationLoop回顾 SOFA 一个完整仿真需要哪些东西首先需要 AnimationLoop。它负责决定一个时间步里面各个计算步骤按照什么顺序执行也就是当前时间 t↓AnimationLoop组织各项计算↓完成一个仿真时间步↓进入 t dt即使不写也存在默认 AnimationLoopNode nameroot dt0.01 gravity0 0 0 DefaultAnimationLoop / DefaultVisualManagerLoop / Node namemyObject ... /Node /Node默认情况下 SOFA 会提供一个 DefaultAnimationLoop。但仍然建议最好在场景里面明确写出来你要用哪个 AnimationLoop。主要有两类DefaultAnimationLoop 和 FreeMotionAnimationLoop2.DefaultAnimationLoop 和 FreeMotionAnimationLoop2.1.DefaultAnimationLoopDefaultAnimationLoopCollision detection碰撞检测主要对应 penalty response↓Physics resolution求解物理运动↓AnimateVisitor Update更新状态2.2.FreeMotionAnimationLoop先计算 free physics↓碰撞检测↓求解约束↓综合物理 约束/碰撞↓修正运动FreeMotionAnimationLoop 的 Scene Graph 通常要更复杂原因是它还需要 Constraint Solver 去真正求解约束。在碰撞问题里它可以进一步求 接触力contact forcesDefaultAnimationLoop→ 普通物理仿真流程FreeMotionAnimationLoop→ 自由运动 约束/接触求解3.MechanicalObject 的 template一定要注意 MechanicalObject 的 template。因为 template 决定这个 MechanicalObject 中的自由度是什么类型例如MechanicalObject templateRigid3d namemyParticle position0 0 0 0 0 0 1 /这里 Rigid3d 意味着它描述的是一个三维刚体自由度。所以position不只是三个坐标还包括刚体姿态。4.单个刚体不会形变接着把问题缩小到 Single rigid body单个刚体。这里暂时不考虑铰接系统、多刚体、复杂角运动只考虑一个刚体。牛顿方程可以写其中外力内力但对于的这个理想单刚体不讨论使物体内部发生形变的内部自由度。所以重点是外力刚体整体移动但刚体不形变即 Rigid no internal force no deformation可以用刚体的质心来描述它的整体平移运动。于是可以写其中是质心的位置。4.1.牛顿记号点记号是牛顿记号点记号专门用来对时间 t 求导x x(t)位置关于时间的函数ẋ dx/dt一阶导速度 vẍ d²x/dt²二阶导加速度 a所以等式直接等价 ∑F mẍ ⇔ ∑F ma5.积分方案integration schemeMechanicalObject templateRigid3d namemyParticle position0 0 0 0 0 0 1 / UniformMass totalMass1/ ConstantForceField totalForce1 0 0 0 0 0 /我们已经有MechanicalObject Mass Force从物理方程来看似乎已经足够但当时点 Animate物体还是不会动。因为当时缺了Integration scheme Linear solver其中最先缺的是积分方案integration scheme因为还需要告诉计算机怎么从当前时间的状态算到。Integration scheme 的作用就是完成这就是我们为什么一直需要 EulerImplicitSolver 之类的 ODE Solver它告诉我们怎样从当前仿真状态进入下一状态。6.积分方案分显式和隐式计算这个力的时候应该使用哪个时间点的6.1.Explicit——显式积分显式方法使用已经知道的状态。例如,或者它们的某种组合。只要使用 过去状态 或 当前状态 这些已经知道的值就是显式方法。Explicit用已知状态计算力优点简单、计算效率高缺点通常要求很小的比如那么为了模拟就需要个时间步。所以单步虽然简单但如果时间步必须特别小整个仿真仍然可能很慢。6.2.Implicit——隐式积分另一种策略是也就是用下一时间步的位置计算力。问题在于现在还不知道。因此求解就变得更复杂。Implicit力依赖尚未求出的未来状态优点可以使用更大的时间步。缺点每一步要求解的数学系统更复杂。方法优点缺点Explicitsimple, efficientrequires a smallImplicitallows largermore complex system to solve7.积分方案最终会产生线性系统不论使用显式还是隐式问题最终归结成注意这里的 x 不是前面 MechanicalObject 的位置 x 本身这里是线性代数里待求未知量。这里用显式 Euler 举例。显式方法是在当前状态计算力。7.1. 加速度写成速度变化定义于是代回得到两边乘SOFA 中这里求的通常不是 acceleration而是 velocity increment。即不是直接把作为未知量而是求于是刚才的线性系统对应这个简单显式例子,,8.区分 Integration Scheme 和 Linear SolverIntegration Scheme例如EulerExplicitSolver、EulerImplicitSolver负责把动力学方程整理成线性系统。也就是决定是什么是什么以及未知量是什么。但是它不负责真正把解出来。Linear Solver真正负责求解的是 Linear Solver 比如前面使用的 CGLinearSolver 。ODE / Integration Solver↓建立 Ax b↓Linear Solver↓真正求 x9.Linear Solver 分两类线性求解器大致有两类。9.1.Direct Solver——直接求解器思想接近也就是直接求精确解。可以理解为试图对矩阵做直接处理。特点精度高 / 求解直接但可能计算成本高9.2.Iterative Solver——迭代求解器比如CG Conjugate Gradient 共轭梯度法它不是一次就得到答案而是先猜一个解算误差修正再算误差继续修正...残差其中是当前第次迭代的解。目标就是也就是不断减小的误差。所以 CGLinearSolver 本质上就是通过迭代不断逼近 Axb 的解。10.MeshLoader是被动组件MeshLoader 是 passive component被动组件。它自己不会计算物理它做的只是读取 mesh 文件↓读取点、边、三角形、四面体等信息↓把这些信息提供给场景通常再连接 TopologyContainer 或其他 Mesh Topology 组件。因此MeshLoader ≠ 物理模型它只是数据加载器。11.仿真模型需要哪些东西总结物理部分前面加入过 MassUniformMass、MeshMatrixMassExternal ForceConstantForceFieldMechanical Constitutive Law例如之前肝脏里的线弹性模型也就是MechanicalObjectMassForce / ForceFieldConstitutive Model构成基本机械模型。假设已经有 MechanicalObject、Mass、Force 甚至已经有材料模型但没有 Integration Scheme Linear Solver物体还是不会真正从推进到Physics ≠ 完整可运行仿真还需要数值求解部分EulerImplicitSolver CGLinearSolver12.Mapping 把 representation 连起来当从刚体例子进入之前的 Deformable Liver场景开始增加其他 representationMechanical Model、Rendering Model、Collision Model如果三种 representation 使用不同 MeshMechanical Mesh、Visual Mesh、Collision Mesh就需要 Mapping 连接它们。
返回列表