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

Reply via email to