##-***************************************************************************** ## ## Copyright (c) 2009-2011, ## Sony Pictures Imageworks, Inc. and ## Industrial Light & Magic, a division of Lucasfilm Entertainment Company Ltd. ## ## All rights reserved. ## ## Redistribution and use in source and binary forms, with or without ## modification, are permitted provided that the following conditions are ## met: ## * Redistributions of source code must retain the above copyright ## notice, this list of conditions and the following disclaimer. ## * Redistributions in binary form must reproduce the above ## copyright notice, this list of conditions and the following disclaimer ## in the documentation and/or other materials provided with the ## distribution. ## * Neither the name of Sony Pictures Imageworks, nor ## Industrial Light & Magic nor the names of their contributors may be used ## to endorse or promote products derived from this software without specific ## prior written permission. ## ## THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ## "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT ## LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR ## A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT ## OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ## SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT ## LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, ## DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY ## THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT ## (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ## OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. ## ##-***************************************************************************** from maya import cmds as MayaCmds import maya.OpenMaya as OpenMaya import unittest import util import os class interpolationTest(unittest.TestCase): def setUp(self): MayaCmds.file(new=True, force=True) self.__files = [] def tearDown(self): for f in self.__files: os.remove(f) def testSubD(self): trans = MayaCmds.polyPlane(n='plane', sx=1, sy=1, ch=False)[0] shape = MayaCmds.pickWalk(d='down')[0] MayaCmds.addAttr(attributeType='bool', defaultValue=1, keyable=True, longName='SubDivisionMesh') MayaCmds.select(trans+'.vtx[0:3]', r=True) MayaCmds.move(0, 1, 0, r=True) MayaCmds.currentTime(1, update=True) MayaCmds.setKeyframe() MayaCmds.currentTime(2, update=True) MayaCmds.move(0, 5, 0, r=True) MayaCmds.setKeyframe() self.__files.append(util.expandFileName('testSubDInterpolation.abc')) MayaCmds.AbcExport(j='-fr 1 2 -root %s -file %s' % (trans, self.__files[-1])) MayaCmds.AbcImport(self.__files[-1], mode='open') MayaCmds.currentTime(1.004, update=True) ty = MayaCmds.getAttr(shape+'.vt[0]')[0][1] self.failUnlessAlmostEqual(1.02, ty) setTime = MayaCmds.currentTime(1.422, update=True) alpha = (setTime - 1) / (2 - 1) ty = MayaCmds.getAttr(shape+'.vt[0]')[0][1] self.failUnlessAlmostEqual(ty, (1-alpha)*1.0+alpha*6.0, 3) def testPoly(self): trans = MayaCmds.polyPlane(n='plane', sx=1, sy=1, ch=False)[0] shape = MayaCmds.pickWalk(d='down')[0] MayaCmds.select(trans+'.vtx[0:3]', r=True) MayaCmds.move(0, 1, 0, r=True) MayaCmds.currentTime(1, update=True) MayaCmds.setKeyframe() MayaCmds.currentTime(2, update=True) MayaCmds.move(0, 5, 0, r=True) MayaCmds.setKeyframe() self.__files.append(util.expandFileName('testPolyInterpolation.abc')) MayaCmds.AbcExport(j='-fr 1 2 -root %s -file %s' % (trans, self.__files[-1])) MayaCmds.AbcImport(self.__files[-1], mode='open') MayaCmds.currentTime(1.004, update=True) ty = MayaCmds.getAttr(shape+'.vt[0]')[0][1] self.failUnlessAlmostEqual(1.02, ty) setTime = MayaCmds.currentTime(1.422, update=True) alpha = (setTime - 1) / (2 - 1) ty = MayaCmds.getAttr(shape+'.vt[0]')[0][1] self.failUnlessAlmostEqual(ty, (1-alpha)*1.0+alpha*6.0, 3) def testTransOp(self): nodeName = MayaCmds.createNode('transform', n='test') # shear MayaCmds.setKeyframe(nodeName, value=0, attribute='shearXY', t=1) MayaCmds.setKeyframe(nodeName, value=0, attribute='shearYZ', t=1) MayaCmds.setKeyframe(nodeName, value=0, attribute='shearXZ', t=1) MayaCmds.setKeyframe(nodeName, value=1.5, attribute='shearXY', t=2) MayaCmds.setKeyframe(nodeName, value=5, attribute='shearYZ', t=2) MayaCmds.setKeyframe(nodeName, value=2.5, attribute='shearXZ', t=2) # translate MayaCmds.setKeyframe('test', value=0, attribute='translateX', t=1) MayaCmds.setKeyframe('test', value=0, attribute='translateY', t=1) MayaCmds.setKeyframe('test', value=0, attribute='translateZ', t=1) MayaCmds.setKeyframe('test', value=1.5, attribute='translateX', t=2) MayaCmds.setKeyframe('test', value=5, attribute='translateY', t=2) MayaCmds.setKeyframe('test', value=2.5, attribute='translateZ', t=2) # rotate MayaCmds.setKeyframe('test', value=0, attribute='rotateX', t=1) MayaCmds.setKeyframe('test', value=0, attribute='rotateY', t=1) MayaCmds.setKeyframe('test', value=0, attribute='rotateZ', t=1) MayaCmds.setKeyframe('test', value=24, attribute='rotateX', t=2) MayaCmds.setKeyframe('test', value=53, attribute='rotateY', t=2) MayaCmds.setKeyframe('test', value=90, attribute='rotateZ', t=2) # scale MayaCmds.setKeyframe('test', value=1, attribute='scaleX', t=1) MayaCmds.setKeyframe('test', value=1, attribute='scaleY', t=1) MayaCmds.setKeyframe('test', value=1, attribute='scaleZ', t=1) MayaCmds.setKeyframe('test', value=1.2, attribute='scaleX', t=2) MayaCmds.setKeyframe('test', value=1.5, attribute='scaleY', t=2) MayaCmds.setKeyframe('test', value=1.5, attribute='scaleZ', t=2) # rotate pivot MayaCmds.setKeyframe('test', value=0.5, attribute='rotatePivotX', t=1) MayaCmds.setKeyframe('test', value=-0.1, attribute='rotatePivotY', t=1) MayaCmds.setKeyframe('test', value=1, attribute='rotatePivotZ', t=1) MayaCmds.setKeyframe('test', value=0.8, attribute='rotatePivotX', t=2) MayaCmds.setKeyframe('test', value=1.5, attribute='rotatePivotY', t=2) MayaCmds.setKeyframe('test', value=-1, attribute='rotatePivotZ', t=2) # scale pivot MayaCmds.setKeyframe('test', value=1.2, attribute='scalePivotX', t=1) MayaCmds.setKeyframe('test', value=1.0, attribute='scalePivotY', t=1) MayaCmds.setKeyframe('test', value=1.2, attribute='scalePivotZ', t=1) MayaCmds.setKeyframe('test', value=1.4, attribute='scalePivotX', t=2) MayaCmds.setKeyframe('test', value=1.5, attribute='scalePivotY', t=2) MayaCmds.setKeyframe('test', value=1.5, attribute='scalePivotZ', t=2) self.__files.append(util.expandFileName('testTransOpInterpolation.abc')) MayaCmds.AbcExport(j='-fr 1 2 -root %s -f %s' % (nodeName, self.__files[-1])) MayaCmds.AbcImport(self.__files[-1], mode='open') MayaCmds.currentTime(1.004, update=True) # should read the content of frame #1 self.failUnlessAlmostEqual(0.006, MayaCmds.getAttr('test.shearXY')) self.failUnlessAlmostEqual(0.02, MayaCmds.getAttr('test.shearYZ')) self.failUnlessAlmostEqual(0.01, MayaCmds.getAttr('test.shearXZ')) self.failUnlessAlmostEqual(0.006, MayaCmds.getAttr('test.translateX')) self.failUnlessAlmostEqual(0.02, MayaCmds.getAttr('test.translateY')) self.failUnlessAlmostEqual(0.01, MayaCmds.getAttr('test.translateZ')) self.failUnlessAlmostEqual(0.096, MayaCmds.getAttr('test.rotateX')) self.failUnlessAlmostEqual(0.212, MayaCmds.getAttr('test.rotateY')) self.failUnlessAlmostEqual(0.36, MayaCmds.getAttr('test.rotateZ')) self.failUnlessAlmostEqual(1.0008, MayaCmds.getAttr('test.scaleX')) self.failUnlessAlmostEqual(1.002, MayaCmds.getAttr('test.scaleY')) self.failUnlessAlmostEqual(1.002, MayaCmds.getAttr('test.scaleZ')) self.failUnlessAlmostEqual(0.5012, MayaCmds.getAttr('test.rotatePivotX')) self.failUnlessAlmostEqual(-0.0936, MayaCmds.getAttr('test.rotatePivotY')) self.failUnlessAlmostEqual(0.992, MayaCmds.getAttr('test.rotatePivotZ')) self.failUnlessAlmostEqual(1.2008, MayaCmds.getAttr('test.scalePivotX')) self.failUnlessAlmostEqual(1.002, MayaCmds.getAttr('test.scalePivotY')) self.failUnlessAlmostEqual(1.2012, MayaCmds.getAttr('test.scalePivotZ')) setTime = MayaCmds.currentTime(1.422, update=True) alpha = (setTime - 1) / (2 - 1) # should interpolate the content of frame #3 and frame #4 self.failUnlessAlmostEqual(MayaCmds.getAttr('test.shearXY'), (1-alpha)*0+alpha*1.5) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.shearYZ'), (1-alpha)*0+alpha*5.0) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.shearXZ'), (1-alpha)*0+alpha*2.5) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.translateX'), (1-alpha)*0+alpha*1.5) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.translateY'), (1-alpha)*0+alpha*5.0) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.translateZ'), (1-alpha)*0+alpha*2.5) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.rotateX'), (1-alpha)*0+alpha*24) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.rotateY'), (1-alpha)*0+alpha*53) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.rotateZ'), (1-alpha)*0+alpha*90) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.scaleX'), (1-alpha)*1+alpha*1.2) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.scaleY'), (1-alpha)*1+alpha*1.5) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.scaleZ'), (1-alpha)*1+alpha*1.5) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.rotatePivotX'), (1-alpha)*0.5+alpha*0.8) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.rotatePivotY'), (1-alpha)*(-0.1)+alpha*1.5) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.rotatePivotZ'), (1-alpha)*1.0+alpha*(-1.0)) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.scalePivotX'), (1-alpha)*1.2+alpha*1.4) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.scalePivotY'), (1-alpha)*1.0+alpha*1.5) self.failUnlessAlmostEqual(MayaCmds.getAttr('test.scalePivotZ'), (1-alpha)*1.2+alpha*1.5) def testCamera(self): # create an animated camera and write out name = MayaCmds.camera() MayaCmds.setAttr(name[1]+'.horizontalFilmAperture', 0.962) MayaCmds.setAttr(name[1]+'.verticalFilmAperture', 0.731) MayaCmds.setAttr(name[1]+'.focalLength', 50) MayaCmds.setAttr(name[1]+'.focusDistance', 5) MayaCmds.setAttr(name[1]+'.shutterAngle', 144) # animate the camera MayaCmds.currentTime(1, update=True) MayaCmds.setKeyframe(name[1], attribute='horizontalFilmAperture') MayaCmds.setKeyframe(name[1], attribute='focalLength') MayaCmds.setKeyframe(name[1], attribute='focusDistance') MayaCmds.setKeyframe(name[1], attribute='shutterAngle') MayaCmds.currentTime(6, update=True) MayaCmds.setKeyframe(name[1], attribute='horizontalFilmAperture', value=0.95) MayaCmds.setKeyframe(name[1], attribute='focalLength', value=40) MayaCmds.setKeyframe(name[1], attribute='focusDistance', value=5.4) MayaCmds.setKeyframe(name[1], attribute='shutterAngle', value=174.94) self.__files.append(util.expandFileName('testCameraInterpolation.abc')) MayaCmds.AbcExport(j='-fr 1 6 -root %s -f %s' % (name[0], self.__files[-1])) MayaCmds.AbcImport(self.__files[-1], mode='import') camList = MayaCmds.ls(type='camera') t = 1.004 MayaCmds.currentTime(t, update=True) self.failUnlessAlmostEqual(MayaCmds.getAttr(camList[0]+'.horizontalFilmAperture'), 0.962, 3) setTime = MayaCmds.currentTime(1.422, update=True) alpha = (setTime - 1) / (2 - 1) if not util.compareCamera(camList[0], camList[1]): self.fail('%s and %s are not the same at frame %d' % (camList[0], camList[1], t)) def testProp(self): trans = MayaCmds.createNode("transform") # create animated props MayaCmds.select(trans) MayaCmds.addAttr(longName='SPT_int8', dv=0, attributeType='byte', keyable=True) MayaCmds.addAttr(longName='SPT_int16', dv=0, attributeType='short', keyable=True) MayaCmds.addAttr(longName='SPT_int32', dv=0, attributeType='long', keyable=True) MayaCmds.addAttr(longName='SPT_float', dv=0, attributeType='float', keyable=True) MayaCmds.addAttr(longName='SPT_double', dv=0, attributeType='double', keyable=True) MayaCmds.setKeyframe(trans, value=0, attribute='SPT_int8', t=1) MayaCmds.setKeyframe(trans, value=100, attribute='SPT_int16', t=1) MayaCmds.setKeyframe(trans, value=1000, attribute='SPT_int32', t=1) MayaCmds.setKeyframe(trans, value=0.57777777, attribute='SPT_float', t=1) MayaCmds.setKeyframe(trans, value=5.045643545457, attribute='SPT_double', t=1) MayaCmds.setKeyframe(trans, value=8, attribute='SPT_int8', t=2) MayaCmds.setKeyframe(trans, value=16, attribute='SPT_int16', t=2) MayaCmds.setKeyframe(trans, value=32, attribute='SPT_int32', t=2) MayaCmds.setKeyframe(trans, value=3.141592654, attribute='SPT_float', t=2) MayaCmds.setKeyframe(trans, value=3.141592654, attribute='SPT_double', t=2) self.__files.append(util.expandFileName('testPropInterpolation.abc')) MayaCmds.AbcExport(j='-fr 1 2 -atp SPT_ -root %s -f %s' % (trans, self.__files[-1])) MayaCmds.AbcImport(self.__files[-1], mode='open') t = 1.004 MayaCmds.currentTime(t, update=True) self.failUnlessEqual(MayaCmds.getAttr(trans+'.SPT_int8'), 0) self.failUnlessEqual(MayaCmds.getAttr(trans+'.SPT_int16'), 99) self.failUnlessEqual(MayaCmds.getAttr(trans+'.SPT_int32'), 996) self.failUnlessAlmostEqual(MayaCmds.getAttr(trans+'.SPT_float'), 0.5880330295359999, 7) self.failUnlessAlmostEqual(MayaCmds.getAttr(trans+'.SPT_double'), 5.038027341891171, 7) setTime = MayaCmds.currentTime(1.422, update=True) alpha = (setTime - 1) / (2 - 1) self.failUnlessAlmostEqual(MayaCmds.getAttr(trans+'.SPT_int8'), (1-alpha)*0+alpha*8, -1) self.failUnlessAlmostEqual(MayaCmds.getAttr(trans+'.SPT_int16'), (1-alpha)*100+alpha*16, -1) self.failUnlessAlmostEqual(MayaCmds.getAttr(trans+'.SPT_int32'), (1-alpha)*1000+alpha*32, -1) self.failUnlessAlmostEqual(MayaCmds.getAttr(trans+'.SPT_float'), (1-alpha)*0.57777777+alpha*3.141592654, 6) self.failUnlessAlmostEqual(MayaCmds.getAttr(trans+'.SPT_double'), (1-alpha)* 5.045643545457+alpha*3.141592654, 6)