static void _setXformOp(const UsdGeomXformOp &op, const GfVec3_T& value, const UsdTimeCode &usdTime) { switch(op.GetOpType()) { case UsdGeomXformOp::TypeRotateX: op.Set(value[0], usdTime); break; case UsdGeomXformOp::TypeRotateY: op.Set(value[1], usdTime); break; case UsdGeomXformOp::TypeRotateZ: op.Set(value[2], usdTime); break; default: op.Set(value, usdTime); } }
//! [CreateAnimatedTransform] bool CreateAnimatedTransform(UsdGeomXformable const &gprim, GfVec3d const &baseTranslate, GfVec3f const &baseRotateXYZ, GfVec3f const &defPivot) { // Only need to do this if you're overriding an existing scene if (not gprim.ClearXformOpOrder()){ return false; } static const TfToken pivSuffix("pivot"); UsdGeomXformOp trans = gprim.AddTranslateOp(); UsdGeomXformOp pivot = gprim.AddTranslateOp(UsdGeomXformOp::PrecisionFloat, pivSuffix); UsdGeomXformOp rotate = gprim.AddRotateXYZOp(); UsdGeomXformOp pivotInv = gprim.AddTranslateOp(UsdGeomXformOp::PrecisionFloat, pivSuffix, /* isInverseOp = */ true); // Now that we have created all the ops, set default values. // Note that we do not need to (and cannot) set the value // for the pivot's inverse op. // For didactic brevity we are eliding success return value checks, // but would absolutely have them in exporters! trans.Set(baseTranslate, UsdTimeCode::Default()); pivot.Set(defPivot, UsdTimeCode::Default()); rotate.Set(baseRotateXYZ, UsdTimeCode::Default()); // Now animate the translation and rotation over a fixed interval with // cheesy linear animation. GfVec3d position(baseTranslate); GfVec3f rotation(baseRotateXYZ); for (double frame = 0; frame < 100.0; frame += 1.0){ trans.Set(position, frame); rotate.Set(rotation, frame); position[0] += 5.0; rotation[2] += 7.0; } return true; }
// Given an Op, value and time, set the Op value based on op type and precision static void setXformOp(const UsdGeomXformOp& op, const GfVec3d& value, const UsdTimeCode& usdTime) { if (op.GetOpType() == UsdGeomXformOp::TypeTransform) { GfMatrix4d shearXForm(1.0); shearXForm[1][0] = value[0]; //xyVal shearXForm[2][0] = value[1]; //xzVal shearXForm[2][1] = value[2]; //yzVal op.Set(shearXForm, usdTime); return; } if (UsdGeomXformOp::GetPrecisionFromValueTypeName(op.GetAttr().GetTypeName()) == UsdGeomXformOp::PrecisionDouble) { _setXformOp<GfVec3d>(op, value, usdTime); } else { // float precision _setXformOp<GfVec3f>(op, GfVec3f(value), usdTime); } }
static bool _Set(const UsdGeomXformOp &self, TfPyObjWrapper pyVal, UsdTimeCode time) { VtValue val = UsdPythonToSdfType(pyVal, self.GetTypeName()); return self.Set(val, time); }