引言:为什么柔性仿真是物理AI最硬的骨头

在具身智能(Embodied AI)的浪潮中,物理仿真引擎正成为机器人训练的"基础设施"。但当我们把目光从刚性物体的抓取、搬运,转向服装、布料、软体玩具等柔性物体时,仿真难度会陡然提升一个数量级。柔性物体仿真面临三重技术挑战:材质复杂、碰撞频繁、形变非线性。一件衣服在折叠、悬垂、揉捏过程中会涉及拉伸、剪切、弯曲、自碰撞等耦合的物理特性,其数学建模和计算求解极为复杂。

凌迪科技(Style3D)长期聚焦物理AI,以自研仿真引擎 SynReal 为核心,在柔性仿真领域位列全球前三,拥有超 50 项技术专利。其首席科学家王华民博士曾任俄亥俄州立大学计算机科学教授,团队在布料仿真领域持续产出顶会成果——其中"GPU 实时模拟布料碰撞"相关工作被 SIGGRAPH 2022 收录。在 WAIC 2026 上,凌迪展示了 SynReal World(面向机器人的训练世界)、StyleWork(服装产业 AI 应用)、Stylebolt(门店机器人)三大产品,标志着其柔性仿真技术正从工业软件向通用物理AI平台延伸。

本文抛开产品宣传,从底层技术角度深度拆解:柔性物体仿真的数学模型、布料碰撞检测算法、GPU 实时模拟架构、SynReal 三组件设计、引擎横向对比,以及合成数据到具身智能训练的完整技术链路。


一、柔性物体仿真的数学模型分析

柔性物体(布料、软体)仿真的核心是求解一个随时间演化的形变方程。根据离散化与求解策略的不同,主流方法可分为三类:质点-弹簧模型(Mass-Spring System)、有限元方法(FEM)、以及基于位置的动力学(Position-Based Dynamics, PBD)。三者各有取舍,在精度、稳定性、计算效率之间形成不同的平衡点。

1.1 质点-弹簧模型(Mass-Spring System)

质点-弹簧模型是最直观的离散化方法。它将布料表示为一张由质点构成的网格,质点之间用弹簧连接。每个质点 $i$ 的运动遵循牛顿第二定律:

$$
m_i \ddot{\mathbf{x}}i = \mathbf{F}^{internal} + \mathbf{F}_{i}^{external}
$$

其中内部力来自连接的弹簧。布料通常采用三种弹簧结构来近似织物行为:

  • 结构弹簧(Structural Spring):连接水平和垂直相邻质点,抵抗拉伸。
  • 剪切弹簧(Shear Spring):连接对角相邻质点,抵抗剪切形变。
  • 弯曲弹簧(Bend Spring):跳过一个质点连接,抵抗折叠与弯曲。

每根弹簧产生的力采用胡克定律:

$$
\mathbf{F}{ij} = k_s (|\mathbf{x}| - L_0) \frac{\mathbf{x}{ij}}{|\mathbf{x}|} - k_d \dot{\mathbf{x}}_{ij}
$$

其中 $k_s$ 为刚度系数,$k_d$ 为阻尼系数,$L_0$ 为静止长度。

优点:实现简单、易于并行、计算开销低,适合实时交互场景。
缺点:弹簧刚度受数值积分稳定性限制(显式 Euler 要求 $\Delta t \propto \sqrt{m/k}$),难以表现强刚度材料的真实行为;且各向同性的弹簧网络难以精确拟合真实织物的各向异性力学曲线。

1.2 有限元方法(FEM)

有限元方法将连续体离散为有限个单元(如三角形或四面体),通过弹性势能泛函推导内力。对于布料,常用 Saint-Venant Kirchhoff 模型或基于应变不变量的各向异性模型。

设形变映射为 $\phi(\mathbf{X}) = \mathbf{x}$,形变梯度为 $\mathbf{F} = \partial \mathbf{x} / \partial \mathbf{X}$,Green 应变为 $\mathbf{E} = \frac{1}{2}(\mathbf{F}^T \mathbf{F} - \mathbf{I})$。弹性势能:

$$
\Psi(\mathbf{E}) = \frac{\lambda}{2} (\text{tr}, \mathbf{E})^2 + \mu , \text{tr}(\mathbf{E}^2)
$$

内力通过对节点位移求势能负梯度得到 $\mathbf{f} = -\partial \Psi / \partial \mathbf{x}$,并组装成全局刚度矩阵 $\mathbf{K}$,最终求解线性系统:

$$
\mathbf{M} \ddot{\mathbf{x}} + \mathbf{C} \dot{\mathbf{x}} + \mathbf{K} \mathbf{x} = \mathbf{f}_{ext}
$$

优点:物理保真度高,能与真实材料参数(杨氏模量、泊松比)直接对应,适合工业级服装仿真。
缺点:计算量大,需要求解大型稀疏线性系统;大形变下易出现单元翻转(inversion),需要 inversion-free 的能量模型(如 ARAP、Stable Neo-Hookean)处理。

1.3 基于位置的动力学(Position-Based Dynamics, PBD)

PBD 是一种直接在位置空间求解约束的方法,绕开了力-加速度-速度-位置的显式积分链路。其核心思想是:先预测位置,再通过迭代投影满足约束。

预测步骤(显式 Euler):

$$
\mathbf{x}_i^* = \mathbf{x}_i + \Delta t , \mathbf{v}i + \Delta t^2 , \mathbf{f} / m_i
$$

约束投影步骤对每个约束 $C_j(\mathbf{x}{i_1}, \dots, \mathbf{x}) = 0$,按刚度权重 $w_i = 1/m_i$ 求解位置修正:

$$
\Delta \mathbf{x}i = -\frac{w_i , C_j(\mathbf{x})}{\sum_k w_k |\nablak} C_j|^2} \nabla_i} C_j
$$

PBD 的约束可以是距离约束(模拟弹簧)、体积约束、碰撞约束等。它的衍生方法 XPBD(Extended PBD) 通过引入拉格朗日乘子将约束求解与材料刚度解耦,使得 PBD 能够精确对应弹性模量,弥合了 PBD 与 FEM 在物理精度上的差距。

优点:无条件稳定、对大时间步鲁棒、约束求解天然适合并行,是实时布料与游戏物理的事实标准。
缺点:求解精度依赖迭代次数,刚度受迭代次数限制;约束的雅可比矩阵近似带来数值耗散。

凌迪 SynReal 的柔性引擎在设计上融合了 FEM 的高保真与 PBD/XPBD 的稳定性优势:在需要材料级精度的离线仿真中使用非线性 FEM 求解器,在实时训练场景中采用 GPU 并行的 XPBD 约束求解器,并通过自适应网格重划分(remeshing)在褶皱区域加密、平坦区域稀疏化。


二、布料碰撞检测算法分析

碰撞检测是柔性仿真中最耗时的环节。布料自碰撞(self-collision)的复杂度可达 $O(n^2)$($n$ 为顶点数),而一件高精度衣服的顶点数可达数十万。因此高效的碰撞检测数据结构与并行算法是性能关键。

2.1 AABB 树(轴对齐包围盒树)

AABB(Axis-Aligned Bounding Box)树是一种层次包围盒结构。每个叶节点存储一个图元(三角形或质点)的 AABB,内部节点存储子节点 AABB 的并集。查询时,自顶向下递归检测两棵树的 AABB 是否相交,只有相交的节点对才进入更精细的检测。

AABB 树的构建复杂度为 $O(n \log n)$,单次查询平均 $O(\log n)$。在布料动态形变中,AABB 需要逐帧更新。由于布料形变幅度大,树结构容易退化,需要周期性重建或采用增量更新(refit)策略。AABB 树适合中等规模、形变不太剧烈的刚-柔碰撞,但对大规模布料自碰撞效率有限。

2.2 空间哈希(Spatial Hashing)

空间哈希将三维空间划分为均匀网格,将每个图元映射到一个或多个网格单元的哈希桶中。查询碰撞时,只需检查同一桶内的图元对,将 $O(n^2)$ 降至接近 $O(n)$。

# 空间哈希碰撞检测的概念示例
def build_spatial_hash(triangles, cell_size):
    grid = {}
    for tri_id, tri in enumerate(triangles):
        bbox_min, bbox_max = tri.aabb()
        # 遍历三角形 AABB 覆盖的所有网格单元
        for ix in range(int(bbox_min.x / cell_size), int(bbox_max.x / cell_size) + 1):
            for iy in range(int(bbox_min.y / cell_size), int(bbox_max.y / cell_size) + 1):
                for iz in range(int(bbox_min.z / cell_size), int(bbox_max.z / cell_size) + 1):
                    key = (ix, iy, iz)
                    grid.setdefault(key, []).append(tri_id)
    return grid

空间哈希的优势在于构建与查询均为线性复杂度,且天然适合 GPU 并行。挑战在于网格单元尺寸的选择:过大导致桶内图元过多、候选对膨胀;过小导致大三角形跨越过多单元、内存开销激增。常用改进包括分层网格( hierarchical grid)和基于 Morton 码的空间填充曲线排序,使相邻图元在内存中连续,提升缓存命中率。

2.3 GPU 并行碰撞检测

凌迪团队在 SIGGRAPH 相关工作中采用了基于 排斥力(repulsion) 的 GPU 碰撞处理方法。其核心思想是:用空间哈希在 GPU 上并行生成候选碰撞对,对每对接近的顶点-三角形施加排斥约束,从而避免穿透。

王华民团队的"A Safe and Fast Repulsion Method for GPU-based Cloth Self Collisions"提出了一套快速且安全的碰撞处理流程:通过排斥约束保证不穿透(safety),通过分裂(splitting)方法将碰撞处理与动力学求解器集成,并配合静态与自适应重网格(remeshing)提升运行时性能。该方法强调 高效、安全、鲁棒、可并行,这正是 GPU 实时布料模拟的核心诉求。

GPU 并行碰撞检测的关键技术点包括:

  1. 候选对生成的并行化:每个线程处理一个图元,写入空间哈希桶;通过原子操作或前缀和(prefix sum)去重候选对。
  2. 排斥约束的并行投影:采用 PBD/约束求解框架,对每个候选对独立计算位置修正,用原子加(atomicAdd)写回,避免写冲突。
  3. 连续碰撞检测(CCD):对高速运动区域使用基于区间求根的 CCD,防止"隧穿"(tunneling);王华民团队的 "Fast GPU-Based Two-Way Continuous Collision Handling" 将双向连续碰撞处理也搬上了 GPU。

三、GPU 实时布料模拟的技术架构

3.1 SIGGRAPH 2022:MAS 预条件器

凌迪首席科学家王华民团队发表于 ACM Transactions on Graphics (SIGGRAPH 2022) 的论文 "A GPU-Based Multilevel Additive Schwarz Preconditioner for Cloth and Deformable Body Simulation",将实时布料与可形变体仿真的规模推向 5 万至 50 万顶点级别。其技术核心是一个基于 GPU 的 多层加性 Schwarz(MAS)预条件器

预条件器用于加速共轭梯度(PCG)等迭代求解器的收敛。传统预条件器(如 ILU0、ILUT)在 GPU 上难以高效并行。该论文的关键创新包括:

  • 小型不重叠区域分解:与传统 MAS 使用重叠区域不同,采用小型不重叠区域,充分挖掘 GPU 的并行计算能力。
  • 基于 Morton 码的多层区域构建:利用空间填充曲线(Morton/Z-order)对网格进行排序分层,构造从细到粗的多层区域结构,保证数据局部性。
  • 单向 Gauss-Jordan 消元的低成本矩阵预计算:预计算各区域局部矩阵的逆,运行时仅需矩阵-向量乘法。
  • 无冲突的对称矩阵-向量乘法:设计运行时预条件中的无冲突对称 SpMV,避免原子操作的串行化开销。

实验表明,该预条件器在 GPU 上将 PCG 求解器加速约 4 倍,其 CPU 版本亦优于 ILU0 和 ILUT。它兼容 PCG、加速梯度下降、L-BFGS 等多种线性和非线性求解器,适用于带动态接触的布料与可形变体仿真。这一成果使得单张 GPU 即可实时模拟复杂布料碰撞(如羊毛大衣以 37fps 实时模拟,仿真精度达 5mm 量级),为 SynReal 的高保真实时引擎奠定了算法基础。

3.2 GPU 实时模拟架构图

下图展示了 SynReal 柔性引擎的 GPU 实时模拟流水线,体现"数据并行 → 碰撞检测 → 约束求解 → 积分更新"的核心循环:

flowchart LR subgraph 数据并行层["数据并行层 (GPU Kernel 启动)"] A1["顶点/网格数据<br/> Morton 码空间排序"] --> A2["并行力计算<br/>(弹簧/FEM 内力)"] A2 --> A3["并行外力与边界条件<br/>(重力/风/抓取)"] end subgraph 碰撞检测层["碰撞检测层"] B1["空间哈希构建<br/>(并行写桶)"] --> B2["候选对生成<br/>(prefix sum 去重)"] B2 --> B3["排斥约束/CCD<br/>(顶点-三角形)"] end subgraph 约束求解层["约束求解层"] C1["MAS 预条件 PCG<br/>(多层区域分解)"] --> C2["约束投影<br/>(XPBD 拉格朗日乘子)"] C2 --> C3["碰撞约束满足校验"] end subgraph 积分更新层["积分更新层"] D1["位置/速度积分<br/>(半隐式 Euler)"] --> D2["自适应重网格<br/>(褶皱区域加密)"] D2 --> D3["输出状态<br/>至下一帧"] end A3 --> B1 B3 --> C1 C3 --> D1 D3 --> A1

这条流水线的每一环都高度并行化:数据层以 Morton 码保证内存局部性,碰撞层以空间哈希实现线性复杂度,求解层以 MAS 预条件器加速全局线性系统收敛,积分层以自适应重网格在精度与性能间动态平衡。整个循环在单 GPU 上以实时帧率运行,是 SynReal Sim 区别于传统离线柔性仿真器的关键。


四、SynReal 三组件技术架构

SynReal 是凌迪面向物理AI的自研仿真引擎,由三个组件构成:SynReal Sim(高保真仿真引擎)、SynReal Arena(具身智能训练平台)、SynReal Core(基于大规模合成交互数据训练的模型)。三者构成从仿真到智能体的完整闭环。

flowchart TB subgraph SynRealSim["SynReal Sim — 高保真仿真引擎"] S1["柔性/刚性统一求解器<br/>(FEM + XPBD + 排斥碰撞)"] S2["GPU 实时渲染与物理并行<br/>(MAS 预条件 PCG)"] S3["物理材质参数库<br/>(质量/摩擦/弹性/碰撞)"] S4["引擎集成层<br/>(NVIDIA Newton / MuJoCo / Isaac)"] end subgraph SynRealArena["SynReal Arena — 具身智能训练平台"] A1["数字资产 → 训练对象<br/>(文字/图片/CAD + 物理属性)"] A2["任务编排与仿真运行<br/>(可反复运行/量化验证)"] A3["合成数据生成<br/>(缩小 sim-real 差距)"] A4["强化学习/模仿学习训练循环"] end subgraph SynRealCore["SynReal Core — 大规模合成数据训练模型"] C1["大规模合成交互数据集"] C2["具身策略模型训练"] C3["仿真评测与迭代"] end S1 & S2 & S3 & S4 --> A2 A1 --> A2 A2 --> A3 A3 --> A4 A4 --> C1 C1 --> C2 C2 --> C3 C3 -.策略回写.-> A4

4.1 SynReal Sim:仿真引擎底座

SynReal Sim 承担物理求解的底层职责。其设计要点:

  • 柔刚统一:在同一求解框架内处理柔性布料与刚性物体,支持机器人与柔性环境交互(如机械手折叠衣物)。
  • 物理材质参数化:为每个数字资产补充质量、摩擦系数、弹性模量、碰撞响应等物理属性,使仿真对象遵循真实物理规律。
  • 引擎集成:SynReal 接入 NVIDIA Newton 物理引擎与 Google DeepMind MuJoCo,在需要高精度刚体动力学与机器人关节仿真的场景中调用底层引擎,而柔性部分由 SynReal 自研求解器处理,形成互补。

4.2 SynReal Arena:训练世界

SynReal World 的构建分为三环节,对应 Arena 的核心流程:

第一步:数字资产变为训练对象。 从文字描述、图片或 CAD 模型生成物体几何,并自动补充物理属性。这一步将静态的 3D 资产转化为可参与物理仿真的"活"对象。

第二步:物理仿真运行。 物体在引擎中遵循物理规律运动与交互,任务可被反复运行,训练结果可量化验证。这是强化学习所需的"可重置环境(resettable environment)"的关键。

第三步:合成数据生成。 引擎批量生成带标注的合成交互数据,并通过域随机化等手段缩小合成数据与真实数据的差距。

4.3 SynReal Core:数据驱动的策略模型

SynReal Core 基于大规模合成交互数据训练具身策略模型。由于仿真环境可生成近乎无限的交互数据,Core 能覆盖现实世界难以采集的稀有场景(如衣物各种折叠状态、织物撕裂等),再通过 Sim-to-Real 迁移策略部署到真实机器人。


五、物理仿真引擎横向对比

下表对比 SynReal 与主流物理仿真引擎在柔性仿真、刚体动力学、GPU 并行、机器人训练等维度的特性。

维度 SynReal NVIDIA Newton MuJoCo Isaac Gym / Isaac Lab NVIDIA PhysX
主导方 凌迪科技(Style3D) NVIDIA / Google DeepMind / Disney Research Google DeepMind NVIDIA NVIDIA
开源情况 闭源(商业引擎) 开源(Linux Foundation 托管) 开源(Apache 2.0) 开源(部分) 开源(BSD)
柔性/布料仿真能力 强(自研柔性求解器,FEM+XPBD,全球前三) 弱-中(基于 Warp,柔性为扩展方向) 弱(主要面向刚体/肌骨) 弱(偏刚体与环境) 中(有限柔体,布料较弱)
刚体动力学 中(接入 Newton/MuJoCo 补强) 强(机器人关节优化) 强(接触/约束求解精度高) 强(大规模并行刚体) 强(游戏级刚体)
GPU 并行 强(MAS 预条件器,实时布料) 强(基于 Warp,GPU 加速) 弱-中(CPU 为主,GPU 在迭代) 强(大规模并行 RL) 中(GPU 加速可选)
机器人训练适配 中-强(Arena 训练平台) 强(面向机器人学习优化) 强(RL 标准基线) 强(RL 训练框架原生) 弱(非训练导向)
生态集成 接入 Newton / MuJoCo 兼容 MuJoCo / Isaac Lab 独立生态 Newton / MuJoCo 兼容 游戏引擎生态
典型场景 柔性环境具身训练、服装仿真 人形机器人学习 机器人 RL 基准 大规模并行 RL 游戏/实时交互

从对比可以看出,各引擎的定位差异显著:MuJoCo 与 Newton 侧重刚体与机器人关节的高精度动力学,是强化学习的标准基线;Isaac Gym/Lab 强调大规模并行训练吞吐;PhysX 面向游戏级实时交互;而 SynReal 的差异化壁垒在于柔性物体仿真——这是其他引擎普遍薄弱的领域。凌迪的策略是"以柔性为长板,以接入 Newton/MuJoCo 补齐刚体",在涉及布料、织物、软体环境的具身任务中形成独特价值。


六、合成数据到真实数据迁移:Sim-to-Real Gap

仿真环境能以低成本生成海量训练数据,但仿真与真实之间存在不可避免的分布差异,即 Sim-to-Real Gap。差距来源包括:物理参数不精确(摩擦、质量、弹性)、传感器噪声差异(相机渲染、深度噪声)、动力学未建模效应(磨损、柔性迟滞)。SynReal 在合成数据生成环节通过以下技术缩小差距。

6.1 域随机化(Domain Randomization)

域随机化的核心思想是:在训练时对仿真参数进行大范围随机化,使策略对参数扰动鲁棒,从而在部署到真实世界(被视为随机化分布中的一个采样点)时仍能泛化。可随机化的维度包括:

  • 物理参数随机化:质量 $\pm 20%$、摩擦系数 $\mu \in [0.3, 0.8]$、弹性模量、控制延迟等。
  • 视觉随机化:纹理、光照方向、相机位姿、背景,使策略不依赖特定外观。
  • 动力学随机化:关节阻尼、电机增益,模拟真实执行器的不确定性。
# 域随机化的概念示例:为每次仿真采样物理参数
import random

def sample_domain_params():
    return {
        "mass_scale":       random.uniform(0.8, 1.2),
        "friction":          random.uniform(0.3, 0.8),
        "restitution":       random.uniform(0.0, 0.3),
        "youngs_modulus":    random.uniform(0.8e6, 1.2e6),
        "control_latency_ms": random.randint(0, 30),
        "light_dir":         [random.uniform(-1, 1) for _ in range(3)],
    }

def reset_episode(sim, asset):
    p = sample_domain_params()
    asset.set_mass_scale(p["mass_scale"])
    asset.set_friction(p["friction"])
    asset.set_youngs_modulus(p["youngs_modulus"])
    sim.set_light_direction(p["light_dir"])
    return p

6.2 域适应与系统辨识

除随机化外,缩小 gap 的另一路径是系统辨识(System Identification):用少量真实数据反推仿真参数,使仿真更贴近真实。对于柔性物体,凌迪可利用其服装仿真积累的材料参数估计能力(王华民团队有"Learning-Based Bending Stiffness Parameter Estimation by a Drape Tester"等工作),从悬垂实验反推织物的弯曲刚度,使仿真织物行为与真实织物对齐。此外,渲染域适应(用真实图像微调仿真渲染器)与动作域适应(用真实机器人轨迹校准仿真动力学)也是常用手段。

6.3 渐进式迁移

SynReal World 的三环节天然支持渐进式迁移:先在纯合成环境中训练,再逐步注入真实数据(少量真实演示用于模仿学习预训练,或少量真实参数用于辨识),最后在真实机器人上微调。这种"合成预训练 + 真实微调"的范式能最大化利用合成数据的规模优势,同时控制真实数据采集成本。


七、具身智能训练流水线分析

将上述组件串联,SynReal 支撑的具身智能训练流水线如下:

flowchart LR P1["资产生成<br/>(文字/图/CAD → 3D)"] --> P2["物理属性补全<br/>(质量/摩擦/弹性)"] P2 --> P3["仿真环境构建<br/>(SynReal Sim + Newton/MuJoCo)"] P3 --> P4["任务定义与奖励设计"] P4 --> P5["并行仿真运行<br/>(GPU 多环境)"] P5 --> P6["合成数据采集<br/>(视觉/本体感觉/动作)"] P6 --> P7["策略训练<br/>(PPO/SAC/模仿学习)"] P7 --> P8["仿真评测与量化验证"] P8 --> P9["Sim-to-Real 迁移<br/>(域随机化+系统辨识)"] P9 --> P10["真实机器人部署"] P10 -.失败/改进数据.-> P4

流水线的关键技术点:

  1. 并行仿真吞吐:强化学习需要海量交互样本。SynReal Sim 的 GPU 实时引擎允许同时运行大量并行环境,类似 Isaac Gym 的大规模并行 RL 范式,但额外支持柔性环境。
  2. 可量化验证:仿真环境的可重置性与确定性,使得策略可被反复评测、对比,这是真实世界难以提供的。评测指标(成功率、能耗、完成时间)在仿真中精确可得。
  3. 柔性任务的特殊性:折叠衣物、整理布料等柔性任务的状态空间高维且连续(布料形变自由度极大),传统刚体抓取的奖励设计不适用。SynReal 通过仿真生成的高保真形变状态,为这类任务的奖励塑形(reward shaping)提供了可计算的基础(如布料覆盖率、平整度指标)。
  4. 闭环迭代:真实部署的失败案例回流为改进数据,指导任务定义、奖励设计或物理参数辨识的修正,形成持续迭代。

八、布料模拟代码概念示例

下面给出两个概念性 Python 示例,分别展示质点-弹簧模型的显式积分与 PBD 的距离约束投影,帮助理解前述数学模型在代码层面的实现形态。

8.1 质点-弹簧模型(显式 Euler 积分)

import numpy as np

class MassSpringCloth:
    """质点-弹簧布料模型概念实现(显式 Euler 积分)"""
    def __init__(self, n, m, rest_len, mass, k_s, k_d, gravity=-9.8):
        self.n, self.m = n, m                      # 网格分辨率
        self.pos = self._init_grid(n, m, rest_len) # 顶点位置 (N,3)
        self.vel = np.zeros_like(self.pos)
        self.mass = np.full(self.pos.shape[0], mass)
        self.k_s, self.k_d = k_s, k_d             # 刚度 / 阻尼
        self.gravity = np.array([0, gravity, 0])
        self.springs = self._build_springs(n, m, rest_len)  # (i, j, L0)

    def _init_grid(self, n, m, L):
        x, y = np.meshgrid(np.arange(m) * L, np.arange(n) * L)
        z = np.zeros_like(x)
        return np.stack([x, y, z], axis=-1).reshape(-1, 3).astype(float)

    def _build_springs(self, n, m, L):
        springs = []
        for i in range(n):
            for j in range(m):
                idx = i * m + j
                if j + 1 < m: springs.append((idx, idx + 1, L))       # 结构(水平)
                if i + 1 < n: springs.append((idx, idx + m, L))       # 结构(垂直)
                if i + 1 < n and j + 1 < m:
                    springs.append((idx, idx + m + 1, L * np.sqrt(2)))# 剪切(对角)
                if j + 2 < m: springs.append((idx, idx + 2, 2 * L))   # 弯曲
        return springs

    def step(self, dt, fixed_ids=()):
        # 1. 计算弹簧内力
        force = np.zeros_like(self.pos)
        for i, j, L0 in self.springs:
            d = self.pos[j] - self.pos[i]
            dist = np.linalg.norm(d)
            if dist < 1e-9: continue
            dirv = d / dist
            f = self.k_s * (dist - L0) * dirv
            # 阻尼力(沿弹簧相对速度方向)
            rel_v = self.vel[j] - self.vel[i]
            f += self.k_d * np.dot(rel_v, dirv) * dirv
            force[i] += f
            force[j] -= f

        # 2. 外力(重力)
        force += self.mass[:, None] * self.gravity

        # 3. 固定点不受力
        force[list(fixed_ids)] = 0

        # 4. 显式 Euler 积分
        self.vel += (force / self.mass[:, None]) * dt
        self.vel[list(fixed_ids)] = 0
        self.pos += self.vel * dt

# 注意:显式 Euler 受弹簧刚度 k_s 与时间步 dt 的稳定性约束:
#   dt <= 2 * sqrt(m / k_s)。强刚度材料需用隐式积分或 PBD。

8.2 PBD 距离约束投影

import numpy as np

def pbd_distance_constraint_solve(pos, inv_mass, springs, iters=10, compliance=0.0):
    """XPBD 风格的距离约束投影(概念实现)。
    pos      : (N,3) 当前预测位置
    inv_mass : (N,)  逆质量 (固定点=0)
    springs  : list of (i, j, rest_length)
    iters    : 约束求解迭代次数(越多越硬)
    compliance : 柔度参数(0 = 完全刚性约束)
    """
    pos = pos.copy()
    lagrange = np.zeros(len(springs))  # XPBD 拉格朗日乘子
    alpha = compliance  # 柔度/时间步相关,此处简化

    for _ in range(iters):
        for s_idx, (i, j, rest_len) in enumerate(springs):
            w_sum = inv_mass[i] + inv_mass[j]
            if w_sum == 0:
                continue  # 两端均固定,跳过

            delta = pos[j] - pos[i]
            dist = np.linalg.norm(delta)
            if dist < 1e-9:
                continue

            # 约束值 C = |x_j - x_i| - rest_len
            C = dist - rest_len
            # XPBD 乘子更新
            dlambda = (-C - alpha * lagrange[s_idx]) / (w_sum + alpha)
            lagrange[s_idx] += dlambda

            # 位置修正(按逆质量分配)
            correction = (dlambda / dist) * delta
            pos[i] -= inv_mass[i] * correction
            pos[j] += inv_mass[j] * correction
    return pos

def pbd_cloth_step(pos, vel, inv_mass, springs, dt, ext_force, iters=10):
    """PBD 单步:预测 → 约束投影 → 速度更新"""
    # 1. 预测位置(显式 Euler)
    vel = vel + dt * ext_force * inv_mass[:, None]
    predicted = pos + dt * vel

    # 2. 约束投影(距离约束 + 此处可扩展碰撞约束)
    solved = pbd_distance_constraint_solve(predicted, inv_mass, springs, iters)

    # 3. 由位置变化反推速度
    new_vel = (solved - pos) / dt
    return solved, new_vel

上述 PBD 实现中,约束求解的迭代次数决定了布料的"等效刚度"——迭代越多越接近刚性约束。XPBD 通过拉格朗日乘子与柔度参数将刚度与迭代次数解耦,使材料参数能直接对应真实弹性模量。在实际 GPU 引擎中,约束求解循环会被展开为并行 kernel,每个约束由独立线程处理,位置修正通过原子操作写回,这正是凌迪团队 GPU 并行碰撞与约束处理方法的工程体现。


九、总结与展望

凌迪科技 SynReal 引擎的技术路径,清晰呈现了"从布料碰撞到具身智能训练世界"的演进逻辑:

  1. 底层算法积累:以王华民团队在 SIGGRAPH 等顶会的柔性仿真工作(GPU MAS 预条件器、排斥碰撞处理、亚毫米褶皱模拟、材料参数估计)为根基,构建了全球前列的柔性求解能力。
  2. 工程化封装:将 FEM、XPBD、GPU 并行碰撞检测整合为 SynReal Sim 实时引擎,并以接入 NVIDIA Newton 与 MuJoCo 补齐刚体动力学,形成柔刚统一的仿真底座。
  3. 训练闭环:通过 SynReal Arena(资产→仿真→合成数据三环节)与 SynReal Core(数据驱动策略模型),将仿真引擎升级为具身智能的训练基础设施,并用域随机化与系统辨识应对 Sim-to-Real Gap。

从技术趋势看,柔性仿真在具身智能中的价值正在凸显:真实世界中大量任务是柔性的(折叠、烹饪、清洁),而主流物理引擎在柔性方向恰恰是短板。SynReal 以柔性为差异化切入,结合 Newton/MuJoCo 的刚体能力,有机会在"柔性环境具身训练"这一细分但高价值的赛道建立壁垒。未来值得关注的几个技术方向包括:神经物理代理(learned physics surrogate) 用神经网络加速柔性求解、可微仿真支持基于梯度的策略优化、以及更大规模并行以支撑基础模型级的具身策略训练。

物理AI的核心,终究是让虚拟世界足够"真"。而在所有物理现象中,柔性形变或许是最难被计算、却也最贴近日常世界的那一类。凌迪的选择,是在这块最硬的骨头上持续打磨。