diff --git a/io_export_after_effects.py b/io_export_after_effects.py index babe1f84cf845dcb57da9a5aef96581d1027dae8..a66b55a7258c5c511020bbf3c03facfc5a5d47ab 100644 --- a/io_export_after_effects.py +++ b/io_export_after_effects.py @@ -21,9 +21,9 @@ bl_info = { 'name': 'Export: Adobe After Effects (.jsx)', 'description': 'Export selected cameras, objects & bundles to Adobe After Effects CS3 and above', 'author': 'Bartek Skorupa', - 'version': (0, 56), + 'version': (0, 57), 'blender': (2, 6, 0), - 'api': 41098, + 'api': 41760, 'location': 'File > Export > Adobe After Effects (.jsx)', 'category': 'Import-Export', "warning": "", @@ -140,46 +140,59 @@ def convert_pos_rot(obj, width, height, aspect, x_rot_correction=False): # # # AE's lens is defined by "zoom" in pixels. Zoom determines focal angle or focal length. -# AE's camera's focal length is calculated basing on zoom value. # -# Known values: -# - sensor (blender's sensor is 32mm) +# ZOOM VALUE CALCULATIONS: +# +# Given values: +# - sensor width (camera.data.sensor_width) +# - sensor height (camera.data.sensor_height) +# - sensor fit (camera.data.sensor_fit) # - lens (blender's lens in mm) # - width (witdh of the composition/scene in pixels) +# - height (height of the composition/scene in pixels) +# - PAR (pixel aspect ratio) +# +# Calculations are made using sensor's size and scene/comp dimention (width or height). +# If camera.sensor_fit is set to 'AUTO' or 'HORIZONTAL' - sensor = camera.data.sensor_width, dimention = width. +# If camera.sensor_fit is set to 'VERTICAL' - sensor = camera.data.sensor_height, dimention = height # -# zoom can be calculated from simple proportions. +# zoom can be calculated using simple proportions. # # | # / | # / | -# / | w +# / | d # s |\ / | i -# e | \ / | d -# n | \ / | t -# s | / \ | h -# o | / \ | -# r |/ \ | -# \ | -# | | \ | +# e | \ / | m +# n | \ / | e +# s | / \ | n +# o | / \ | t +# r |/ \ | i +# \ | o +# | | \ | n # | | \ | # | | | # lens | zoom # -# zoom/width = lens/sensor => -# zoom = lens/sensor*width = lens*width * (1/sensor) -# sensor - sensor_width will be taken into account if version of blender supports it. If not - standard blender's 32mm will be caclulated. -# +# zoom / dimention = lens / sensor => +# zoom = lens * dimention / sensor # # above is true if square pixels are used. If not - aspect compensation is needed, so final formula is: -# zoom = lens * width * (1/sensor) * aspect +# zoom = lens * dimention / sensor * aspect # -def convert_lens(camera, width, aspect): - # wrap camera.data.sensor_width in 'try' to maintain compatibility with blender version not supporting camera.data.sensor_width - try: - sensor = camera.data.sensor_width # if camera.data.sensor_width is supported - it will be taken into account +def convert_lens(camera, width, height, aspect): + try: # wrap in "try" to preserve compatibility with older versions not supporting camera sensor size. + if camera.data.sensor_fit == 'VERTICAL': + sensor = camera.data.sensor_height + dimention = height + else: + sensor = camera.data.sensor_width + dimention = width except: - sensor = 32 # if version of blender doesn't yet support sensor_width - default blender's 32mm will be taken. - zoom = camera.data.lens * width * (1.0 / sensor) * aspect + sensor = 32 # standard blender's sensor size + dimention = width + + zoom = camera.data.lens * dimention / sensor * aspect return zoom @@ -233,7 +246,7 @@ def write_jsx_file(file, data, selection, export_bundles, comp_name, prefix): #convert cam position to AE space ae_pos_rot = convert_pos_rot(cam, data['width'], data['height'], data['aspect'], x_rot_correction=True) #convert Blender's cam zoom to AE's - zoom = convert_lens(cam, data['width'], data['aspect']) + zoom = convert_lens(cam, data['width'], data['height'], data['aspect']) #store all the value into dico js_data['cameras'][name_ae]['position'] += '[%f,%f,%f],' % (ae_pos_rot[0], ae_pos_rot[1], ae_pos_rot[2]) js_data['cameras'][name_ae]['pointOfInterest'] += '[%f,%f,%f],' % (ae_pos_rot[0], ae_pos_rot[1], ae_pos_rot[2])