用途:该技能面向使用 @pixiv/three-vrm 加载 VRM 模型时出现的头发或服装物理异常,提供排查与修复思路。
主要能力:覆盖常见症状的定位,包括头发加载时向上飞或炸开、像有隐形墙一样水平外翘、僵硬不自然、物理从错误位置起始等。
必要用法与原因:
- 时间步:vrm.update(delta) 的 delta 需以秒为单位,过大会导致物理爆炸。可用 THREE.Clock 获取并限制上限,例如 delta = Math.min(delta, 0.05)。
- 碰撞体:VRM 模型常带过大的球形碰撞体,导致头发卡住。可先禁用碰撞体验证;常见做法是按经验将碰撞体半径乘以 0.5,代码中该值为 COLLIDER_REDUCTION = 0.5,属经验值,不保证对所有模型正确。也可只禁用头部或面部碰撞体,或在 Unity 中修正后重新导出。
- 运行时缩放:若缩放 vrm.scene,需按比例同步缩放碰撞体半径,否则缩小后碰撞体相对更大。
- 模型问题:若日志出现 _worldSpaceBoneLength: 0、头发骨骼不响应,可能是模型导出配置错误,需在 Unity 或 Blender 中修复并保证骨骼有非零子骨骼。
关键 API:springBoneManager.reset() 清除物理状态;setInitState() 以当前位置作为新静止状态;joints 与 colliders 为集合;vrm.update(delta) 更新全部系统。每个关节的 settings 含 stiffness、gravityPower、gravityDir、dragForce。
适用场景:three.js 网页中渲染 VRM 角色的头发与服装物理调试。限制:50% 缩减为经验值,背后 UniVRM 导出缩放问题虽有记录但无法对所有模型数学证明;具体原因随模型和工具而变。