Skip to content

Commit 30d0994

Browse files
johnhaddonmurraystevenson
authored andcommitted
USD CameraAlgo : Fix writing of animated parameters
1 parent 1c53451 commit 30d0994

3 files changed

Lines changed: 52 additions & 19 deletions

File tree

Changes

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,11 @@ Improvements
66

77
- USDScene : Added loading of ArnoldProcedural prims as Cortex ExternalProcedural objects.
88

9+
Fixes
10+
-----
11+
12+
- USDScene : Fixed writing of animated camera parameters.
13+
914
10.6.4.0 (relative to 10.6.3.1)
1015
========
1116

contrib/IECoreUSD/src/IECoreUSD/CameraAlgo.cpp

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -156,27 +156,27 @@ bool writeCamera( const IECoreScene::Camera *camera, const pxr::UsdStagePtr &sta
156156
auto usdCamera = pxr::UsdGeomCamera::Define( stage, path );
157157
if( camera->getProjection() == "orthographic" )
158158
{
159-
usdCamera.GetProjectionAttr().Set( pxr::UsdGeomTokens->orthographic );
159+
usdCamera.GetProjectionAttr().Set( pxr::UsdGeomTokens->orthographic, time );
160160

161161
// For ortho cameras, USD uses aperture units of tenths of scene units
162-
usdCamera.GetHorizontalApertureAttr().Set( 10.0f * camera->getAperture()[0] );
163-
usdCamera.GetVerticalApertureAttr().Set( 10.0f * camera->getAperture()[1] );
164-
usdCamera.GetHorizontalApertureOffsetAttr().Set( 10.0f * camera->getApertureOffset()[0] );
165-
usdCamera.GetVerticalApertureOffsetAttr().Set( 10.0f * camera->getApertureOffset()[1] );
162+
usdCamera.GetHorizontalApertureAttr().Set( 10.0f * camera->getAperture()[0], time );
163+
usdCamera.GetVerticalApertureAttr().Set( 10.0f * camera->getAperture()[1], time );
164+
usdCamera.GetHorizontalApertureOffsetAttr().Set( 10.0f * camera->getApertureOffset()[0], time );
165+
usdCamera.GetVerticalApertureOffsetAttr().Set( 10.0f * camera->getApertureOffset()[1], time );
166166
}
167167
else if( camera->getProjection() == "perspective" )
168168
{
169-
usdCamera.GetProjectionAttr().Set( pxr::UsdGeomTokens->perspective );
169+
usdCamera.GetProjectionAttr().Set( pxr::UsdGeomTokens->perspective, time );
170170

171171
// We store focalLength and aperture in arbitary units. USD uses tenths
172172
// of scene units
173173
float scale = 10.0f * camera->getFocalLengthWorldScale();
174174

175-
usdCamera.GetFocalLengthAttr().Set( camera->getFocalLength() * scale );
176-
usdCamera.GetHorizontalApertureAttr().Set( camera->getAperture()[0] * scale );
177-
usdCamera.GetVerticalApertureAttr().Set( camera->getAperture()[1] * scale );
178-
usdCamera.GetHorizontalApertureOffsetAttr().Set( camera->getApertureOffset()[0] * scale );
179-
usdCamera.GetVerticalApertureOffsetAttr().Set( camera->getApertureOffset()[1] * scale );
175+
usdCamera.GetFocalLengthAttr().Set( camera->getFocalLength() * scale, time );
176+
usdCamera.GetHorizontalApertureAttr().Set( camera->getAperture()[0] * scale, time );
177+
usdCamera.GetVerticalApertureAttr().Set( camera->getAperture()[1] * scale, time );
178+
usdCamera.GetHorizontalApertureOffsetAttr().Set( camera->getApertureOffset()[0] * scale, time );
179+
usdCamera.GetVerticalApertureOffsetAttr().Set( camera->getApertureOffset()[1] * scale, time );
180180
}
181181
else
182182
{
@@ -189,9 +189,9 @@ bool writeCamera( const IECoreScene::Camera *camera, const pxr::UsdStagePtr &sta
189189
);
190190
}
191191

192-
usdCamera.GetClippingRangeAttr().Set( pxr::GfVec2f( camera->getClippingPlanes().getValue() ) );
193-
usdCamera.GetFStopAttr().Set( camera->getFStop() );
194-
usdCamera.GetFocusDistanceAttr().Set( camera->getFocusDistance() );
192+
usdCamera.GetClippingRangeAttr().Set( pxr::GfVec2f( camera->getClippingPlanes().getValue() ), time );
193+
usdCamera.GetFStopAttr().Set( camera->getFStop(), time );
194+
usdCamera.GetFocusDistanceAttr().Set( camera->getFocusDistance(), time );
195195

196196
if( camera->hasShutter() )
197197
{
@@ -201,8 +201,8 @@ bool writeCamera( const IECoreScene::Camera *camera, const pxr::UsdStagePtr &sta
201201
/// and Houdini plugin sources, I've been unable to find evidence for
202202
/// anyone else doing this though, so maybe it's one of those things
203203
/// everyone is just getting wrong?
204-
usdCamera.GetShutterOpenAttr().Set( (double)camera->getShutter()[0] );
205-
usdCamera.GetShutterCloseAttr().Set( (double)camera->getShutter()[1] );
204+
usdCamera.GetShutterOpenAttr().Set( (double)camera->getShutter()[0], time );
205+
usdCamera.GetShutterCloseAttr().Set( (double)camera->getShutter()[1], time );
206206
}
207207

208208
return true;

contrib/IECoreUSD/test/IECoreUSD/USDSceneTest.py

Lines changed: 31 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1306,7 +1306,7 @@ def formatCameraName( **kw ) :
13061306
for name, cortexCam in testCameras.items() :
13071307

13081308
cG = pxr.UsdGeom.Camera.Get( usdFile, "/" + name )
1309-
c = cG.GetCamera()
1309+
c = cG.GetCamera( 0.0 )
13101310

13111311
self.assertEqual( c.projection.name.lower(), cortexCam.getProjection() )
13121312

@@ -1329,8 +1329,8 @@ def formatCameraName( **kw ) :
13291329
self.assertEqual( c.fStop, cortexCam.getFStop() )
13301330
self.assertEqual( c.focusDistance, cortexCam.getFocusDistance() )
13311331
if cortexCam.hasShutter() :
1332-
self.assertEqual( cG.GetShutterOpenAttr().Get(), cortexCam.getShutter()[0] )
1333-
self.assertEqual( cG.GetShutterCloseAttr().Get(), cortexCam.getShutter()[1] )
1332+
self.assertEqual( cG.GetShutterOpenAttr().Get( 0.0 ), cortexCam.getShutter()[0] )
1333+
self.assertEqual( cG.GetShutterCloseAttr().Get( 0.0 ), cortexCam.getShutter()[1] )
13341334
else :
13351335
self.assertFalse( cG.GetShutterOpenAttr().HasAuthoredValue() )
13361336
self.assertFalse( cG.GetShutterCloseAttr().HasAuthoredValue() )
@@ -1426,6 +1426,34 @@ def assertVectorsAlmostEqual( a, b,**kw ) :
14261426

14271427
self.assertEqual( camera, roundTripCamera )
14281428

1429+
def testWriteAnimatedCamera( self ) :
1430+
1431+
fileName = os.path.join( self.temporaryDirectory(), "test.usda" )
1432+
root = IECoreScene.SceneInterface.create( fileName, IECore.IndexedIO.OpenMode.Write )
1433+
child = root.createChild( "camera" )
1434+
1435+
cameras = {}
1436+
for time in range( 0, 10 ) :
1437+
1438+
camera = IECoreScene.Camera()
1439+
camera.setProjection( "perspective" )
1440+
camera.setShutter( imath.V2f( time - 0.25, time + 0.25 ) )
1441+
camera.setFocalLength( 1.0 + time * 0.1 )
1442+
camera.setClippingPlanes( imath.V2f( time, 1000 ) )
1443+
1444+
child.writeObject( camera, time )
1445+
cameras[time] = camera
1446+
1447+
del child, root
1448+
1449+
root = IECoreScene.SceneInterface.create( fileName, IECore.IndexedIO.OpenMode.Read )
1450+
child = root.child( "camera" )
1451+
1452+
for time in range( 0, 10 ) :
1453+
camera = child.readObject( time )
1454+
for parameter in ( "shutter", "focalLength", "clippingPlanes" ) :
1455+
self.assertEqual( camera.parameters()[parameter], cameras[time].parameters()[parameter] )
1456+
14291457
def testCornersAndCreases( self ) :
14301458

14311459
mesh = IECoreScene.MeshPrimitive.createPlane( imath.Box2f( imath.V2f( -1 ), imath.V2f( 1 ) ) )

0 commit comments

Comments
 (0)