SOFA XML 场景结构示例_创建一个刚体粒子 1-rigid.scn

XML 复制代码
<?xml version="1.0"?>

<!-- Rigid object in a scene -->
<Node name="root" dt="0.01" gravity="0 0 0">

    <!-- When using components from SOFA modules, plugins, you can import them -->
    <RequiredPlugin name="Sofa.Component.StateContainer"/> <!-- Needed to use components [MechanicalObject] -->

    <DefaultAnimationLoop />

    <Node name="Particle" bbox="-1 -1 -1 1 1 1">

        <!-- Rigid DOFS = x y z + quaternion -->
        <MechanicalObject template="Rigid3d" name="myParticle" position="0 0 0 0 0 0 1" showObject="1" />

    </Node>

</Node>

1.MechanicalObject

MechanicalObject 是 SOFA 里的一个 passive component。它不计算东西,只保存每个时间步我们关心的状态,比如自由度、位置、位移、速度。MechanicalObject 可以理解为状态容器。

2.template="Rigid3d"

当你读一个 SOFA 文件时,看到一个 child node,首先要看里面有没有 MechanicalObject;如果有,最先看它的 template。因为 template 决定这个对象的 自由度性质

template="Rigid3d" 意思是:这个 Particle 是一个三维刚体(不是可变形物体)。

3.Rigid3d 和 Vec3d 的区别

(1)Vec3d

如果是 template="Vec3d",那一般表示每个点只有 x, y, z,也就是三维空间中的一个点的位置。适合可变形物体的节点,比如软体、网格点。每个点都可以有自己的位置和速度。

(2)Rigid3d

如果是 template="Rigid3d",那表示一个刚体自由度,不只是位置,还包括方向。

一个刚体在 3D 空间中需要:位置:x y z 姿态:orientation

这里前 3 个数是 x y z,后 4 个数是四元数 quaternion,用来表示方向。

position="0 0 0 0 0 0 1" 可以拆成:

0 0 0 → 位置 x y z

0 0 0 1 → 姿态 quaternion

所以 position="0 0 0 0 0 0 1" 不是 7 个点,而是一个刚体状态。意识是这个刚体初始状态是:位置在原点、姿态是默认姿态。

四元数 quaternion = 用来表示三维旋转/姿态的方法,它本质上就是 orientation,表示方向/姿态。

4.速度不是 7 个数

Rigid3d 的 position 状态 是:x y z + quaternion = 3 + 4 = 7

但它的 velocity 速度状态 不是 7 个数,而是:线速度 vx vy vz + 角速度 wx wy wz = 3 + 3 = 6

因为姿态用四元数表示,但姿态变化率通常用绕 x/y/z 的角速度表示。

5.showObject="1"

showObject 是一个显示/调试选项。它会强制把这个刚体 frame 显示出来,让你看到这个刚体粒子在哪里。

showObject="1":显示这个对象/小坐标架

showObject="0":不显示

6.RequiredPlugin

<RequiredPlugin name="Sofa.Component.StateContainer"/>

MechanicalObject 这个组件属于 Sofa.Component.StateContainer 这个模块。

RequiredPlugin = 加载某个 SOFA 模块

这里它是为了使用 MechanicalObject 这个组件。

如果不写,有时候也能运行,因为这是 SOFA 自带库,但终端里会有 warning。写上它会让场景文件更清楚、更规范。

相关推荐
IMPYLH19 分钟前
HTML 的 <data> 元素
前端·html
西门吹-禅40 分钟前
java springboot N+1问题
java·开发语言·spring boot
YHHLAI41 分钟前
[特殊字符] 面试中的 Promise —— 从入门到精通
前端·javascript·面试
DLYSB_1 小时前
生命通道:如何用 HIS 医疗系统直连网络声光终端,打造“零延误”的危急值响应网关?
java·网络·数据库·报警灯
weixin_BYSJ19871 小时前
SpringBoot + MySQL 乒乓球运动员信息管理系统项目实战--附源码04954
java·javascript·spring boot·python·django·flask·php
AI小码1 小时前
LLM 应用的缓存工程:当每次 API 调用都在燃烧成本
java·人工智能·spring·计算机·llm·编程·api
大E帝国子民11 小时前
MacOS 安装Seismic Unix
服务器·macos·unix
Hui Baby2 小时前
Spring Security
java·后端·spring
IT笔记3 小时前
【Rust】Rust Match 模式匹配详解
java·开发语言·rust
kyriewen3 小时前
我扒了 GPT-5.6 的全部编程跑分——有一项 OpenAI 没敢放出来
前端·gpt·ai编程