CNA-GAP-042: CUBICSPLINE bone and node channels are sampled at key times and played back linearly between them
Evidence basis: source-verified at the pinned commit; tests exist (not executed for this page). Claims on this page were checked by reading the CNA source at commit 009d40f5; unless a sentence says otherwise, nothing here was built or executed. Nothing on this page was executed unless the Evidence section says so.
BuildTrack evaluates each channel's Hermite curve only at the union of key times, and AnimationPlayer then lerps/slerps between those keys, so the curve's shape between keys is lost.
- Identifier
CNA-GAP-042- Category
- Functional gap
- Subsystem
- Models & glTF
- Status
- Open
- Verified against
- CNA
009d40f5(009d40f5dd085c4e674d3479675fac84b12b3e0a) - Evidence basis
- Source-verified: read at TARGET, not executed
- Tests touching this area
- Yes: see Current tests
- Affected contract
- AnimationPlayer and SkinnedModelEXT playback of glTF clips with CUBICSPLINE interpolation
Expected behaviour
glTF CUBICSPLINE channels define a Hermite curve between keys, which a player is expected to evaluate.
Actual behaviour at TARGET
BuildTrack in GltfImportCore.cpp resamples a bone's channels onto the union of their key times, evaluating CUBICSPLINE exactly at those times, and SampleTrack in AnimationPlayer.cpp interpolates linearly (Slerp for rotation) between keys. gltf-limitations.md records it: “A CUBICSPLINE is exact at the baked union keys but piecewise-linear/spherical between them”, with a measured error of up to about 9.6 % of the value span on its fixture. Morph-weight tracks keep their tangents and are evaluated as Hermite curves.
Source locations
modules/content/src/GltfImport/GltfImportCore.cpp— BuildTrack: union-of-key-times resamplingmodules/graphics/src/Xna/AnimationPlayer.cpp— SampleTrack: Lerp/Slerp between keysdocs/gltf-limitations.md— resampling row with the measured error
Evidence
Checked by reading at 009d40f5; not executed. The error figure is CNA's own measurement on its anim-cubicspline fixture.
Focused reproduction
No focused reproduction is known. Nothing has been invented here; the evidence above is what exists.
Current tests
GltfAnimationSamplingTests.cpp and GltfAnimationRobustnessTests.cpp cover sampling and resampling; the between-key approximation is the documented result.
Regression test
If Hermite playback is added, a mid-key sample assertion on the anim-cubicspline fixture.
Blast radius
Clips authored with CUBICSPLINE and sparse keys (overshoot, easing); dense or LINEAR clips are unaffected.
Workaround
Bake animations densely at export time.
Related pages
The same subject is explained at several altitudes. These are the neighbouring pages at each one.
- Deep dives
- Skinning and animation: clips
- Known issues
- Functional gap index