forked from bartvdbraak/blender
Use linear interpolation for intersecting tracks when joining them together.
This commit is contained in:
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];
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user