Camera tracking: multiply all camera matrices by inverted first reconstructed camera matrix

This makes blender camera:
- Be located on exactly the same position at first frame after applying
  Camera Solver constraint
- Be looking in exactly the same direction it used to look before
  applying Camera Solver constraint

Before this patch in most of cases camera used to change direction
after applying solved data on it which can be confusing in some cases.

Currently solved files wouldn't be broken, but after solve scene should
be re-oriented. Not big deal because re-solving isn't so safe for scene
orientation anyway.
This commit is contained in:
2011-11-18 14:42:18 +00:00
parent cc314e442c
commit dae43b5487

View File

@@ -1285,8 +1285,10 @@ static int retrieve_libmv_reconstruct_tracks(MovieTracking *tracking, struct lib
MovieTrackingTrack *track;
MovieTrackingReconstruction *reconstruction= &tracking->reconstruction;
MovieReconstructedCamera *reconstructed;
float origin[3]= {0.0f, 0.0f, 0.0f};
int ok= 1;
float imat[4][4];
unit_m4(imat);
track= tracking->tracks.first;
while(track) {
@@ -1354,12 +1356,13 @@ static int retrieve_libmv_reconstruct_tracks(MovieTracking *tracking, struct lib
mat[i][j]= matd[i][j];
if(!origin_set) {
copy_v3_v3(origin, mat[3]);
copy_m4_m4(imat, mat);
invert_m4(imat);
origin_set= 1;
}
if(origin_set)
sub_v3_v3(mat[3], origin);
mul_m4_m4m4(mat, mat, imat);
copy_m4_m4(reconstructed[reconstruction->camnr].mat, mat);
reconstructed[reconstruction->camnr].framenr= a;
@@ -1380,7 +1383,7 @@ static int retrieve_libmv_reconstruct_tracks(MovieTracking *tracking, struct lib
track= tracking->tracks.first;
while(track) {
if(track->flag&TRACK_HAS_BUNDLE)
sub_v3_v3(track->bundle_pos, origin);
mul_v3_m4v3(track->bundle_pos, imat, track->bundle_pos);
track= track->next;
}