Morphs for child characters and the skeletons therein

I’m making a Sims-style character creation system with morphs. One of the morphs I want to include is an child slider which will turn the adult-sized character into a child-looking character with proportions of a child. There’s a counterpart slider for an elderly person, but that’s pretty simple adding some sagging skin and wrinkles - the model’s skeletal structure won’t change. For a child though, that of course means a much shorter body. The skeleton remains sized to the adult model and any animations applied to it really bork the model. This is also true to a lesser extent of morphs like shoulder width and torso height. I can probably live without that level of depth but I’d really like to allow for child characters without having to create lots of different models with their own skeletons for each ‘age.’ Doing so would also severely complicate the clothing process. I also don’t want to just scale the skeletal mesh component/actor because then it just looks like an adult scaled down.

Now this is pretty much expected because it happens in Max too - in Max to correct this I would turn off ‘Always Deform’ on the model’s skin modifier and one-by-one fit the bones to the new model (or automate it using vertex positions) then re-enable ‘Always Deform’ and voila, but obviously I can’t fix the model in Max when the player is making a character in-game. I’ve found the ‘Always Deform’ equivalent in Skeletal Mesh Component’s ‘No Skeleton Update’, but I’m a little lost on the rest. So here are my questions, one-by-one:

  1. Is there a way to set bone positions pre-animation? I see there are skeletal control transform (modify) nodes in the anim instance but they appear to take in a pose then add transforms on top of it. Granted I am very new to animation blueprints so this is likely a noob question. If so, my apologies.

  2. Is there an easier, or more automatable way to modify bone transforms besides the aforementioned node? I would have to set new locations for every single bone and that would not only make mean dozens of this node filling up the anim graph, but it would be rather laborious clicking each one and setting the bone. Perhaps something that takes in a bone name as a parameter? Or can this be done in C++?

I hope what I want to do here is possible. Thanks in advance for your input!

Well your getting into game design theory as to what would and would not work. A test I did way back was to see if I could activate a morph target at run time that would change the character model using a Daz Studio injector morph and once imported since the shape change at run time is injected onto the base master would animate as an offset (think bottom up progression of the 3ds Max stack) you could make as many different characters you wish off of the same frame work.

Hey FrankieV, I’ve seen you around the forums posting about this kind of stuff and you seem quite experienced with it, so i thank you for your reply!

We’re not using Daz so I’m not sure how that all works, but is a ‘Daz Studio injector morph’ just a regular morph that doesn’t change topology? Our ‘child’ morph uses the existing topology of the adult mesh, it just shrinks the size of the character and adjusts proportions to be more child-like (bigger head, more even shoulders and hips, ‘baby fat’, etc). This of course does not change the skeleton so even something as simple as raising an arm causes extreme stretching of the mesh when the child shape is applied to it.

Could you please expand upon how your system works? I am applying morphs at runtime so I would expect it to evaluate the morphs after the skeletal animation has been applied, but it always seems to process changes to the mesh before updating animation.

I feel like what I would have to do is disable animation completely then move the bones into place for the new mesh then enable animation again - I’m just not sure how to do this.

If you don’t want to use modify bone nodes I think you could pose the skeleton to match the child body proportions, export that pose and apply it as an additive with the apply mesh space additive node, using bind pose as reference and the morph target for alpha.

You’d have to apply the morph target as kind of a corrective though, not a complete morph. For example, duplicate the child mesh and apply the child pose to the original skeleton. Then duplicate the adult mesh (since morph targets ignore bone transformation), add the child mesh as a morph target on the duplicated adult mesh, then bind it to the skeleton and apply the original bind pose. Then you should have a working morph target after the bone transforms are applied.

.

lol not really. I just know a lot of stuff from all the mistakes I’ve made. :wink:

How we have things set up at the moment. (Note: there is nothing that prevents you from using your own design)

Well we use Daz Studio for the framework which is more or less the same as the the preferred setup for MotionBuilder. The problem it solves for us is as a logical choice as a replacement for the basic Epic rig is it keeps both content and code team members working.

Yes an injector is just a fancy word to identify a full body morph that does not change the topology. It’s what Daz3d uses for all of their Daz3d Originals so if you buy the Victoria 8 bundle the base form is a derivative of the Genesis 8 framework

The direction usually starts with the base G3 male and female forms. From DS our character modeler will use the GoZ bridge and send either the G3M or G3F to Zbrush, we don’t use G8 as it has a lot of stuff not needed and would just get in the way, and she will reshape the head as a derivative, don’t need the body more on this later, and once she is done will export the head as an obj target and I’ll use the morph loader to import the full body injector back into DS.

Using Daz Studio I’ll hide the parts that are not part of the head element, including the eyes, setting the exporter to not included hidden parts. Since the reshape works with the DS framework the export can included morph targets that works with the edited head but we decided for our use to us cluster shaping which by this process adds the joints by default. Once I’ve done what needs to be done I’ll export the head as a component object and import into UE4

While I’m doing this our character modeler will then create clothing that fits the form at the component level. Boots, pants, shirts, vests, helmets, holsters all fit the form using the shaping tool in zbrush and she will then update a master 3ds Max, along with a text file as to what parts goes with what player model, which I’ll will take and skin wrap to the G3 base and convert to skin. Once I’ve polished the weights I’ll export to UE4 using the already import skeletal rig as a component of what will make up the completed player model.

Once I have all of the components in hand I’ll assemble a character blueprint that includes all of the individual components. Since all of our player models will be to a set scale the same arms used for the first person perspective is used as a component of the 3rd person with plans that the 1st person hands will match the 3rd person. Also this is where excluding the eyes comes in as we are using the photo realistic eye object included as part of the photo realistic project as well in the process of converting the other materials like eye,skin and hair materials to make use of the textures available for the G3 form.

Sorry if I’m a bit wordy but the bottom line via a process everyone is kept happy and the result is a custom and unique player model that does not look like just another asset flip… :wink:

Did you ever figure out a good solution to this?

I managed to get something similar working using Maya. The basic steps are:

  1. Move the base skeleton joints to their corresponding positions/rotations on the target skeleton (which messes up the mesh) and save this as a “pose”

  2. Apply both the target character shape and the messed-up mesh shape as blendshapes (morphs) on the original base mesh

  3. Set the messed-up mesh blendshape to -1 and the target character blendshape to 1 (this gives you the delta shape between the messed-up base mesh shape and the target character shape)

  4. Apply the resulting “delta” shape as a blendshape to the original base mesh

Then export the translated joints and morph as a new animation and import it into UE4 and convert it to a pose. Now when you dial in both the target character joint pose and the “delta” shape, you get the target character shape with the target character skeleton joint locations.

Unfortunately you have to set the affected bones to “Animation” or “Animation Relative” to get them to use the new translations…not sure how that will affect retargeting…

Perhaps Proportionalizer could serve as a good base for such systems?

I never really found a perfect solution, but Proportionalizer is as close as it comes. I threw out the child ‘morph’ and now I’m using uniform scaling for height, morphs for subtle differences between adults and children (face, muscle, limb shapes) and P’r for the larger structural changes like torso height, shoulder width, etc. P’r scales the bones in bone space and accounts for all the small annoyances you run into when trying to scale bones manually. Plus, no need for those cumbersome Modify Bone nodes! I’d recommend it.

The PR dev is gone. Not for sale. Are you able to recompile your version to UE4.27 version? (does the ancient code work in newer engines?)

And did his asset auto adjust CharacterBP > Capsule height, when leg bones got longer?

Honestly, I don’t remember. I went and spun out my own solution based on his, which works pretty well but is not ready for production. I just haven’t gotten around to optimizing it. One day I will and I will post it here.