Blend Shape Timeline Lock
Severity: ℹ️ Info
Fixable: 🔧 Manual (Runtime workaround)
Prevalence: 🔶 Medium
Summary
Section titled “Summary”RealityKit’s AnimationPlaybackController takes exclusive ownership of blend shape weights during playback. Even when paused, animations continue to “sample” each frame, overwriting any manual blend shape changes. This prevents real-time facial expression control while an animation is playing.
Evidence
Section titled “Evidence”Community Reports
Section titled “Community Reports”- Developers attempting to blend facial animations with manual expressions encounter this
- Common in avatar/character customization scenarios
TODO: Add specific forum links
When It Occurs
Section titled “When It Occurs”Whenever:
- A model has blend shape weights
- An animation targeting those weights is playing
- Developer tries to manually set blend shape values
Root Cause
Section titled “Root Cause”RealityKit’s animation system maintains exclusive control over animated properties:
pause()freezes the animation but still samples each frame- Only
stop()fully releases ownership of the weights
This is by design for animation system consistency, but not well documented.
Detection
Section titled “Detection”File: PreflightCore/USDClient.swift
Preflight detects when both:
- Blend shape targets exist on meshes
- SkelAnimation with blend shape channels exists
Solution
Section titled “Solution”Runtime Workaround
Section titled “Runtime Workaround”// To manually control blend shapes:controller.stop() // NOT pause()
// Apply your manual weightsblendShapeWeightsComponent.weights = [...]
// Resume animation from stored time when doneSee: docs/AnimationPlaybackController_PauseVsStop.md
Validation
Section titled “Validation”- Empirically verified in Preflight development
- RealityKit animation ownership behavior confirmed
Related Issues
Section titled “Related Issues”- Skeleton Path Mismatch - Another animation issue
Changelog
Section titled “Changelog”| Date | Change |
|---|---|
| 2024-12-18 | Stub created |