Created
November 7, 2018 06:01
-
-
Save howiemnet/a3d7b9f283c9227f7fa2f355db89a5cf to your computer and use it in GitHub Desktop.
Houdini to AE camera animation clipboard exporter (now with Zoom! Woo!)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# Houdini to After Effects camera animation exporter | |
# This version: 7/11/2018, by Howard Matthews - [email protected] | |
# Copyright: CC-0 - use and abuse. Please pass on the knowledge. | |
# Note: there's no error-checking in this script, but it alters nothing within the Houdini scene, so it'll just | |
# fail with an error if you try running it without a camera selected. No harm done. | |
import hou | |
theNodes = hou.selectedNodes() | |
# 1. Put this code on a new button on a shelf in Houdini. | |
# 2. Select a camera (or camera switcher) and press the button. | |
# This script generates keyframe data for Position / Orientation / Zoom and copies it the system clipboard. | |
# | |
# ** IMPORTANT NOTE ** | |
# In an ideal world, you could run this script, go to AE, create a camera, and hit Ctrl/Cmd-V and the animation data | |
# would be pasted straight in. HOWEVER, for some reason, Houdini's Python interpreter and Adobe's clipboard handler | |
# don't play nicely together. So there's an important additional step (at least on macOS - haven't tested on other OSs) | |
# | |
# 3. Open an empty text document, or a Stickies document - anywhere you can cut and paste text | |
# 4. Hit Paste [Cmd-V] | |
# 5. Select all text, and hit Copy [Cmd-A, Cmd-C] | |
# | |
# 6. Go to AE, first frame of your sequence, create a camera (if you haven't already), select it and hit Paste [Cmd-V]. | |
# The camera animation data should now appear correctly in AE. | |
# | |
# 7. If your AE camera isn't matching up with what you've rendered in Houdini, check the AE camera is set up the same way: | |
# Go to the Camera settings in AE (select the camera, hit Shift-Cmd-Y) and check the resolution and the "film size" parameters. | |
# Houdini calls the film size "Aperture", just to be confusing. It's typically 41.4214mm. In AE's camera settings dialog, check | |
# that Units is set to millimetres, and Measure Film Size is set to Horizontally, then set the film size to whatever Houdini's | |
# Aperture setting is. | |
# | |
# 8. Send nudes. | |
h = theNodes[0] | |
startFrame = int(hou.playbar.playbackRange()[0]) | |
endFrame = int(hou.playbar.playbackRange()[1]) | |
scale = 100.0 | |
myOutputString = "Adobe After Effects 8.0 Keyframe Data\n\n" | |
myOutputString = myOutputString + "\tUnits Per Second\t25\n" | |
myOutputString = myOutputString + "\tSource Width\t1920\n" | |
myOutputString = myOutputString + "\tSource Height\t1080\n" | |
myOutputString = myOutputString + "\tSource Pixel Aspect Ratio\t1\n" | |
myOutputString = myOutputString + "\tComp Pixel Aspect Ratio\t1\n" | |
# do the orientation: | |
myOutputString = myOutputString + "\nTransform\tOrientation\n" | |
myOutputString = myOutputString + "\tFrame\tX degrees\t\n" | |
for theFrame in range (startFrame,endFrame+1): | |
x = h.worldTransformAtTime(hou.frameToTime(theFrame)) | |
xform = x.extractRotates('srt','zyx',hou.Vector3()) | |
myOutputString = myOutputString + "\t"+str(theFrame)+"\t"+str(xform[0])+"\t"+str(-xform[1])+"\t"+str(-xform[2])+"\n" | |
# do the positions: | |
myOutputString = myOutputString + "\nTransform\tPosition\n" | |
myOutputString = myOutputString + "\tFrame\tX pixels\tY pixels\tZ pixels\n" | |
for theFrame in range (startFrame,endFrame+1): | |
x = h.worldTransformAtTime(hou.frameToTime(theFrame)) | |
xform = x.extractTranslates('srt') | |
myOutputString = myOutputString + "\t"+str(theFrame)+"\t"+str(xform[0]*scale)+"\t"+str(-xform[1]*scale)+"\t"+str(-xform[2]*scale)+"\n" | |
# do the zoom: | |
myOutputString = myOutputString + "\nCamera Options\tZoom\n" | |
myOutputString = myOutputString + "\tFrame\tpixels\n" | |
for theFrame in range (startFrame,endFrame+1): | |
foc = h.parm("focal").evalAsFloatAtFrame(theFrame) | |
ape = h.parm("aperture").evalAsFloatAtFrame(theFrame) | |
wid = h.parm("resx").evalAsIntAtFrame(theFrame) | |
# After Effects uses zoom, rather than focal length: | |
zoom = (foc * wid) / ape | |
myOutputString = myOutputString + "\t"+str(theFrame)+"\t"+str(zoom)+"\n" | |
myOutputString = myOutputString + "\n\nEnd of Keyframe Data\n" | |
hou.ui.copyTextToClipboard(myOutputString) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment