最小 SOFA XML 场景结构 0-base.scn

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 里就会显示这个名字。

命名的作用是:以后方便查找对象、以后方便连接对象、以后方便区分多个同类组件。

相关推荐
栈溢出了几秒前
Java Lambda 表达式笔记
java·开发语言·intellij-idea
会周易的程序员2 分钟前
使用 pybind11 封装 C++ 日志库 microLog 为 Python 模块
java·c++·python·物联网·架构·日志·aiot
zhixingheyi_tian10 分钟前
一份GC日志的解读
java·开发语言
风止何安啊12 分钟前
🚦 前端并发请求 “交通管制”:别让你的接口堵成早高峰
前端·javascript·面试
J船长16 分钟前
扫盲烂笔头:A 记录、CNAME 的作用, Nginx的用途,为啥叫反向代理
前端
ywl47081208721 分钟前
ArrayList和LinkedList内部的实现原理和区别
java·java基础
妙码生花22 分钟前
从 PHP 到 AI + Golang,程序员自救转型手记(二十六):icon 组件封装
前端·vue.js·typescript
李明卫杭州23 分钟前
Vue2 & Vue3 中 Router `props` 配置详解:彻底摆脱 `$route` 依赖
前端·vue.js·前端框架
掘金一周23 分钟前
裁员了,公司很爽快,赔偿一分没少 | 沸点周刊 7.8
前端·人工智能·后端
熊猫钓鱼>_>27 分钟前
2026 前端的三场底层革命:当 Vue、React Native 和 Three.js 同时去掉中间层
前端·javascript·vue.js·react native·架构·webgl·three.js