export anim cam 2d positionwithin bg cam
0.9.8 - feat: `Export Camera 2D Position To AE` to export 'anim cam' (or selected cam) frame center pixel coordinate within scene camera. - write txt file as after effects postion clipboard data
This commit is contained in:
+67
-23
@@ -43,40 +43,33 @@ def correct_shift(vec, cam):
|
||||
|
||||
def export_AE_objects_position_keys():
|
||||
'''Export keys as paperclip to paste in after'''
|
||||
C= bpy.context
|
||||
|
||||
scn = bpy.context.scene
|
||||
result = {}
|
||||
|
||||
for fr in range(C.scene.frame_start,C.scene.frame_end + 1):
|
||||
for fr in range(scn.frame_start,scn.frame_end + 1):
|
||||
|
||||
C.scene.frame_set(fr)
|
||||
scn.frame_set(fr)
|
||||
|
||||
for o in C.selected_objects:
|
||||
if not result.get(o.name):
|
||||
result[o.name] = []
|
||||
proj2d = world_to_camera_view(C.scene,C.scene.camera,o.matrix_world.to_translation())# + Vector((.5,.5,0))
|
||||
proj2d = world_to_camera_view(scn, scn.camera, o.matrix_world.to_translation()) # + Vector((.5,.5,0))
|
||||
|
||||
# proj2d = correct_shift(proj2d,C.scene.camera) # needed ?
|
||||
x = (proj2d[0]) * C.scene.render.resolution_x
|
||||
y = -(proj2d[1]) * C.scene.render.resolution_y + C.scene.render.resolution_y
|
||||
# proj2d = correct_shift(proj2d, scn.camera) # needed ?
|
||||
x = (proj2d[0]) * scn.render.resolution_x
|
||||
y = -(proj2d[1]) * scn.render.resolution_y + scn.render.resolution_y
|
||||
|
||||
result[o.name].append((fr,x,y))
|
||||
|
||||
for name,value in result.items():
|
||||
|
||||
prefix = 'Adobe After Effects 8.0 Keyframe Data\n\n'
|
||||
prefix += '\tUnits Per Second\t%s\n'%C.scene.render.fps
|
||||
prefix += '\tSource Width\t%s\n'%C.scene.render.resolution_x
|
||||
prefix += '\tSource Height\t%s\n'%C.scene.render.resolution_y
|
||||
prefix += '\tSource Pixel Aspect Ratio\t1\n'
|
||||
prefix += '\tComp Pixel Aspect Ratio\t1\n\n'
|
||||
prefix += 'Transform\tPosition\n'
|
||||
prefix += '\tFrame\tX pixels\tY pixels\tyZ pixels\t\n'
|
||||
|
||||
txt = fn.get_ae_keyframe_clipboard_header(scn)
|
||||
|
||||
for v in value:
|
||||
prefix += '\t%s\t%s\t%s\t\n'%(v[0],v[1],v[2])
|
||||
txt += '\t%s\t%s\t%s\t\n'%(v[0],v[1],v[2])
|
||||
|
||||
prefix += '\n\n'
|
||||
prefix += 'End of Keyframe Data\n'
|
||||
txt += '\n\nEnd of Keyframe Data\n' # keyframe txt footer
|
||||
|
||||
blend = Path(bpy.data.filepath)
|
||||
keyfile = blend.parent / 'render' / f'pos_{name}.txt'
|
||||
@@ -84,11 +77,12 @@ def export_AE_objects_position_keys():
|
||||
|
||||
print(f'exporting keys for {name}')
|
||||
with open(keyfile, 'w') as fd:
|
||||
fd.write(prefix)
|
||||
fd.write(txt)
|
||||
|
||||
|
||||
class GPEXP_OT_export_keys_to_ae(bpy.types.Operator):
|
||||
bl_idname = "gp.export_keys_to_ae"
|
||||
bl_label = "Export 2D position to AE"
|
||||
bl_label = "Export 2D Position To AE"
|
||||
bl_description = "Export selected objects positions as text file containing key paperclip for AfterEffects layers"
|
||||
bl_options = {"REGISTER"}
|
||||
|
||||
@@ -101,6 +95,53 @@ class GPEXP_OT_export_keys_to_ae(bpy.types.Operator):
|
||||
return {"FINISHED"}
|
||||
|
||||
|
||||
def export_anim_cam_position(camera=None, context=None):
|
||||
context = context or bpy.context
|
||||
scn = context.scene
|
||||
|
||||
camera = camera or bpy.data.objects.get('anim_cam')
|
||||
if not camera:
|
||||
return 'Abort: No "anim_cam" found!'
|
||||
|
||||
text = fn.get_ae_keyframe_clipboard_header(scn)
|
||||
for i in range(scn.frame_start, scn.frame_end + 1):
|
||||
scn.frame_set(i)
|
||||
center = fn.get_cam_frame_center_world(camera)
|
||||
coord = fn.get_coord_in_cam_space(scn, scn.camera, center, ae=True)
|
||||
# text += f'\t{i}\t{coord[0]}\t{coord[1]}\t\n'
|
||||
text += f' {i} {coord[0]} {coord[1]}\n'
|
||||
|
||||
text += '\n\nEnd of Keyframe Data\n' # Ae Frame ending
|
||||
|
||||
blend = Path(bpy.data.filepath)
|
||||
keyfile = blend.parent / 'render' / f'anim_cam_pos.txt'
|
||||
keyfile.parent.mkdir(parents=False, exist_ok=True)
|
||||
|
||||
print(f'Exporting anim cam positions keys at: {keyfile}')
|
||||
with open(keyfile, 'w') as fd:
|
||||
fd.write(text)
|
||||
|
||||
class GPEXP_OT_export_cam_keys_to_ae(bpy.types.Operator):
|
||||
bl_idname = "gp.export_cam_keys_to_ae"
|
||||
bl_label = "Export Camera 2D Position To AE"
|
||||
bl_description = "Export anim cam positions as text file containing key paperclip for AfterEffects layers"
|
||||
bl_options = {"REGISTER"}
|
||||
|
||||
@classmethod
|
||||
def poll(cls, context):
|
||||
return context.selected_objects
|
||||
|
||||
def execute(self, context):
|
||||
cam = None
|
||||
if context.object and context.object.type == 'CAMERA' and context.object != context.scene.camera:
|
||||
cam = context.object
|
||||
|
||||
err = export_anim_cam_position(camera=cam, context=context)
|
||||
if err:
|
||||
self.report({'ERROR'}, err)
|
||||
return {"CANCELLED"}
|
||||
return {"FINISHED"}
|
||||
|
||||
class GPEXP_OT_fix_overscan_shift(bpy.types.Operator):
|
||||
bl_idname = "gp.fix_overscan_shift"
|
||||
bl_label = "Fix Cam Shift Value With Overscan"
|
||||
@@ -196,8 +237,10 @@ class GPEXP_PT_extra_gprender_func(bpy.types.Panel):
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
layout.operator("gp.fix_overscan_shift")
|
||||
layout.operator("gp.export_keys_to_ae")
|
||||
col = layout.column()
|
||||
col.operator("gp.fix_overscan_shift")
|
||||
col.operator("gp.export_keys_to_ae")
|
||||
col.operator("gp.export_cam_keys_to_ae")
|
||||
|
||||
|
||||
|
||||
@@ -208,6 +251,7 @@ class GPEXP_PT_extra_gprender_func(bpy.types.Panel):
|
||||
|
||||
classes=(
|
||||
GPEXP_OT_export_keys_to_ae,
|
||||
GPEXP_OT_export_cam_keys_to_ae,
|
||||
GPEXP_OT_fix_overscan_shift,
|
||||
GPEXP_PT_extra_gprender_func
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user