diff options
-rw-r--r-- | release/scripts/startup/bl_operators/clip.py | 11 | ||||
-rw-r--r-- | source/blender/editors/space_view3d/drawobject.c | 4 | ||||
-rw-r--r-- | source/blender/makesrna/intern/rna_tracking.c | 69 |
3 files changed, 83 insertions, 1 deletions
diff --git a/release/scripts/startup/bl_operators/clip.py b/release/scripts/startup/bl_operators/clip.py index 5bce5645e42..72a26fd36e2 100644 --- a/release/scripts/startup/bl_operators/clip.py +++ b/release/scripts/startup/bl_operators/clip.py @@ -189,6 +189,15 @@ class CLIP_OT_bundles_to_mesh(Operator): new_verts = [] + scene = context.scene + camera = scene.camera + matrix = Matrix.Identity(4) + if camera: + reconstruction = tracking_object.reconstruction + framenr = scene.frame_current - clip.frame_start + 1 + reconstructed_matrix = reconstruction.cameras.matrix_for_frame(framenr) + matrix = camera.matrix_world * reconstructed_matrix.inverted() + mesh = bpy.data.meshes.new(name="Tracks") for track in tracking_object.tracks: if track.has_bundle: @@ -200,6 +209,8 @@ class CLIP_OT_bundles_to_mesh(Operator): ob = bpy.data.objects.new(name="Tracks", object_data=mesh) + ob.matrix_world = matrix + context.scene.objects.link(ob) return {'FINISHED'} diff --git a/source/blender/editors/space_view3d/drawobject.c b/source/blender/editors/space_view3d/drawobject.c index 9112c04b0d6..c7e6c4598fc 100644 --- a/source/blender/editors/space_view3d/drawobject.c +++ b/source/blender/editors/space_view3d/drawobject.c @@ -64,6 +64,7 @@ #include "BKE_material.h" #include "BKE_mball.h" #include "BKE_modifier.h" +#include "BKE_movieclip.h" #include "BKE_object.h" #include "BKE_paint.h" #include "BKE_particle.h" @@ -1507,8 +1508,9 @@ static void draw_viewport_object_reconstruction(Scene *scene, Base *base, View3D } else { float obmat[4][4]; + int framenr = BKE_movieclip_remap_scene_to_clip_frame(clip, scene->r.cfra); - BKE_tracking_camera_get_reconstructed_interpolate(tracking, tracking_object, scene->r.cfra, obmat); + BKE_tracking_camera_get_reconstructed_interpolate(tracking, tracking_object, framenr, obmat); invert_m4_m4(imat, obmat); glMultMatrixf(imat); diff --git a/source/blender/makesrna/intern/rna_tracking.c b/source/blender/makesrna/intern/rna_tracking.c index 289556b5862..16c2c5e2540 100644 --- a/source/blender/makesrna/intern/rna_tracking.c +++ b/source/blender/makesrna/intern/rna_tracking.c @@ -690,6 +690,45 @@ static void rna_trackingPlaneMarkers_delete_frame(MovieTrackingPlaneTrack *plane WM_main_add_notifier(NC_MOVIECLIP | NA_EDITED, NULL); } +static MovieTrackingObject *find_object_for_reconstruction(MovieTracking *tracking, + MovieTrackingReconstruction *reconstruction) +{ + MovieTrackingObject *object; + + for (object = tracking->objects.first; object; object = object->next) { + if (object->flag & TRACKING_OBJECT_CAMERA) { + if (&tracking->reconstruction == reconstruction) { + return object; + } + } + else if (&object->reconstruction == reconstruction) { + return object; + } + } + + return NULL; +} + +static MovieReconstructedCamera *rna_trackingCameras_find_frame(ID *id, MovieTrackingReconstruction *reconstruction, int framenr) +{ + MovieClip *clip = (MovieClip *) id; + MovieTracking *tracking = &clip->tracking; + MovieTrackingObject *object = find_object_for_reconstruction(tracking, reconstruction); + return BKE_tracking_camera_get_reconstructed(tracking, object, framenr); +} + +static void rna_trackingCameras_matrix_for_frame(ID *id, MovieTrackingReconstruction *reconstruction, int framenr, float matrix[16]) +{ + float mat[4][4]; + + MovieClip *clip = (MovieClip *) id; + MovieTracking *tracking = &clip->tracking; + MovieTrackingObject *object = find_object_for_reconstruction(tracking, reconstruction); + BKE_tracking_camera_get_reconstructed_interpolate(tracking, object, framenr, mat); + + memcpy(matrix, mat, sizeof(float) * 16); +} + #else static EnumPropertyItem tracker_motion_model[] = { @@ -1629,6 +1668,33 @@ static void rna_def_reconstructedCamera(BlenderRNA *brna) RNA_def_property_ui_text(prop, "Average Error", "Average error of reconstruction"); } +static void rna_def_trackingReconstructedCameras(BlenderRNA *brna) +{ + StructRNA *srna; + FunctionRNA *func; + PropertyRNA *parm; + + srna = RNA_def_struct(brna, "MovieTrackingReconstructedCameras", NULL); + RNA_def_struct_sdna(srna, "MovieTrackingReconstruction"); + RNA_def_struct_ui_text(srna, "Reconstructed Cameras", "Collection of solved cameras"); + + func = RNA_def_function(srna, "find_frame", "rna_trackingCameras_find_frame"); + RNA_def_function_flag(func, FUNC_USE_SELF_ID); + RNA_def_function_ui_description(func, "Find a reconstructed camera for a give frame number"); + RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame", "Frame number to find camera for", MINFRAME, MAXFRAME); + parm = RNA_def_pointer(func, "camera", "MovieReconstructedCamera", "", "Camera for a given frame"); + RNA_def_function_return(func, parm); + + func = RNA_def_function(srna, "matrix_for_frame", "rna_trackingCameras_matrix_for_frame"); + RNA_def_function_flag(func, FUNC_USE_SELF_ID); + RNA_def_function_ui_description(func, "Return interpolated camera matrix for a given frame"); + RNA_def_int(func, "frame", 1, MINFRAME, MAXFRAME, "Frame", "Frame number to find camera for", MINFRAME, MAXFRAME); + parm = RNA_def_float_matrix(func, "matrix", 4, 4, NULL, FLT_MIN, FLT_MAX, "Matrix", + "Interpolated camera matrix for a given frame", FLT_MIN, FLT_MAX); + RNA_def_property_flag(parm, PROP_THICK_WRAP); /* needed for string return value */ + RNA_def_function_output(func, parm); +} + static void rna_def_trackingReconstruction(BlenderRNA *brna) { StructRNA *srna; @@ -1657,6 +1723,8 @@ static void rna_def_trackingReconstruction(BlenderRNA *brna) RNA_def_property_struct_type(prop, "MovieReconstructedCamera"); RNA_def_property_collection_sdna(prop, NULL, "cameras", "camnr"); RNA_def_property_ui_text(prop, "Cameras", "Collection of solved cameras"); + RNA_def_property_srna(prop, "MovieTrackingReconstructedCameras"); + } static void rna_def_trackingTracks(BlenderRNA *brna) @@ -1915,6 +1983,7 @@ static void rna_def_tracking(BlenderRNA *brna) rna_def_trackingObjectTracks(brna); rna_def_trackingObjectPlaneTracks(brna); rna_def_trackingStabilization(brna); + rna_def_trackingReconstructedCameras(brna); rna_def_trackingReconstruction(brna); rna_def_trackingObject(brna); rna_def_trackingDopesheet(brna); |