50 pxr::UsdSkelSkeleton &skel,
51 pxr::UsdSkelAnimation &skel_anim,
57 pxr::VtTokenArray joints;
58 pxr::VtArray<float> bone_lengths;
59 pxr::VtArray<pxr::GfMatrix4d> bind_xforms;
60 pxr::VtArray<pxr::GfMatrix4d> rest_xforms;
63 auto visitor = [&](
const Bone *bone) {
68 if (deform_bones && !deform_bones->
contains(bone->name)) {
75 bone_lengths.push_back(bone->length);
77 joints.push_back(build_usd_joint_path(bone, allow_unicode));
78 const pxr::GfMatrix4f arm_mat(bone->arm_mat);
79 bind_xforms.push_back(pxr::GfMatrix4d(arm_mat));
86 else if (bone->parent) {
87 pxr::GfMatrix4f parent_arm_mat(bone->parent->arm_mat);
88 const pxr::GfMatrix4f rest_mat = arm_mat * parent_arm_mat.GetInverse();
89 rest_xforms.push_back(pxr::GfMatrix4d(rest_mat));
92 rest_xforms.push_back(pxr::GfMatrix4d(arm_mat));
96 visit_bones(obj, visitor);
97 skel.GetJointsAttr().Set(joints);
98 skel.GetBindTransformsAttr().Set(bind_xforms);
99 skel.GetRestTransformsAttr().Set(rest_xforms);
101 const pxr::UsdPrim skel_prim = skel.GetPrim();
104 const pxr::UsdGeomPrimvarsAPI pv_api = pxr::UsdGeomPrimvarsAPI(skel_prim);
105 pxr::UsdGeomPrimvar pv_lengths = pv_api.CreatePrimvar(
106 BlenderBoneLengths, pxr::SdfValueTypeNames->FloatArray, pxr::UsdGeomTokens->uniform);
107 pv_lengths.Set(bone_lengths);
109 pxr::UsdSkelBindingAPI usd_skel_api = pxr::UsdSkelBindingAPI::Apply(skel_prim);
112 usd_skel_api.CreateAnimationSourceRel().SetTargets(
114 create_pose_joints(skel_anim, *obj, deform_bones, allow_unicode);
154 if (!(context.object && context.object->type ==
OB_ARMATURE && context.object->data)) {
165 "Couldn't define UsdSkelSkeleton %s",
170 pxr::UsdSkelAnimation skel_anim;
175 skel_anim = pxr::UsdSkelAnimation::Define(
stage, anim_path);
178 CLOG_WARN(&
LOG,
"Couldn't define UsdSkelAnimation %s", anim_path.GetString().c_str());
190 initialize(context.object, skel, skel_anim, deform_map, allow_unicode);
const USDExportParams & export_params
const pxr::SdfPath usd_path
const pxr::UsdStageRefPtr stage
static void add_anim_sample(pxr::UsdSkelAnimation &skel_anim, const Object *obj, const pxr::UsdTimeCode time, const blender::Map< blender::StringRef, const Bone * > *deform_map)