2
|
1 import bpy
|
|
2 from mathutils import Vector
|
|
3
|
|
4 class AddTrackCornersOperator(bpy.types.Operator):
|
|
5 bl_idname = 'clip.add_track_corners'
|
|
6 bl_label = 'Add track corners'
|
|
7 bl_description = 'Create new tracks that follow the corners of the active track.'
|
|
8 bl_options = {'REGISTER', 'UNDO'}
|
|
9
|
|
10 dense_fill = bpy.props.BoolProperty(
|
|
11 name="Dense fill",
|
|
12 description='Make 8 points (corners and half-edges) instead of just 4',
|
|
13 default=False,
|
|
14 )
|
|
15
|
|
16 @classmethod
|
|
17 def _tracks(cls, context):
|
|
18 clip = context.space_data.clip
|
|
19 if clip:
|
|
20 return clip.tracking.tracks
|
|
21
|
|
22 @classmethod
|
|
23 def poll(cls, context):
|
|
24 tracks = AddTrackCornersOperator._tracks(context)
|
|
25 if tracks:
|
|
26 return tracks.active
|
|
27
|
|
28 def _new_offset_marker(self, base_marker, norm_offset, track):
|
|
29 co = base_marker.co + norm_offset
|
|
30 return track.markers.insert_frame(base_marker.frame, co=co)
|
|
31
|
|
32 def _new_track(self, tracks, name, frame):
|
|
33 # wrong: always adds to camera, even if active track was
|
|
34 # on another object
|
|
35 return tracks.new(name, frame)
|
|
36
|
|
37 def execute(self, context):
|
|
38 tracks = self._tracks(context)
|
|
39 track = tracks.active
|
|
40
|
|
41 first_frame = min(m.frame for m in track.markers)
|
|
42 for corner_index in range(4):
|
|
43 new_track = self._new_track(tracks,
|
|
44 '%s.%s' % (track.name, corner_index),
|
|
45 first_frame)
|
|
46 for marker in track.markers:
|
|
47 corner = Vector(marker.pattern_corners[corner_index])
|
|
48 self._new_offset_marker(marker, corner, new_track)
|
|
49 print("added new track %s" % new_track.name)
|
|
50 if self.dense_fill:
|
|
51 for c1, c2 in [(0, 1), (1, 2), (2, 3), (3, 0)]:
|
|
52 new_track = self._new_track(tracks,
|
|
53 '%s.%s-%s' % (track.name, c1, c2),
|
|
54 first_frame)
|
|
55 for marker in track.markers:
|
|
56 corner1 = Vector(marker.pattern_corners[c1])
|
|
57 corner2 = Vector(marker.pattern_corners[c2])
|
|
58 self._new_offset_marker(marker,
|
|
59 corner1.lerp(corner2, .5), new_track)
|
|
60 print("added new dense track %s" % new_track.name)
|
|
61
|
|
62 return {'FINISHED'}
|
|
63
|
|
64 def register():
|
|
65 bpy.utils.register_module(__name__)
|
|
66
|
|
67 def unregister():
|
|
68 bpy.utils.unregister_module(__name__)
|
|
69
|
|
70 if __name__ == '__main__':
|
|
71 register()
|
|
72
|