XML
<Node name="root" dt="0.01" gravity="0 0 0">
<DefaultAnimationLoop />
<DefaultVisualManagerLoop />
<Node name="myObject" bbox="-1 -1 -1 1 1 1">
...
</Node>
</Node>
一个 SOFA 仿真文件 = 一个 root 根节点 + 一些全局组件 + 若干对象节点
1. 最外层 <Node name="root">
这是整个仿真的 根节点 root node 。
它表示整个仿真场景从这里开始,所有对象、组件、参数,都放在这个 root 里面。
2. dt="0.01" 是时间步
dt 就是 time step,时间步长 。
dt="0.01" 意思是每点一次 Step,仿真时间前进 0.01 秒。
3. gravity="0 0 0" 是重力加速度
这里的 gravity 不是"重力大小",而是 重力加速度 G 。
gravity="0 0 0" 意思是:x方向重力 = 0,y方向重力 = 0,z方向重力 = 0
所以这个场景里暂时没有重力。
如果在 root 里设置 gravity,它会影响场景中所有有质量的对象。真正产生的力是:F = m × g
gravity 是加速度,mass 是质量,两者结合才产生重力
4. <DefaultAnimationLoop />
这是 动画循环 / 仿真循环。它负责规定每一个时间步里,SOFA 要按什么流程执行。比如:碰撞检测、力学计算、更新位置、进入下一步。但它自己不真正计算力,它更像一个调度员。
root node 之后应该定义一个 animation loop 。它负责规定:每一个 time step 里面,SOFA 要做哪些计算。
比如你点一次 Step,SOFA 要知道这一小步里该执行什么流程。 animation loop 是负责定义一个时间步内发生什么的组件。
5. <DefaultVisualManagerLoop />
这个是 视觉显示管理循环。它主要负责:把仿真结果显示到 GUI 界面里。这个不需要太纠结,因为即使你不写,SOFA 也可能默认创建它。它和物理计算关系不大,主要服务于显示。
6. <Node name="myObject">
这是一个 子节点 child node。它通常表示场景里的一个对象。比如以后可以是particle、lever、cube、snake、heart、soft robot。现在它里面只有 ... , 说明这个对象还没真正定义内容,后面会一点点往里面加MechanicalObject、Mass、ForceField、Solver、CollisionModel、Mapping......
7.仿真的两种离散化
SOFA 在做仿真时有两种离散化,时间离散化和空间离散化。
时间离散化 就是上面的 dt="0.01":每次仿真往前走 0.01 秒。
空间离散化就是用点、节点、网格来表示一个物体。真实物体是连续的,但计算机只能处理有限个点/单元。
每个 time step 里,SOFA 都会更新物体的位置和位移场。
8.data
XML
<Node name="root">
<Node name="myObject">
这里的 name 也是一种 data 。
在 SOFA 里,data 不是"数据文件"的意思,而是:节点或组件的参数 / 属性。所以这些都属于 data:name="root";dt="0.01";gravity="0 0 0";bbox="-1 -1 -1 1 1 1"
新版 SOFA 右侧 Selection details → Property 里看到的,就是这些 data。
9.给对象/组件命名
可以给 DefaultAnimationLoop 起一个名字,保存、reload 之后,SOFA 的 Scene Graph 里就会显示这个名字。
命名的作用是:以后方便查找对象、以后方便连接对象、以后方便区分多个同类组件。