[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [39079] branches/soc-2011-tomato/source/ blender/blenkernel: Camera tracking integration

Sergey Sharybin g.ulairi at gmail.com
Fri Aug 5 19:50:21 CEST 2011


Revision: 39079
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=39079
Author:   nazgul
Date:     2011-08-05 17:50:21 +0000 (Fri, 05 Aug 2011)
Log Message:
-----------
Camera tracking integration
===========================

Interpolate camera location and orientation for frames
where's no reconstruction data.

This fixes motion blur compositor node (first and last camera's
position was at origin, so motion vector was totally incorrect).

Modified Paths:
--------------
    branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
    branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c
    branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c

Modified: branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2011-08-05 17:39:44 UTC (rev 39078)
+++ branches/soc-2011-tomato/source/blender/blenkernel/BKE_tracking.h	2011-08-05 17:50:21 UTC (rev 39079)
@@ -77,6 +77,7 @@
 struct MovieTrackingTrack *BKE_find_track_by_name(struct MovieTracking *tracking, const char *name);
 
 struct MovieReconstructedCamera *BKE_tracking_get_reconstructed_camera(struct MovieTracking *tracking, int framenr);
+void BKE_tracking_get_interpolated_camera(struct MovieTracking *tracking, int framenr, float mat[4][4]);
 
 void BKE_get_tracking_mat(struct Scene *scene, float mat[4][4]);
 void BKE_tracking_projection_matrix(struct MovieTracking *tracking, int framenr, int winx, int winy, float mat[4][4]);

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c	2011-08-05 17:39:44 UTC (rev 39078)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/constraint.c	2011-08-05 17:50:21 UTC (rev 39079)
@@ -4124,14 +4124,12 @@
 		clip= scene->clip;
 
 	if(clip) {
-		camera= BKE_tracking_get_reconstructed_camera(&clip->tracking, scene->r.cfra);
+		float mat[4][4], obmat[4][4];
 
-		if(camera) {
-			float obmat[4][4];
+		BKE_tracking_get_interpolated_camera(&clip->tracking, scene->r.cfra, mat);
 
-			copy_m4_m4(obmat, cob->matrix);
-			mul_m4_m4m4(cob->matrix, camera->mat, obmat);
-		}
+		copy_m4_m4(obmat, cob->matrix);
+		mul_m4_m4m4(cob->matrix, mat, obmat);
 	}
 }
 

Modified: branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c
===================================================================
--- branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-08-05 17:39:44 UTC (rev 39078)
+++ branches/soc-2011-tomato/source/blender/blenkernel/intern/tracking.c	2011-08-05 17:50:21 UTC (rev 39079)
@@ -1054,34 +1054,91 @@
 	return NULL;
 }
 
-MovieReconstructedCamera *BKE_tracking_get_reconstructed_camera(MovieTracking *tracking, int framenr)
+static int reconstruction_camera_index(MovieTracking *tracking, int framenr, int nearest)
 {
 	MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
+	MovieReconstructedCamera *cameras= reconstruction->cameras;
 	int a= 0, d= 1;
 
 	if(!reconstruction->camnr)
-		return NULL;
+		return -1;
 
+	if(framenr<cameras[0].framenr) {
+		if(nearest) return 0;
+		else return -1;
+	}
+
+	if(framenr>cameras[reconstruction->camnr-1].framenr) {
+		if(nearest) return reconstruction->camnr-1;
+		else return -1;
+	}
+
 	if(reconstruction->last_camera<reconstruction->camnr)
 		a= reconstruction->last_camera;
 
-	if(reconstruction->cameras[a].framenr>=framenr)
+	if(cameras[a].framenr>=framenr)
 		d= -1;
 
 	while(a>=0 && a<reconstruction->camnr) {
-		if(reconstruction->cameras[a].framenr==framenr) {
+		int cfra= cameras[a].framenr;
+		int ok= cfra==framenr;
+
+		/* check if needed framenr was "skipped" -- no data for requested frame */
+
+		if(d>0 && cfra>framenr) {
+			/* interpolate with previous position */
+			if(nearest) return a-1;
+			else break;
+		}
+
+		if(d<0 && cfra<framenr) {
+			/* interpolate with next position */
+			if(nearest) return a;
+			else break;
+		}
+
+		if(cfra==framenr) {
 			reconstruction->last_camera= a;
-			return &reconstruction->cameras[a];
 
-			break;
+			return a;
 		}
 
 		a+= d;
 	}
 
-	return NULL;
+	return -1;
 }
 
+MovieReconstructedCamera *BKE_tracking_get_reconstructed_camera(MovieTracking *tracking, int framenr)
+{
+	int a= reconstruction_camera_index(tracking, framenr, 0);
+
+	if(a==-1)
+		return NULL;
+
+	return &tracking->reconstruction.cameras[a];
+}
+
+void BKE_tracking_get_interpolated_camera(MovieTracking *tracking, int framenr, float mat[4][4])
+{
+	MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
+	MovieReconstructedCamera *cameras= reconstruction->cameras;
+	int a= reconstruction_camera_index(tracking, framenr, 1);
+
+	if(a==-1) {
+		unit_m4(mat);
+		return;
+	}
+
+	if(cameras[a].framenr!=framenr && a>0 && a<reconstruction->camnr-1) {
+		float t= ((float)framenr-cameras[a].framenr) / (cameras[a+1].framenr-cameras[a].framenr);
+
+		blend_m4_m4m4(mat, cameras[a].mat, cameras[a+1].mat, t);
+	} else {
+		copy_m4_m4(mat, cameras[a].mat);
+	}
+}
+
 void BKE_get_tracking_mat(Scene *scene, float mat[4][4])
 {
 	if(!scene->camera)




More information about the Bf-blender-cvs mailing list