diff options
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/movieclip.c | 12 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/tracking_util.c | 18 | ||||
-rw-r--r-- | source/blender/makesdna/DNA_tracking_types.h | 7 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_tracking.c | 45 |
4 files changed, 82 insertions, 0 deletions
diff --git a/source/blender/blenkernel/intern/movieclip.c b/source/blender/blenkernel/intern/movieclip.c index 3ea0f800178..364e6c9bfe4 100644 --- a/source/blender/blenkernel/intern/movieclip.c +++ b/source/blender/blenkernel/intern/movieclip.c @@ -687,6 +687,8 @@ typedef struct MovieClipCache { float polynomial_k[3]; float division_k[2]; float nuke_k[2]; + float brown_k[4]; + float brown_p[2]; short distortion_model; bool undistortion_used; @@ -1134,10 +1136,18 @@ static bool check_undistortion_cache_flags(const MovieClip *clip) if (!equals_v2v2(&camera->division_k1, cache->postprocessed.division_k)) { return false; } + if (!equals_v2v2(&camera->nuke_k1, cache->postprocessed.nuke_k)) { return false; } + if (!equals_v4v4(&camera->brown_k1, cache->postprocessed.brown_k)) { + return false; + } + if (!equals_v2v2(&camera->brown_p1, cache->postprocessed.brown_p)) { + return false; + } + return true; } @@ -1240,6 +1250,8 @@ static void put_postprocessed_frame_to_cache( copy_v3_v3(cache->postprocessed.polynomial_k, &camera->k1); copy_v2_v2(cache->postprocessed.division_k, &camera->division_k1); copy_v2_v2(cache->postprocessed.nuke_k, &camera->nuke_k1); + copy_v4_v4(cache->postprocessed.brown_k, &camera->brown_k1); + copy_v2_v2(cache->postprocessed.brown_p, &camera->brown_p1); cache->postprocessed.undistortion_used = true; } else { diff --git a/source/blender/blenkernel/intern/tracking_util.c b/source/blender/blenkernel/intern/tracking_util.c index dcaa9082026..bc6c94343b5 100644 --- a/source/blender/blenkernel/intern/tracking_util.c +++ b/source/blender/blenkernel/intern/tracking_util.c @@ -457,6 +457,15 @@ static void distortion_model_parameters_from_tracking( camera_intrinsics_options->nuke_k1 = camera->nuke_k1; camera_intrinsics_options->nuke_k2 = camera->nuke_k2; return; + case TRACKING_DISTORTION_MODEL_BROWN: + camera_intrinsics_options->distortion_model = LIBMV_DISTORTION_MODEL_BROWN; + camera_intrinsics_options->brown_k1 = camera->brown_k1; + camera_intrinsics_options->brown_k2 = camera->brown_k2; + camera_intrinsics_options->brown_k3 = camera->brown_k3; + camera_intrinsics_options->brown_k4 = camera->brown_k4; + camera_intrinsics_options->brown_p1 = camera->brown_p1; + camera_intrinsics_options->brown_p2 = camera->brown_p2; + return; } /* Unknown distortion model, which might be due to opening newer file in older Blender. @@ -491,6 +500,15 @@ static void distortion_model_parameters_from_options( camera->nuke_k1 = camera_intrinsics_options->nuke_k1; camera->nuke_k2 = camera_intrinsics_options->nuke_k2; return; + case LIBMV_DISTORTION_MODEL_BROWN: + camera->distortion_model = TRACKING_DISTORTION_MODEL_BROWN; + camera->brown_k1 = camera_intrinsics_options->brown_k1; + camera->brown_k2 = camera_intrinsics_options->brown_k2; + camera->brown_k3 = camera_intrinsics_options->brown_k3; + camera->brown_k4 = camera_intrinsics_options->brown_k4; + camera->brown_p1 = camera_intrinsics_options->brown_p1; + camera->brown_p2 = camera_intrinsics_options->brown_p2; + return; } /* Libmv returned distortion model which is not known to Blender. This is a logical error in code diff --git a/source/blender/makesdna/DNA_tracking_types.h b/source/blender/makesdna/DNA_tracking_types.h index 4cd9034a83b..f361f96e633 100644 --- a/source/blender/makesdna/DNA_tracking_types.h +++ b/source/blender/makesdna/DNA_tracking_types.h @@ -72,6 +72,12 @@ typedef struct MovieTrackingCamera { /* Nuke distortion model coefficients */ float nuke_k1, nuke_k2; + + /* Brown-Conrady distortion model coefficients */ + /** Brown-Conrady radial distortion **/ + float brown_k1, brown_k2, brown_k3, brown_k4; + /** Brown-Conrady tangential distortion **/ + float brown_p1, brown_p2; } MovieTrackingCamera; typedef struct MovieTrackingMarker { @@ -458,6 +464,7 @@ enum { TRACKING_DISTORTION_MODEL_POLYNOMIAL = 0, TRACKING_DISTORTION_MODEL_DIVISION = 1, TRACKING_DISTORTION_MODEL_NUKE = 2, + TRACKING_DISTORTION_MODEL_BROWN = 3, }; /* MovieTrackingCamera->units */ diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c index 1470879177e..dd0a2e7d873 100644 --- a/source/blender/makesrna/intern/rna_tracking.c +++ b/source/blender/makesrna/intern/rna_tracking.c @@ -1148,6 +1148,7 @@ static void rna_def_trackingCamera(BlenderRNA *brna) "Division distortion model which " "better represents wide-angle cameras"}, {TRACKING_DISTORTION_MODEL_NUKE, "NUKE", 0, "Nuke", "Nuke distortion model"}, + {TRACKING_DISTORTION_MODEL_BROWN, "BROWN", 0, "Brown", "Brown-Conrady distortion model"}, {0, NULL, 0, NULL, NULL}, }; @@ -1263,6 +1264,50 @@ static void rna_def_trackingCamera(BlenderRNA *brna) RNA_def_property_ui_text(prop, "K2", "Second coefficient of second order Nuke distortion"); RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, "rna_tracking_flushUpdate"); + /* Brown-Conrady distortion parameters */ + prop = RNA_def_property(srna, "brown_k1", PROP_FLOAT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_range(prop, -10, 10, 0.1, 3); + RNA_def_property_ui_text( + prop, "K1", "First coefficient of fourth order Brown-Conrady radial distortion"); + RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, "rna_tracking_flushUpdate"); + + prop = RNA_def_property(srna, "brown_k2", PROP_FLOAT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_range(prop, -10, 10, 0.1, 3); + RNA_def_property_ui_text( + prop, "K2", "Second coefficient of fourth order Brown-Conrady radial distortion"); + RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, "rna_tracking_flushUpdate"); + + prop = RNA_def_property(srna, "brown_k3", PROP_FLOAT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_range(prop, -10, 10, 0.1, 3); + RNA_def_property_ui_text( + prop, "K3", "Third coefficient of fourth order Brown-Conrady radial distortion"); + RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, "rna_tracking_flushUpdate"); + + prop = RNA_def_property(srna, "brown_k4", PROP_FLOAT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_range(prop, -10, 10, 0.1, 3); + RNA_def_property_ui_text( + prop, "K4", "Fourth coefficient of fourth order Brown-Conrady radial distortion"); + RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, "rna_tracking_flushUpdate"); + + prop = RNA_def_property(srna, "brown_p1", PROP_FLOAT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_range(prop, -10, 10, 0.1, 3); + RNA_def_property_ui_text( + prop, "P1", "First coefficient of second order Brown-Conrady tangential distortion"); + RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, "rna_tracking_flushUpdate"); + + prop = RNA_def_property(srna, "brown_p2", PROP_FLOAT, PROP_NONE); + RNA_def_property_clear_flag(prop, PROP_ANIMATABLE); + RNA_def_property_ui_range(prop, -10, 10, 0.1, 3); + RNA_def_property_ui_text( + prop, "P2", "Second coefficient of second order Brown-Conrady tangential distortion"); + RNA_def_property_update(prop, NC_MOVIECLIP | NA_EDITED, "rna_tracking_flushUpdate"); + + /* pixel aspect */ prop = RNA_def_property(srna, "pixel_aspect", PROP_FLOAT, PROP_XYZ); RNA_def_property_float_sdna(prop, NULL, "pixel_aspect"); |