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) _______________________________________________ Bf-blender-cvs mailing list Bf-blender-cvs@blender.org http://lists.blender.org/mailman/listinfo/bf-blender-cvs