Use linear interpolation for intersecting tracks when joining them together.

This commit is contained in:
Sergey Sharybin 2012-03-21 17:21:27 +00:00
parent e82cd12560
commit af46a2902f

@ -497,12 +497,58 @@ void BKE_tracking_join_tracks(MovieTrackingTrack *dst_track, MovieTrackingTrack
} else { } else {
if((src_track->markers[a].flag&MARKER_DISABLED)==0) { if((src_track->markers[a].flag&MARKER_DISABLED)==0) {
if((dst_track->markers[b].flag&MARKER_DISABLED)==0) { if((dst_track->markers[b].flag&MARKER_DISABLED)==0) {
/* both tracks are enabled on this frame, use their average position /* both tracks are enabled on this frame, so find the whole segment
* can be improved further if tracks will be storing tracking score */ * on which tracks are intersecting and blend tracks using linear
* interpolation to prevent jumps */
markers[i]= dst_track->markers[b]; MovieTrackingMarker *marker_a, *marker_b;
add_v2_v2(markers[i].pos, src_track->markers[a].pos); int start_a = a, start_b = b, len = 0, frame = src_track->markers[a].framenr;
mul_v2_fl(markers[i].pos, 0.5f); int j, inverse = 0;
inverse = (b == 0) ||
(dst_track->markers[b-1].flag & MARKER_DISABLED) ||
(dst_track->markers[b-1].framenr != frame - 1);
while (a < src_track->markersnr && b < dst_track->markersnr) {
marker_a = &src_track->markers[a];
marker_b = &dst_track->markers[b];
if (marker_a->flag & MARKER_DISABLED || marker_b->flag & MARKER_DISABLED)
break;
if (marker_a->framenr != frame || marker_b->framenr != frame)
break;
frame++;
len++;
a++;
b++;
}
a = start_a;
b = start_b;
for (j = 0; j < len; j++) {
float fac = 0.5f;
if (len > 1)
fac = 1.0f / (len - 1) * j;
if (inverse)
fac = 1.0f - fac;
marker_a = &src_track->markers[a];
marker_b = &dst_track->markers[b];
markers[i]= dst_track->markers[b];
interp_v2_v2v2(markers[i].pos, marker_b->pos, marker_a->pos, fac);
a++;
b++;
i++;
}
/* this values will be incremented at the end of the loop cycle */
a--; b--; i--;
} }
else markers[i]= src_track->markers[a]; else markers[i]= src_track->markers[a];
} }