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。写上它会让场景文件更清楚、更规范。

相关推荐
zzqssliu2 小时前
跨境独立站多端适配开发:多语言+多货币+跨平台同步技术实战
前端·javascript·php
一条泥憨鱼2 小时前
深入理解Java反射(超详细)
java·开发语言·spring·mybatis·反射
怕浪猫2 小时前
Electron 开发实战(五):文件系统与本地数据持久化全解
前端·javascript·electron
minji...2 小时前
Linux 高级IO(一)理解IO及其本质,理解五种IO模型,非阻塞IO,fcntl
服务器·网络·多路转接·高级io·非阻塞io·五种io模型·阻塞io
J-query2 小时前
修改AndroidStudio的Boot Java Runtime for the IDE后,AndroidStudio启动就报错
java·开发语言·ide·android studio
Han.miracle2 小时前
Java HashMap 与 ConcurrentHashMap 核心原理总结:从 Hash 冲突到 LongAdder
java·算法·哈希算法
Gauss松鼠会2 小时前
GaussDB(DWS) SQL性能问题案例集
java·数据库·经验分享·spring boot·后端·sql·gaussdb
RD_daoyi2 小时前
Google 官方调整抓取工具 IP 文件路径:SEO 与服务器安全策略要变了?
服务器·人工智能·学习·tcp/ip·搜索引擎·chatgpt
NiceCloud喜云2 小时前
Anthropic 发布 Project Glasswing:未公开模型 Mythos 已挖出 10000+ 漏洞,含 OpenBSD 27 年老 bug
android·java·数据库·c++·python·docker·bug
云水一下2 小时前
HTML5 从入门到精通:语义为王——结构标签让网页会“说话”
前端·html5