现象
鼠标移动时看板娘的头/眼会甩到极限后卡住不回来,鼠标移回画布中心也不回正;同时 breath 一直停在 1(模型一直处于"吸满气"状态);切换模型后新模型还会带着上一个模型的角度偏移(实测残留 12.87)。
- 环境:plugin-live2d 2.1.0(Halo 2.x)
- 模型:Cubism 4(moc3)与 Cubism 2(moc)都能复现
- 未声明
Motions 的模型最明显(累加不会被动作掩盖)
根因:add 写入被引擎每帧的基线吸收,导致逐帧累加
引擎 untitled-pixi-live2d-engine 每帧的参数生命周期是:
// Cubism4InternalModel.update()
updateMotions(model, now); // 动作写参数(没有重置)
model.saveParameters(); // 把「当前值」存成基线
... 眨眼 / focus / 呼吸 / 物理 / pose ...
model.update();
model.loadParameters(); // values = saved,即上面那个「含插件写入」的值
而插件的 flush() 挂在 internalModel.update() 之后(packages/live2d/src/runtime/controller/controller.ts):
internalModel.update = (dt, now) => { originalUpdate(dt, now); this.coordinator.flush(); };
写入落在 loadParameters() 后面 → 存活到下一帧 → 被下一帧的 saveParameters() 吸收成基线。
而 add 的语义是「相对当前值叠加」(runtime/semantic/semantic-parameter-layer.ts):
if (blendMode === "add") targetValue = this.accessor.getValue(param.index) + value;
于是每帧都叠在自己上一帧的结果上。最小复现(每帧固定 add 15,ParamAngleX 范围 ±30):
帧: 1 2 3 4 5 6 7 8
angleX: 0.00 15.00 30.00 30.00 30.00 30.00 30.00 30.00 ← 两帧撞上限后永久卡死
受影响的写入:鼠标追踪的 angleX/angleY/eyeBallX/eyeBallY、程序化呼吸 breath、行为状态里的 breath/cheek。
期望行为
鼠标追踪平滑跟随,移回画布中心后归位。
复现步骤
- 用任一自带 idle 动作的模型(如
Potion-Maker/Pio),或一个未声明 Motions 的 Cubism 4 模型;
- 鼠标移到看板娘画布(左下角 300×300)右侧外面,停 2 秒;
- 再把鼠标移回画布正中。
- 现状:头/眼停在极限不回来(未声明动作的模型会永久卡在 ±30)
- 期望:平滑跟随并回正
修复
已提交 PR:#85
现象
鼠标移动时看板娘的头/眼会甩到极限后卡住不回来,鼠标移回画布中心也不回正;同时
breath一直停在 1(模型一直处于"吸满气"状态);切换模型后新模型还会带着上一个模型的角度偏移(实测残留 12.87)。Motions的模型最明显(累加不会被动作掩盖)根因:
add写入被引擎每帧的基线吸收,导致逐帧累加引擎
untitled-pixi-live2d-engine每帧的参数生命周期是:而插件的
flush()挂在internalModel.update()之后(packages/live2d/src/runtime/controller/controller.ts):写入落在
loadParameters()后面 → 存活到下一帧 → 被下一帧的saveParameters()吸收成基线。而
add的语义是「相对当前值叠加」(runtime/semantic/semantic-parameter-layer.ts):于是每帧都叠在自己上一帧的结果上。最小复现(每帧固定
add 15,ParamAngleX范围 ±30):受影响的写入:鼠标追踪的
angleX/angleY/eyeBallX/eyeBallY、程序化呼吸breath、行为状态里的breath/cheek。期望行为
鼠标追踪平滑跟随,移回画布中心后归位。
复现步骤
Potion-Maker/Pio),或一个未声明Motions的 Cubism 4 模型;修复
已提交 PR:#85