Skip to content

[Feature]: VRM facial expressions (presets + triggers) #43

Description

@rosspeili

One-line summary

Drive the loaded VRM’s built-in facial expression presets (and any custom expressions on the model) from AVATAR — beyond today’s blink and amplitude lip sync.

Problem / motivation

VRM models already carry standard emotion expressions (and sometimes custom ones) inside the .vrm. We only use expressionManager for blink and mouth visemes atm, so the face stays emotionally flat while the body can play VRMA. Users and future triggers (hotkeys, keywords, local bus) have no way to set happy / angry / sad / relaxed / surprised (or model-specific names) at a chosen weight and clear them afterward.

Proposed solution

Explore and implement expression control on the currently loaded avatar:

  • Discover what the model actually exposes (expressionManager presets + customs); don’t assume every file has the full set.
  • Apply / clear expression weights (0–1) without permanently fighting lip sync and blink (define a simple override / blend policy).
  • Expose triggers in a way that fits existing surfaces — e.g. optional face on animation one-shots, hotkeys, keywords, and/or a small manual UI, exact placement TBD in design.
  • Persist only what makes sense (bindings / last manual choice); don’t invent a “custom expressions folder” (expressions live in the VRM, not as separate media files).

Keep v1 local-first and Electron-first, document which presets are missing when a model omits them.

Alternatives considered

  • Rely on VRMA clips that bake facial tracks, harder to author/reuse, many packs are body-only.
  • Hardcode only five emotion names, breaks on incomplete or custom-heavy models.
  • Full Appearance “Emotions” product surface before any trigger API, may be premature, a shared set/clear path might land first.

Primary surface

Other

Constraints you accept

  • Should stay usable offline / local-first
  • Browser-only mode may remain limited vs Electron

Mock / sketch / reference (optional)

Open: whether expressions get a gear entry, sit under Appearance, only ride along with animation/hotkey/keyword/bus events, or some mix. Prefer one internal set / clear path that all of those can share.

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:animationsDefault sequence, VRMA clips, cross-fadearea:appearanceAvatars, drop-in VRM naming, custom foldersfeatureNew feature or improvement requestneeds designNeeds UX / visual decision before implementationstack:vrmVRM / VRMA loaders, three-vrm, expressions

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions