mirror of
https://github.com/lighttransport/tinyusdz.git
synced 2026-01-18 01:11:17 +01:00
1.6 KiB
1.6 KiB
Skinnig in usdSkel
https://graphics.pixar.com/usd/dev/api/_usd_skel__intro.html
Evaluation of skinning
Terminology
- bindTransforms : World matrices of each joint
- restTransforms : Local matrices of each joint. Need to evaluate in bone(joint) hierarchy. Used when there is no corresponding transform from
SkelAnimation - SkelAnimation : (local?) matrices for each joint
- Sparse : When SkelAnimation supplies(maps?) animation transform to subset of joints
- Non-Sparse : When SkelAnimation supplies(maps?) animation transform to all of joints
restTransforms could be optional when SkelAnimation supply transforms for all joints, but it seems usdview and Houdini does not allow omitting restTransforms(restTransforms is not automatically calculated from bindTransforms)
Also, without bindTransforms skinning does not work well(it is not automatically caculuated from restTransforms)
So, both bindTransforms and restTransforms must exist in USD.
Skinning matrix
skinM = inv(jointWorldSpaceBindTransform) x jointSkelSpaceTransform
jointSkelSpaceTransform = jointLocalSpaceTransform * parentJointSkelSpaceTransform
//
jointWorldSpaceTransform = jointLocalSpaceTransform *
parentJointSkelSpaceTransform * skelLocalToWorldTransform
Skinning a point
# geomBindTransform = `primvars:skel:geomBindTransform`
skelSpacePoint = geomBindTransform.Transform(localSpacePoint)
p = (0,0,0)
for jointIndex,jointWeight in jointInfluencesForPoint:
p += skinningTransforms[jointIndex].Transform(skelSpacePoint)*jointWeight
EoL.