def testFilmOffset(self): for x in [-0.5, -0.25, 0, 0.25, 0.5]: maya.cmds.setAttr("perspShape.horizontalFilmOffset", x) self.assertNotAlmostEqual( maya.cmds.getAttr("frontShape.horizontalFilmOffset"), maya.cmds.getAttr("perspShape.horizontalFilmOffset")) for y in [-0.5, -0.25, 0, 0.25, 0.5]: maya.cmds.setAttr("perspShape.verticalFilmOffset", y) self.assertNotAlmostEqual( maya.cmds.getAttr("frontShape.verticalFilmOffset"), maya.cmds.getAttr("perspShape.verticalFilmOffset")) front = IECoreMaya.FromMayaCameraConverter( "frontShape").convert() persp = IECoreMaya.FromMayaCameraConverter( "perspShape").convert() self.assertIECoreCamsNotEqual(front, persp) self.failUnless( IECoreMaya.ToMayaCameraConverter(persp).convert("front")) self.assertMayaCamsEqual("frontShape", "perspShape") self.assertIECoreCamAndMayaCamEqual(persp, "frontShape") newFront = IECoreMaya.FromMayaCameraConverter( "frontShape").convert() self.assertIECoreCamsEqual(persp, newFront)
def testNewCam( self ) : persp = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() parent = maya.cmds.createNode( "transform" ) self.assertTrue( IECoreMaya.ToMayaCameraConverter( persp ).convert( parent ) ) cams = maya.cmds.listRelatives( parent, children=True, fullPath=True, type="camera" ) self.assertEqual( len(cams), 1 ) self.assertMayaCamsEqual( "|persp|perspShape", cams[0] ) self.assertIECoreCamAndMayaCamEqual( persp, cams[0] ) newCam = IECoreMaya.FromMayaCameraConverter( cams[0] ).convert() self.assertEqual( persp.parameters(), newCam.parameters() )
def testCustomResolution(self): converter = IECoreMaya.FromMayaCameraConverter("perspShape") converter.parameters()["resolutionMode"].setValue("specified") converter.parameters()["resolution"].setValue("1K") camera = converter.convert() self.assertEqual(camera.getName(), "perspShape") self.assertEqual( camera.getTransform().transform(), imath.M44f(*maya.cmds.getAttr("persp.worldMatrix[0]"))) self.assertEqual(camera.parameters()["resolution"].value, imath.V2i(1024, 778)) self.assertEqual( camera.parameters()["clippingPlanes"].value, imath.V2f(maya.cmds.getAttr("perspShape.nearClipPlane"), maya.cmds.getAttr("perspShape.farClipPlane"))) self.assertEqual(camera.parameters()["projection"].value, "perspective") self.assertEqual( camera.blindData()["maya"]["aperture"].value, imath.V2f(maya.cmds.getAttr("perspShape.horizontalFilmAperture"), maya.cmds.getAttr("perspShape.verticalFilmAperture"))) sel = maya.OpenMaya.MSelectionList() sel.add("perspShape") dag = maya.OpenMaya.MDagPath() sel.getDagPath(0, dag) fn = maya.OpenMaya.MFnCamera(dag) self.assertAlmostEqual( camera.parameters()["projection:fov"].value, IECore.radiansToDegrees(fn.horizontalFieldOfView()), 5)
def testOrthographic(self): camera = IECoreMaya.FromMayaCameraConverter("topShape").convert() self.assertEqual(camera.getName(), "topShape") self.assertEqual(camera.getTransform().transform(), IECore.M44f(maya.cmds.getAttr("top.worldMatrix[0]"))) self.assertEqual( camera.parameters()["resolution"].value, IECore.V2i(maya.cmds.getAttr("defaultResolution.width"), maya.cmds.getAttr("defaultResolution.height"))) self.assertEqual( camera.parameters()["clippingPlanes"].value, IECore.V2f(maya.cmds.getAttr("topShape.nearClipPlane"), maya.cmds.getAttr("topShape.farClipPlane"))) self.assertEqual(camera.parameters()["projection"].value, "orthographic") self.assertEqual( camera.parameters()["screenWindow"].value.max.x - camera.parameters()["screenWindow"].value.min.x, maya.cmds.getAttr("topShape.orthographicWidth")) self.assertEqual( camera.blindData()["maya"]["aperture"].value, IECore.V2f(maya.cmds.getAttr("topShape.horizontalFilmAperture"), maya.cmds.getAttr("topShape.verticalFilmAperture")))
def testPerspective(self): camera = IECoreMaya.FromMayaCameraConverter("perspShape").convert() self.assertEqual(camera.getName(), "perspShape") self.assertEqual( camera.getTransform().transform(), IECore.M44f(maya.cmds.getAttr("persp.worldMatrix[0]"))) self.assertEqual( camera.parameters()["resolution"].value, IECore.V2i(maya.cmds.getAttr("defaultResolution.width"), maya.cmds.getAttr("defaultResolution.height"))) self.assertEqual( camera.parameters()["clippingPlanes"].value, IECore.V2f(maya.cmds.getAttr("perspShape.nearClipPlane"), maya.cmds.getAttr("perspShape.farClipPlane"))) self.assertEqual(camera.parameters()["projection"].value, "perspective") self.assertEqual( camera.blindData()["maya"]["aperture"].value, IECore.V2f(maya.cmds.getAttr("perspShape.horizontalFilmAperture"), maya.cmds.getAttr("perspShape.verticalFilmAperture"))) sel = maya.OpenMaya.MSelectionList() sel.add("perspShape") dag = maya.OpenMaya.MDagPath() sel.getDagPath(0, dag) fn = maya.OpenMaya.MFnCamera(dag) self.assertAlmostEqual( camera.parameters()["projection:fov"].value, IECore.radiansToDegrees(fn.horizontalFieldOfView()), 5)
def testRandomCameras( self ) : random.seed( 42 ) for i in range( 40 ): randomCamera = maya.cmds.camera()[0] cortexCamera = IECoreScene.Camera() projection = "orthographic" if random.random() > 0.5 else "perspective" cortexCamera.setProjection( projection ) cortexCamera.setAperture( imath.V2f( random.uniform( 1, 20 ), random.uniform( 1, 20 ) ) ) cortexCamera.setApertureOffset( imath.V2f( random.uniform( -10, 10 ), random.uniform( -10, 10 ) ) ) if projection != "orthographic": cortexCamera.setFocalLength( random.uniform( 2.5, 200 ) ) cortexCamera.setClippingPlanes( random.uniform( 1, 1000 ) + imath.V2f( 0, random.uniform( 1, 1000 ) ) ) cortexCamera.setFStop( random.uniform( 1, 10 ) ) cortexCamera.setFocusDistance( random.uniform( 0, 1000 ) ) if cortexCamera.getProjection() == "orthographic": # Remove settings which we know will fail on ortho cameras in Maya ( see test below ) del cortexCamera.parameters()["apertureOffset"] # Only square apertures supported cortexCamera.setAperture( imath.V2f( cortexCamera.getAperture()[0] ) ) self.assertTrue( IECoreMaya.ToMayaCameraConverter( cortexCamera ).convert( randomCamera ) ) self.assertIECoreCamAndMayaCamEqual( cortexCamera, randomCamera ) roundTrip = IECoreMaya.FromMayaCameraConverter( randomCamera ).convert() self.assertIECoreCamsAlmostEqual( cortexCamera, roundTrip ) maya.cmds.delete( randomCamera )
def testFilmOffset(self): for x in [-0.5, -0.25, 0, 0.25, 0.5]: for y in [-0.5, -0.25, 0, 0.25, 0.5]: maya.cmds.setAttr("perspShape.horizontalFilmOffset", x) maya.cmds.setAttr("perspShape.verticalFilmOffset", y) camera = IECoreMaya.FromMayaCameraConverter( "perspShape").convert() self.assertFalse(camera.hasResolution()) self.assertEqual( camera.getClippingPlanes(), imath.V2f(maya.cmds.getAttr("perspShape.nearClipPlane"), maya.cmds.getAttr("perspShape.farClipPlane"))) self.assertEqual(camera.getProjection(), "perspective") self.assertEqual( camera.getAperture(), INCH_TO_MM * imath.V2f( maya.cmds.getAttr("perspShape.horizontalFilmAperture"), maya.cmds.getAttr("perspShape.verticalFilmAperture"))) self.assertEqual( camera.getApertureOffset(), INCH_TO_MM * imath.V2f( maya.cmds.getAttr("perspShape.horizontalFilmOffset"), maya.cmds.getAttr("perspShape.verticalFilmOffset"))) self.assertIECoreCamAndMayaCamEqual(camera, "perspShape")
def testExistingCamParent( self ) : maya.cmds.setAttr( "frontShape.nearClipPlane", 1 ) maya.cmds.setAttr( "frontShape.farClipPlane", 1000 ) maya.cmds.setAttr( "frontShape.orthographicWidth", 2 ) self.assertMayaCamsNotEqual( "frontShape", "perspShape" ) front = IECoreMaya.FromMayaCameraConverter( "frontShape" ).convert() persp = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() self.assertNotEqual( front, persp ) self.assertTrue( IECoreMaya.ToMayaCameraConverter( front ).convert( "persp" ) ) self.assertMayaCamsEqual( "frontShape", "perspShape" ) self.assertIECoreCamAndMayaCamEqual( front, "perspShape" ) newPersp = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() self.assertEqual( front.parameters(), newPersp.parameters() )
def testOrthographic( self ) : camera = IECoreMaya.FromMayaCameraConverter( "topShape" ).convert() self.assertFalse( camera.hasResolution() ) self.assertEqual( camera.getClippingPlanes(), imath.V2f( maya.cmds.getAttr( "topShape.nearClipPlane" ), maya.cmds.getAttr( "topShape.farClipPlane" ) ) ) self.assertEqual( camera.getProjection(), "orthographic" ) self.assertEqual( camera.getAperture(), imath.V2f( maya.cmds.getAttr( "topShape.orthographicWidth" ) ) ) self.assertIECoreCamAndMayaCamEqual( camera, "topShape" )
def testExistingCamParent( self ) : maya.cmds.setAttr( "frontShape.nearClipPlane", 1 ) maya.cmds.setAttr( "frontShape.farClipPlane", 1000 ) maya.cmds.setAttr( "frontShape.horizontalFilmAperture", 2 ) maya.cmds.setAttr( "frontShape.verticalFilmAperture", 1 ) self.assertMayaCamsNotEqual( "frontShape", "perspShape" ) front = IECoreMaya.FromMayaCameraConverter( "frontShape" ).convert() persp = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() self.assertIECoreCamsNotEqual( front, persp ) self.failUnless( IECoreMaya.ToMayaCameraConverter( front ).convert( "persp" ) ) self.assertMayaCamsEqual( "frontShape", "perspShape" ) self.assertIECoreCamAndMayaCamEqual( front, "perspShape" ) newPersp = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() self.assertIECoreCamsEqual( front, newPersp )
def testPerspective( self ) : camera = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() self.assertFalse( camera.hasResolution() ) self.assertEqual( camera.getClippingPlanes(), imath.V2f( maya.cmds.getAttr( "perspShape.nearClipPlane" ), maya.cmds.getAttr( "perspShape.farClipPlane" ) ) ) self.assertEqual( camera.getProjection(), "perspective" ) self.assertEqual( camera.getAperture(), imath.V2f( maya.cmds.getAttr( "perspShape.horizontalFilmAperture" ), maya.cmds.getAttr( "perspShape.verticalFilmAperture" ) ) * INCH_TO_MM ) self.assertAlmostEqual( camera.getFocalLength(), maya.cmds.getAttr( "perspShape.focalLength" ) ) self.assertIECoreCamAndMayaCamEqual( camera, "perspShape" )
def testExistingCam( self ) : maya.cmds.setAttr( "topShape.nearClipPlane", 1 ) maya.cmds.setAttr( "topShape.farClipPlane", 1000 ) maya.cmds.setAttr( "topShape.horizontalFilmAperture", 2 ) maya.cmds.setAttr( "topShape.verticalFilmAperture", 1 ) self.assertMayaCamsNotEqual( "perspShape", "topShape" ) persp = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() top = IECoreMaya.FromMayaCameraConverter( "topShape" ).convert() self.assertIECoreCamsNotEqual( persp, top ) self.failUnless( IECoreMaya.ToMayaCameraConverter( persp ).convert( "topShape" ) ) self.assertMayaCamsEqual( "perspShape", "topShape" ) self.assertIECoreCamAndMayaCamEqual( persp, "topShape" ) newTop = IECoreMaya.FromMayaCameraConverter( "topShape" ).convert() self.assertIECoreCamsEqual( persp, newTop )
def testOverrideResolution( self ) : camera = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() self.assertFalse( camera.hasResolution() ) self.assertFalse( camera.hasFilmFit() ) self.assertFalse( camera.hasPixelAspectRatio() ) maya.cmds.addAttr( "perspShape", ln="ieCamera_overrideResolution", at="long2" ) maya.cmds.addAttr( "perspShape", ln="ieCamera_overrideResolutionX", at="long", p = "ieCamera_overrideResolution", dv = 1024 ) maya.cmds.addAttr( "perspShape", ln="ieCamera_overrideResolutionY", at="long", p = "ieCamera_overrideResolution", dv = 778 ) camera = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() self.assertTrue( camera.hasResolution() ) self.assertEqual( camera.getResolution(), imath.V2i( 1024, 778 ) ) self.assertFalse( camera.hasPixelAspectRatio() ) self.assertFalse( camera.hasFilmFit() ) maya.cmds.deleteAttr( "perspShape", attribute= "ieCamera_overrideResolution" ) maya.cmds.addAttr( "perspShape", ln= "ieCamera_overridePixelAspectRatio", at="float", dv=2.0 ) camera = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() self.assertFalse( camera.hasResolution() ) self.assertTrue( camera.hasPixelAspectRatio() ) self.assertEqual( camera.getPixelAspectRatio(), 2.0 ) self.assertFalse( camera.hasFilmFit() ) maya.cmds.deleteAttr( "perspShape", attribute= "ieCamera_overridePixelAspectRatio" ) fitModeNames = IECoreScene.Camera.FilmFit.names.keys() maya.cmds.addAttr( "perspShape", ln= "ieCamera_overrideFilmFit", at="enum", en=":".join( fitModeNames ) ) for i in range( len( fitModeNames ) ): maya.cmds.setAttr( "perspShape.ieCamera_overrideFilmFit", i ) camera = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() self.assertFalse( camera.hasResolution() ) self.assertFalse( camera.hasPixelAspectRatio() ) self.assertTrue( camera.hasFilmFit() ) self.assertEqual( camera.getFilmFit(), IECoreScene.Camera.FilmFit.names[ fitModeNames[i] ] ) maya.cmds.deleteAttr( "perspShape", attribute= "ieCamera_overrideFilmFit" ) camera = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() self.assertFalse( camera.hasResolution() ) self.assertFalse( camera.hasFilmFit() ) self.assertFalse( camera.hasPixelAspectRatio() )
def testUnrepresentable( self ) : testCamera = maya.cmds.camera()[0] cortexCamera = IECoreScene.Camera() cortexCamera.setProjection( "orthographic" ) cortexCamera.setAperture( imath.V2f( 1, 2 ) ) cortexCamera.setClippingPlanes( imath.V2f( 1, 100 ) ) self.assertTrue( IECoreMaya.ToMayaCameraConverter( cortexCamera ).convert( testCamera ) ) self.assertIECoreCamAndMayaCamEqual( cortexCamera, testCamera ) roundTrip = IECoreMaya.FromMayaCameraConverter( testCamera ).convert() self.assertIECoreCamsAlmostEqual( cortexCamera, roundTrip ) cortexCamera.setApertureOffset( imath.V2f( 3, 4 ) ) self.assertTrue( IECoreMaya.ToMayaCameraConverter( cortexCamera ).convert( testCamera ) ) self.assertIECoreCamAndMayaCamEqual( cortexCamera, testCamera ) roundTrip = IECoreMaya.FromMayaCameraConverter( testCamera ).convert() self.assertIECoreCamsAlmostEqual( cortexCamera, roundTrip ) maya.cmds.delete( testCamera )
def testWrongMayaNode( self ) : maya.cmds.polySphere( name="pSphere" ) persp = IECoreMaya.FromMayaCameraConverter( "perspShape" ).convert() converter = IECoreMaya.ToMayaCameraConverter( persp ) messageHandler = IECore.CapturingMessageHandler() with messageHandler : self.assertFalse( converter.convert( "pSphereShape" ) ) self.assertEqual( len( messageHandler.messages ), 1 ) self.assertEqual( messageHandler.messages[0].level, IECore.MessageHandler.Level.Warning ) self.assertEqual( messageHandler.messages[0].context, "ToMayaCameraConverter::doConversion" )
def testFocalLengthWorldScale( self ) : testCamera = maya.cmds.camera()[0] cortexCamera = IECoreScene.Camera() cortexCamera.setProjection( "perspective" ) cortexCamera.setAperture( imath.V2f( 36, 24 ) ) cortexCamera.setFocalLength( 35 ) cortexCamera.setClippingPlanes( imath.V2f( 1, 100 ) ) cortexCamera.setApertureOffset( imath.V2f( 0 ) ) cortexCamera.setFocusDistance( 1 ) self.assertTrue( IECoreMaya.ToMayaCameraConverter( cortexCamera ).convert( testCamera ) ) self.assertIECoreCamAndMayaCamEqual( cortexCamera, testCamera ) roundTrip = IECoreMaya.FromMayaCameraConverter( testCamera ).convert() self.assertIECoreCamsAlmostEqual( cortexCamera, roundTrip ) for scale in [ 1.0, 0.01 ]: cortexCamera.setFocalLengthWorldScale( scale ) self.assertTrue( IECoreMaya.ToMayaCameraConverter( cortexCamera ).convert( testCamera ) ) sel = maya.OpenMaya.MSelectionList() sel.add( testCamera ) dag = maya.OpenMaya.MDagPath() sel.getDagPath( 0, dag ) fn = maya.OpenMaya.MFnCamera( dag ) self.assertAlmostEqual( fn.focalLength(), cortexCamera.getFocalLength() * scale / 0.1, places = 6 ) roundTrip = IECoreMaya.FromMayaCameraConverter( testCamera ).convert() self.assertAlmostEqual( roundTrip.getFocalLength(), cortexCamera.getFocalLength() * scale / 0.1, places = 6 ) # Check that despite using different units for focalLength and aperture, we still get the # same frustum self.assertEqual( roundTrip.frustum(), cortexCamera.frustum() ) maya.cmds.delete( testCamera )
def testConstructor(self): converter = IECoreMaya.FromMayaCameraConverter("perspShape") camera = converter.convert() self.assert_(camera.isInstanceOf(IECore.Camera.staticTypeId()))
def testPixelAspectRatio(self): def verify(camera, resolution, pixelAspectRatio, expectedScreenWindow): self.assertEqual(camera.getName(), "perspShape") self.assertEqual( camera.getTransform().transform(), IECore.M44f(maya.cmds.getAttr("persp.worldMatrix[0]"))) self.assertEqual(camera.parameters()["resolution"].value, resolution) self.assertEqual( camera.parameters()["clippingPlanes"].value, IECore.V2f(maya.cmds.getAttr("perspShape.nearClipPlane"), maya.cmds.getAttr("perspShape.farClipPlane"))) self.assertEqual(camera.parameters()["projection"].value, "perspective") self.assertTrue(camera.parameters() ["screenWindow"].value.min.equalWithAbsError( expectedScreenWindow.min, 1e-6)) self.assertTrue(camera.parameters() ["screenWindow"].value.max.equalWithAbsError( expectedScreenWindow.max, 1e-6)) self.assertEqual( camera.blindData()["maya"]["aperture"].value, IECore.V2f( maya.cmds.getAttr("perspShape.horizontalFilmAperture"), maya.cmds.getAttr("perspShape.verticalFilmAperture"))) sel = maya.OpenMaya.MSelectionList() sel.add("perspShape") dag = maya.OpenMaya.MDagPath() sel.getDagPath(0, dag) fn = maya.OpenMaya.MFnCamera(dag) self.assertAlmostEqual( camera.parameters()["projection:fov"].value, IECore.radiansToDegrees(fn.horizontalFieldOfView()), 5) converter = IECoreMaya.FromMayaCameraConverter("perspShape") # from the render globals converter.parameters()["resolutionMode"].setValue("renderGlobals") # this crazy 3 step approach seem to be the only way to set # the pixel aspect ratio without altering the resolution # settings. this was essentially cribbed from Maya's # changeMayaSoftwareResolution() mel function. def setGlobalPixelAspectRatio(pixelAspectRatio): maya.cmds.setAttr( "defaultResolution.deviceAspectRatio", float(pixelAspectRatio) / (float(maya.cmds.getAttr("defaultResolution.height")) / float(maya.cmds.getAttr("defaultResolution.width")))) maya.cmds.setAttr("defaultResolution.lockDeviceAspectRatio", 0) maya.cmds.setAttr("defaultResolution.pixelAspect", pixelAspectRatio) globalRes = IECore.V2i(maya.cmds.getAttr("defaultResolution.width"), maya.cmds.getAttr("defaultResolution.height")) self.assertEqual(globalRes, IECore.V2i(960, 540)) globalScreenWindow = IECore.Box2f(IECore.V2f(-1, -0.5625), IECore.V2f(1, 0.5625)) setGlobalPixelAspectRatio(1) verify(converter.convert(), resolution=globalRes, pixelAspectRatio=1, expectedScreenWindow=globalScreenWindow) setGlobalPixelAspectRatio(2) verify(converter.convert(), resolution=globalRes, pixelAspectRatio=2, expectedScreenWindow=IECore.Box2f( globalScreenWindow.min / IECore.V2f(1, 2), globalScreenWindow.max / IECore.V2f(1, 2))) setGlobalPixelAspectRatio(3) verify(converter.convert(), resolution=globalRes, pixelAspectRatio=3, expectedScreenWindow=IECore.Box2f( globalScreenWindow.min / IECore.V2f(1, 3), globalScreenWindow.max / IECore.V2f(1, 3))) # from the parameters customRes = IECore.V2i(1024, 778) customScreenWindow = IECore.Box2f(IECore.V2f(-1, -0.759765), IECore.V2f(1, 0.759765)) converter.parameters()["resolutionMode"].setValue("specified") converter.parameters()["resolution"].setTypedValue(customRes) converter.parameters()["pixelAspectRatio"].setTypedValue(1) verify(converter.convert(), resolution=customRes, pixelAspectRatio=1, expectedScreenWindow=customScreenWindow) converter.parameters()["pixelAspectRatio"].setTypedValue(2) verify(converter.convert(), resolution=customRes, pixelAspectRatio=2, expectedScreenWindow=IECore.Box2f( customScreenWindow.min / IECore.V2f(1, 2), customScreenWindow.max / IECore.V2f(1, 2))) converter.parameters()["pixelAspectRatio"].setTypedValue(3) verify(converter.convert(), resolution=customRes, pixelAspectRatio=3, expectedScreenWindow=IECore.Box2f( customScreenWindow.min / IECore.V2f(1, 3), customScreenWindow.max / IECore.V2f(1, 3)))