Skip to content

[Bug] 鼠标追踪甩到极限后卡住:参数写入被引擎每帧基线吸收累加 #84

Description

@Enterpr1se0

现象

鼠标移动时看板娘的头/眼会甩到极限后卡住不回来,鼠标移回画布中心也不回正;同时 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。

期望行为

鼠标追踪平滑跟随,移回画布中心后归位。

复现步骤

  1. 用任一自带 idle 动作的模型(如 Potion-Maker/Pio),或一个未声明 Motions 的 Cubism 4 模型;
  2. 鼠标移到看板娘画布(左下角 300×300)右侧外面,停 2 秒;
  3. 再把鼠标移回画布正中。
  • 现状:头/眼停在极限不回来(未声明动作的模型会永久卡在 ±30)
  • 期望:平滑跟随并回正

修复

已提交 PR:#85

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions