Page MenuHome

Camera_Tracking_(.ma)_248.py

Camera_Tracking_(.ma)_248.py

#!BPY
# """
# Name: '_Camera Tracking (.ma)_248'
# Blender: 240
# Group: 'Animation'
# Tip: 'Export camera tracking to Maya Ascii (for Shake, After Effects etc)'
# """
__author__ = "videocopiolot "
__url__ = "http://wiki.blender.org/index.php/Scripts/Manual/Animation/Camera_Tracking"
__version__ = "0.1"
__bpydoc__ = """ Camera Tracking (.ma)
This script will export Blender's camera to After Effects or Maya.
"""
# --------------------------------------------------------------------------
# Camera Tracking (.ma) by videocopiolot
# --------------------------------------------------------------------------
# ***** BEGIN GPL LICENSE BLOCK *****
#
# This program is free software; you can redistribute it and/or
# modify it under the terms of the GNU General Public License
# as published by the Free Software Foundation; either version 2
# of the License, or (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software Foundation,
# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#
# ***** END GPL LICENCE BLOCK *****
# --------------------------------------------------------------------------
import Blender
from Tkinter import *
import tkFileDialog
import time
from Blender.Window import DrawProgressBar
def saveDialog():
root = Tk()
root.withdraw()
try: root.tk.call('console','hide')
except: pass
fname = tkFileDialog.asksaveasfilename()
root.destroy()
return fname
def exportTracking(mafilename):
t = {}
t['header'] = []
t['header'].append('//Maya ASCII scene\n//Name: camera.ma\n//Last modified: %s\n' %time.strftime('%X %d/%m/%y'))
t['header'].append('currentUnit -l centimeter -a degree -t film;\n')
oframe = Blender.Get('curframe')
scene = Blender.Scene.GetCurrent()
obj = scene.getCurrentCamera()
camera = Blender.Camera.Get()[0]
matrix = obj.matrix
t['header'].append('createNode transform -n "%s";\n' %obj.name)
t['header'].append('\tsetAttr ".t" -type "double3" 0 0 0 ;\n')
t['header'].append('\tsetAttr -av ".tx";\n')
t['header'].append('\tsetAttr -av ".ty";\n')
t['header'].append('\tsetAttr -av ".tz";\n')
t['header'].append('\tsetAttr ".r" -type "double3" 0 0 0 ;\n')
t['header'].append('\tsetAttr -av ".rx";\n')
t['header'].append('\tsetAttr -av ".ry";\n')
t['header'].append('createNode camera -n "camera" -p "%s";\n' %obj.name)
t['header'].append('\tsetAttr -k off ".v";\n')
t['header'].append('\tsetAttr ".rnd" no;\n')
scene = Blender.Scene.GetCurrent()
context = scene.getRenderingContext()
yRes = context.imageSizeY()
xRes = context.imageSizeX()
aspX = context.aspectX
aspY = context.aspectY
aspect = xRes*aspX / float(yRes*aspY)
# if aspect > 1: x is constant, otherwise y constant
# constant comes from fov equations: fov = 2 * atan(aspect * 16.0 / camera.lens), aperturey = tan(fov/2)*camera.lens*2/25.4
# tracking seems to work better using 1.25, change as needed
#c = 16.0*2/25.4
c = 1.25
aperturex = min(c,c*aspect)
aperturey = min(c,c/aspect)
t['header'].append('\tsetAttr ".cap" -type "double2" %s %s ;\n' %(aperturex,aperturey))
t['header'].append('\tsetAttr ".dar" %s;\n' %aspect)
t['header'].append('\tsetAttr ".lsr" 1;\n') # lens squeeze ratio
t['header'].append('\tsetAttr ".ff" 0;\n')
t['header'].append('\tsetAttr ".fl" %s;\n' %camera.lens) # focal length
t['header'].append('\tsetAttr ".ncp" 0.01;\n')
t['header'].append('\tsetAttr ".ow" 30;\n')
t['header'].append('\tsetAttr ".imn" -type "string" "camera1";\n')
t['header'].append('\tsetAttr ".den" -type "string" "camera1_depth";\n')
t['header'].append('\tsetAttr ".man" -type "string" "camera1_mask";\n')
for p in ['translateX','translateY','translateZ','rotateX','rotateY','rotateZ']:
t[p] = []
t[p].append('createNode animCurveTL -n "%s_%s";\n' %(obj.name,p))
t[p].append('\tsetAttr ".tan" 10;\n')
t[p].append('\tsetAttr ".wgt" no;\n')
t[p].append('\tsetAttr -s 4 ".ktv[0:3]" ')
DrawProgressBar (0, "starting...")
for frame in xrange(Blender.Get('staframe'),Blender.Get('endframe')+1):
Blender.Set('curframe', frame)
frames = Blender.Get('endframe')+1-Blender.Get('staframe')
pc = (frame + Blender.Get('staframe') - 1)/float(frames)
DrawProgressBar (pc, "frame %s" %str(frame))
x = matrix.translationPart().x
t['translateX'].append('%s %s ' %(frame,x))
y = matrix.translationPart().y
t['translateY'].append('%s %s ' %(frame,y))
z = matrix.translationPart().z
t['translateZ'].append('%s %s ' %(frame,z))
rx = matrix.toEuler().x
t['rotateX'].append('%s %s ' %(frame,rx))
ry = matrix.toEuler().y
t['rotateY'].append('%s %s ' %(frame,ry))
rz = matrix.toEuler().z
t['rotateZ'].append('%s %s ' %(frame,rz))
t['footer'] = []
t['footer'].append('connectAttr "%s_translateX.o" "%s.tx";\n' %(obj.name,obj.name))
t['footer'].append('connectAttr "%s_translateY.o" "%s.ty";\n' %(obj.name,obj.name))
t['footer'].append('connectAttr "%s_translateZ.o" "%s.tz";\n' %(obj.name,obj.name))
t['footer'].append('connectAttr "%s_rotateX.o" "%s.rx";\n' %(obj.name,obj.name))
t['footer'].append('connectAttr "%s_rotateY.o" "%s.ry";\n' %(obj.name,obj.name))
t['footer'].append('connectAttr "%s_rotateZ.o" "%s.rz";\n' %(obj.name,obj.name))
t['footer'].append('connectAttr "%s_scaleX.o" "%s.sx";\n' %(obj.name,obj.name))
t['footer'].append('connectAttr "%s_scaleY.o" "%s.sy";\n' %(obj.name,obj.name))
t['footer'].append('connectAttr "%s_scaleZ.o" "%s.sz";\n' %(obj.name,obj.name))
t['footer'].append('\n// End of camera.ma\n')
if not mafilename.endswith('.ma'):
mafilename += '.ma'
mafile = open(mafilename, 'w')
for line in t['header']:
mafile.write(line)
for p in ['translateX','translateY','translateZ','rotateX','rotateY','rotateZ']:
for line in t[p]:
mafile.write(line)
mafile.write(';\n')
for line in t['footer']:
mafile.write(line)
Blender.Set('curframe', oframe) # reset frame back to where it was
mafilename = saveDialog()
if(mafilename != ''): exportTracking(mafilename)

File Metadata

Mime Type
text/x-python
Storage Engine
local-disk
Storage Format
Raw Data
Storage Handle
1f/05/3346ca2063833278a664723230da

Event Timeline