[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [45066] trunk/blender/source/blender/ blenkernel/intern/tracking.c: Use linear interpolation for intersecting tracks when joining them together .

Sergey Sharybin sergey.vfx at gmail.com
Wed Mar 21 18:21:29 CET 2012


Revision: 45066
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=45066
Author:   nazgul
Date:     2012-03-21 17:21:27 +0000 (Wed, 21 Mar 2012)
Log Message:
-----------
Use linear interpolation for intersecting tracks when joining them together.

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/intern/tracking.c

Modified: trunk/blender/source/blender/blenkernel/intern/tracking.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/tracking.c	2012-03-21 16:45:27 UTC (rev 45065)
+++ trunk/blender/source/blender/blenkernel/intern/tracking.c	2012-03-21 17:21:27 UTC (rev 45066)
@@ -497,12 +497,58 @@
 		} 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];
 			}




More information about the Bf-blender-cvs mailing list