Fix T42585: Mask motion blur is wrong when parented to plane track

it wasn't wrong, it wasn't implemented.
This commit is contained in:
Sergey Sharybin 2014-11-18 15:29:03 +01:00
parent 729dc98be1
commit 8e16c5294b
Notes: blender-bot 2023-02-14 09:49:34 +01:00
Referenced by issue #42585, Mask Motionblur is wrong when parented to plane track
3 changed files with 35 additions and 2 deletions

View File

@ -145,6 +145,9 @@ void BKE_tracking_plane_marker_delete(struct MovieTrackingPlaneTrack *plane_trac
struct MovieTrackingPlaneMarker *BKE_tracking_plane_marker_get(struct MovieTrackingPlaneTrack *plane_track, int framenr);
struct MovieTrackingPlaneMarker *BKE_tracking_plane_marker_get_exact(struct MovieTrackingPlaneTrack *plane_track, int framenr);
struct MovieTrackingPlaneMarker *BKE_tracking_plane_marker_ensure(struct MovieTrackingPlaneTrack *plane_track, int framenr);
void BKE_tracking_plane_marker_get_subframe_corners(struct MovieTrackingPlaneTrack *plane_track,
float framenr,
float corners[4][2]);
/* **** Object **** */
struct MovieTrackingObject *BKE_tracking_object_add(struct MovieTracking *tracking, const char *name);

View File

@ -1187,11 +1187,12 @@ void BKE_mask_point_parent_matrix_get(MaskSplinePoint *point, float ctime, float
MovieTrackingPlaneTrack *plane_track = BKE_tracking_plane_track_get_named(tracking, ob, parent->sub_parent);
if (plane_track) {
MovieTrackingPlaneMarker *plane_marker = BKE_tracking_plane_marker_get(plane_track, clip_framenr);
float corners[4][2];
float aspx, aspy;
float frame_size[2], H[3][3], mask_from_clip_matrix[3][3], mask_to_clip_matrix[3][3];
BKE_tracking_homography_between_two_quads(parent->parent_corners_orig, plane_marker->corners, H);
BKE_tracking_plane_marker_get_subframe_corners(plane_track, ctime, corners);
BKE_tracking_homography_between_two_quads(parent->parent_corners_orig, corners, H);
unit_m3(mask_from_clip_matrix);

View File

@ -1456,6 +1456,35 @@ MovieTrackingPlaneMarker *BKE_tracking_plane_marker_ensure(MovieTrackingPlaneTra
return plane_marker;
}
void BKE_tracking_plane_marker_get_subframe_corners(MovieTrackingPlaneTrack *plane_track,
float framenr,
float corners[4][2])
{
MovieTrackingPlaneMarker *marker = BKE_tracking_plane_marker_get(plane_track, (int)framenr);
MovieTrackingPlaneMarker *marker_last = plane_track->markers + (plane_track->markersnr - 1);
int i;
if (marker != marker_last) {
MovieTrackingPlaneMarker *marker_next = marker + 1;
if (marker_next->framenr == marker->framenr + 1) {
float fac = (framenr - (int) framenr) / (marker_next->framenr - marker->framenr);
for (i = 0; i < 4; ++i) {
interp_v2_v2v2(corners[i], marker->corners[i],
marker_next->corners[i], fac);
}
}
else {
for (i = 0; i < 4; ++i) {
copy_v2_v2(corners[i], marker->corners[i]);
}
}
}
else {
for (i = 0; i < 4; ++i) {
copy_v2_v2(corners[i], marker->corners[i]);
}
}
}
/*********************** Object *************************/
MovieTrackingObject *BKE_tracking_object_add(MovieTracking *tracking, const char *name)