Problem with aplying scale and importing to Unreal

I’ve exported and imported a model to unreal. I’ve had issues with physics, can’t scale the physics asset and it won’t affect the environment

Investigating the problem I found that I’ve should scaled the model to 100 and apply scale.
The problem comes when applying the scale, it breaks everything. I’m using the blender rigify.
image


Another problem is that the shape keys won’t export.

PD: The wing and face rig are custom made

That looks like the stretch bones having issues with scaling.

You can try running this script (I didn’t write it, and I no longer remember where I found it) to reset them all at once and see if that works:

import bpy

for b in bpy.context.active_object.pose.bones:
for c in b.constraints:
if c.type == “STRETCH_TO”:
c.rest_length = 0

It worked for me when I copied your steps with a blank rigify rig.

The problem is that I’ve modified various parts of the default

That shouldn’t matter with this script. It just resets the length of the stretch to constraints. I’ve used it without problems on rigs built entirely from scratch.


Not working in my rig

Sorry. Not sure why, since I’m not a coder.

It still looks like stretch to problems to me. Have you tried manual resets? It’s tedious, but it may fix the issue, or at least tell you if that NOT the problem.

It’s fine, there should be a way

1 Like

Find a fix in this subreddit, by user frizzil:

[https://www.reddit.com/r/blender/comments/eu3w6m/guide_how_to_scale_a_rigify_rig/](https://Guide: How to scale a Rigify rig)

Step 1: Prepare

  • Backup your project!
  • Figure out what value you’re going to scale everything by. Every time you scale, you should hit S then immediately type in your value, for consistency.

Step 2: Scale linked meshes and curves

  • Scale the vertices of all meshes and curves linked to the rig (not the objects themselves.)

Note: you can scale multiple objects’ contents simultaneously by selecting them all in Object mode, then swapping to Edit mode, selecting all vertices with A, then scaling with S. Be aware that you cannot edit both curves and meshes simultaneously, however.

For clarity, you may optionally disable then re-enable the Armature modifier for all objects, before and after this step. (To do so, select all Armature’d objects, then go Properties -> Modifiers Properties (Wrench) -> Armature -> Alt-LMB on 'Realtime' (the Monitor))

Step 3: Scale the rig

  1. Select the rig.
  2. Ensure your rig is in Rest pose, for clarity’s sake. (Pose mode -> ‘A’ to select all -> Pose -> Clear Transforms -> All)
  3. In the Properties Editor, navigate to Object Data Properties, then mark all Layers visible by holding Shift then dragging LMB over them.
  4. Go into Edit mode, select all bones with A, then scale with S.
  5. Check for any bones that didn’t scale. If you see one and cannot select it directly, find it in the Outliner somewhere under your_rig -> Pose, then scale them. (root -> VIS_thigh_ik_pole.L/R are likely culprits!)

Don’t freak out if things look bad outside of Edit mode! That’s our next step.

Step 4: Fixing the constraints

Any unintended deformation in Pose mode, crazy or slight, shall be your guide. We’re now going to find every single Bone Constraint of type “Stretch to” and hit the “Reset” button on it.

Easy Method

Fortunately, Blender lets us accomplish this programmatically, saving us loads of time.

  1. Swap to Object mode and select your rig.
  2. Open the Scripting workspace.
  3. Paste this entire code block into the Python Console, then hit Enter twice:

import bpy
bone_count = 0
for b in bpy.context.active_object.pose.bones:
for c in b.constraints:
if c.type == “STRETCH_TO”:
c.rest_length = 0
bone_count += 1

Explanation: all Stretch To constraints in Rigify are generated with the “default” rest length of zero… which Blender interprets as needing to be immediately recalculated based on current distance. We effectively changed that distance earlier by scaling the bones, so now we reset to zero to have Blender calculate it once again.

Now, verify that the script worked by typing in bone_count then hitting Enter again, which will spit out the number of constraints we just changed. It should NOT be zero - if it is, then double check that your rig is selected and your 3D View is in Object mode, then try again. Your rig should look much better, though it may not be perfect yet.

If you can’t get this to change any bones, consider starting at step 1 of Manual Method; otherwise, skip to step 6.

Manual Method

  1. Go into Pose mode.
  2. Back in Object Data Properties, select only the last Layer (i.e. the ‘ORG’ bone layer.)
  3. Select a bone (preferably ‘ORG-spine’, somewhere in the waist), then go Properties -> Bone Constraints, look for a “Stretch To” modifier, then if present, “Reset” it. Repeat for all bones on the layer, working your way out from the spine.
  4. Now select only the third-to-last layer (i.e. the ‘DEF’ bone layer), and repeat the last step for all bones in it.
  5. Check the second-to-last layer (i.e. ‘MCH’) for several bones that may also need to be “Reset”, particularly the huge bones marked ‘ik_stretch’. !<
  6. Advanced: If you have anything custom and hook-based (like Spline IKs), now is the time to find those hook modifiers and hit their ‘Reset’ buttons while in Edit mode with those objects.
  7. Verify that nothing looks off by toggling between Edit and Pose mode on your rig, and checking any bones near where deformation is present. (It’s not likely, but you may need to check the other layers.) If you have animations, double check that nothing is currently keyframed. When you’ve finished, the model should look identical in both modes.

Step 5: Animations (if present)

The location channels for many of the bones in each animation will also need to be scaled by your value, lest your animations swing too short or too wide.

Easy Method

  1. In the Python console, type in rescale = YOUR_SCALE_VALUE except with your scale value, and hit Enter.
  2. Again in the Python console, type in rescale_actions = ['my_action1', 'my_action2'] except with the exact names of all your desired actions, each inside two single-quotes, and separated by commas, between the two brackets. Then hit Enter.
  3. Now paste in the entire following script, then hit Enter twice:

for action_id in rescale_actions:
for fcurve in bpy.data.actions[action_id].fcurves:
data_path = fcurve.data_path
if data_path.startswith(‘pose.bones[’) and data_path.endswith(‘].location’):
for p in fcurve.keyframe_points:
p.co[1] *= rescale
fcurve.keyframe_points.handles_recalc()

If you get an error, (e.g. you typed in an action’s name incorrectly), then Undo with Ctrl+Z then repeat from step 2, until you get no errors and all your actions are scaled!

If you just can’t get this to work, or need to troubleshoot something, then you might consider the Manual Method… but it will be extremely tedious.

Manual Method

  1. Configure a workspace with a 3D View of your model, the Graph Editor, and the Dope Sheet.
  2. In the Graph Editor, enable View -> Only Selected Keyframes Handles. (This will save you clicks.)
  3. Select your rig and swap to Pose mode.
  4. For each misplaced bone under each Action in the Dope Sheet, select the bone, shift-select all its “location” channels in the Graph Editor, then while mousing over the graph side of the editor, hit A -> S -> Y and immediately type in your scale value. Verify the Action is correct before moving onto the next, and you should be good to go.

There is no need of scalling in edit mode, you can scale everything at once in object mode and apply scale, the model looks ugly until you apply the code.

The post is old, but it works.

1 Like