Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2012-03-21 21:21:27 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2012-03-21 21:21:27 +0400
commitaf46a2902fff686a4abf59f0126c59b2e48bd4c4 (patch)
treec697b6b26babead25b68bbc2e34609f254d9069b /source/blender
parente82cd12560c39e5fe94dcf2b05855774cb6f5607 (diff)
Use linear interpolation for intersecting tracks when joining them together.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/tracking.c56
1 files changed, 51 insertions, 5 deletions
diff --git a/source/blender/blenkernel/intern/tracking.c b/source/blender/blenkernel/intern/tracking.c
index 2b79f179fb7..e9f0fecbe18 100644
--- a/source/blender/blenkernel/intern/tracking.c
+++ b/source/blender/blenkernel/intern/tracking.c
@@ -497,12 +497,58 @@ void BKE_tracking_join_tracks(MovieTrackingTrack *dst_track, MovieTrackingTrack
} else {
if((src_track->markers[a].flag&MARKER_DISABLED)==0) {
if((dst_track->markers[b].flag&MARKER_DISABLED)==0) {
- /* both tracks are enabled on this frame, use their average position
- * can be improved further if tracks will be storing tracking score */
+ /* both tracks are enabled on this frame, so find the whole segment
+ * on which tracks are intersecting and blend tracks using linear
+ * interpolation to prevent jumps */
- markers[i]= dst_track->markers[b];
- add_v2_v2(markers[i].pos, src_track->markers[a].pos);
- mul_v2_fl(markers[i].pos, 0.5f);
+ MovieTrackingMarker *marker_a, *marker_b;
+ int start_a = a, start_b = b, len = 0, frame = src_track->markers[a].framenr;
+ 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];
}