Skip to content

地面碰撞体(WASM Bullet 静态刚体)

系统概览

通过 MmdWasmPhysicsRuntimeImpl.addRigidBodyToGlobal 把一块静态地板刚体注入所有模型的物理世界,使头发/裙子等 Dynamic 刚体在重力下落到地面时获得支撑,不再无限下坠。由 env-bridge.setGroundCollisionEnabled 驱动;运行时就绪 / 场景加载后由 applyGroundCollision() 还原持久化状态。

核心职责

  • ground-collision.ts — 全局静态地面刚体注入 / 移除 / 状态还原(幂等)

对外 API(节选)

  • isGroundCollisionEnabled() — 当前是否启用
  • enableGroundCollision(groundY=0) — 注入静态地板(幂等;失败释放已分配资源,保持未启用态)。注:groundY 参数当前为死代码——applyGroundCollision 不传、无外部调用方传非零值,地面 Y 恒为 0。
  • disableGroundCollision() — 从所有世界移除并释放
  • applyGroundCollision() — 按 envState.groundCollisionEnabled 还原

与其他子系统关系

  • 驱动方:env-bridge.setGroundCollisionEnabled
  • 物理 impl 经 @/core/mmd-adaptergetPhysicsImpl(runtime) 访问(ADR-192 适配层网关,原散落 as unknown as {physics?...} 反射已收口)
  • 仅 WASM 运行时生效;JS 运行时空转
  • 释放顺序:removeRigidBodyFromGlobal → rb.dispose → info.dispose → shape.dispose
  • dispose 异常契约:removeRigidBodyFromGlobal 抛错时 logWarn 但不阻断后续 safeDispose(try/finally,避免 impl 已销毁时资源链路断裂)
  • 地板半尺寸 2000m(覆盖全场景),碰撞组/掩码全开,friction 0.9