VRM (GLB based) uses springbones in hair and dresses with colliders in the body for simple hair and cloth physics. (The colliders approximate the mesh of the body, for efficiency.). (Random sample video https://youtu.be/CHUBGTQHDIs?si=LI4ZrDQvnPwWRV-I ). Documentation showing settings like stiffness of the bones, radius (sphere) or radius + length (capsule) for colliders.
Is there anything similar in USD to encode such information?
(1) Spring bones - I could not find anything, or are joints in physics similar?
(2) Sphere and capsule colliders - is Universal Scene Description: UsdPhysics : USD Physics Schema the best thing to use?
Is it correct to say that the SpringBone is like a normal bone in that it is weighted to mesh vertices for deformation, but also, the SpringBone participates in a physics simulation?
If so, then it would be as you suggest, you’d model it in USD by applying the Drives API to a prim, which has a stiffness attribute: Universal Scene Description: UsdPhysicsDriveAPI Class Reference
I am unclear however whether you can apply a physics api to a joint in a skel. Obviously that’s necessary for your use case, but I’m not sure at the moment whether one can use UsdSkel and UsdPhysics together.
Yes. That is an accurate description of a spring bone. It is simple physics simulation you add to a model on bones. It understands colliders (or ideally the body mesh) so hair & cloth does not go through the skin (into the body, making the skin visible). VRM defines glTF extensions to capture these concepts, as well as “expressions” (which map through to blendshape weights and texture tiling adjustments - so you can say swap the eye iris texture with glowing red to indicate anger etc).
Thanks for the links Nick! I will do some more reading.
For me, these are common issues with Avatars. For example, from what I have seen of Reallusion Character Creator characters (which exports to USD), they solve the problem by not providing hair or cloth physics. Long hair and clothes are bound to the bones exactly like skin, so head turns on characters with long hair looks weird (long hair flowing down the back sticks to the back, so you get a weird stretching around the neck).
Thanks, @alankent - please keep us apprised of your findings! Joints do not have an explicit prim representation in UsdSkel, currently, so that definitely represents a challenge for “annotating” a Skel with useful UsdPhysics properties.
If VRM is widespread enough that interchange between DCC’s is going to be important, we’d definitely benefit from agreeing on canonical schemas and encodings for representing in USD. While UsdPhysics is part of the OpenUSD core, I’ll note that the engine that ships with OpenUSD, used by usdview and other tools, has no built-in evaluation support for physics sims, so that’s another challenge to address for robustly supporting this kind of featureset.
Yes, not having prims is a slight problem. SkelAnimation has the “joints” property holding a list of joint paths which I guess could be used, but not sure if you want to capture each joint chain separately. Something like
uniform token hairPhysics:joints = [
Then I guess store other properties per bone hair bone in parallel arrays.
float hairPhysics:stiffness = [ 1, 1, 1, 1, 1, 1 ]
So certainly doable, but someone more familiar with existing physics encodings would be good.
I think the first step would be to agree on the hair bone physics to model it upon, such as VRM hair bones. I am sure there are others around.
Not being part of the core is an interesting question. I am not worried about it not being part of the core, but I might do bone weight painting differently if I knew it was not going to have any effect. E.g., make hair bind to the body if no physics available, but it should not use weight painting if physics is in effect…