GLTF import: Prevent significant numerical errors in keyframe times
Keyframe times shift slowly in imported animations, starting with a zero shift
at the beginning and increasing and becoming erratic slowly farther into an
animation, reaching significant levels at times after about 3 minutes into an
animation. This commit fixes the issue by increasing the precision of the
floating point numbers used for keyframe time calculations. Only the most
significant cases that cause fast accumulation of errors over a short animation
duration are fixed. Other cases that would have a marginal benefit from
switching to double precision numbers are left for another PR/further analysis.
Note that this change has no impact on the runtime performance of games/apps
created using Godot. It only affects the GLTF importer.
Fixes #47127.
(cherry picked from commit 6770a9413b
)
This commit is contained in:
parent
79f8b5eff1
commit
87573e92dc
@ -3002,8 +3002,8 @@ void EditorSceneImporterGLTF::_import_animation(GLTFState &state, AnimationPlaye
|
||||
animation->track_set_imported(track_idx, true);
|
||||
//first determine animation length
|
||||
|
||||
const float increment = 1.0 / float(bake_fps);
|
||||
float time = 0.0;
|
||||
const double increment = 1.0 / bake_fps;
|
||||
double time = 0.0;
|
||||
|
||||
Vector3 base_pos;
|
||||
Quat base_rot;
|
||||
@ -3092,8 +3092,8 @@ void EditorSceneImporterGLTF::_import_animation(GLTFState &state, AnimationPlaye
|
||||
}
|
||||
} else {
|
||||
// CATMULLROMSPLINE or CUBIC_SPLINE have to be baked, apologies.
|
||||
const float increment = 1.0 / float(bake_fps);
|
||||
float time = 0.0;
|
||||
const double increment = 1.0 / bake_fps;
|
||||
double time = 0.0;
|
||||
bool last = false;
|
||||
while (true) {
|
||||
_interpolate_track<float>(track.weight_tracks[i].times, track.weight_tracks[i].values, time, gltf_interp);
|
||||
|
Loading…
Reference in New Issue
Block a user