Mutable Metahuman Workflow Questions

Hello!

I appreciate UE5.5 has just released, and Mutable is experimental, however I wanted to start looking into this plugin to see how viable it will be for our use case. What it says on the tin is exactly what we’re looking for.

Anyway, I’m having a number of issues, and perhaps this is the best place to begin that dialogue.

Firstly, I have built a modular system of Clothing objects and a Body object which references them.
As you can see, this asset creates a combined clothing set and masks out the skin (or clothing) on areas that are covered by higher layers.

Mutable preview:

However, for whatever reason, when implementing this Mutable asset within our custom Metahuman actor class, the only thing we see is the removal of the skin vertices. We don’t get the clothing being added at all:

Just to share how this is set up. Here is the graph for the “Character” (body + clothing + masks):

F

Fairly straight-forward, each clothing item outputs it’s mesh, gets morphed based on body morphs (of which we don’t have connected right now, as we felt this might be part of the issue), and then masks each other and the body based on which meshes are active in each clothing object.

Here is an example of a clothing object:

As you can see, everything is set up in a fairly simple way, and the preview shows how I would expect, so all should be well.

Here is the setup in the Blueprint Actor:

So, I noticed that the child objects didn’t have the Enable 16Bit Bone Weights variable enabled like the main “Character” asset did. However, when I try to enable these, the engine crashes immediately after recompiling the main “Character” asset.

I can’t for the life of me figure out why this is happening, but perhaps it’s a Plugin bug.

Additionally, I noticed when playing in editor, I get this warning:
{CCF2E336-DA03-452A-8B45-80D6C4C67E1B}

In the output log it displays as such (no warning or explanation):

Any help with these two issues would be massively appreciated. I feel like I’m a couple of changes away from having a fully working system, but perhaps I’ve missed something obvious or the plugin just simply isn’t ready yet.

Edit: Just to confirm, I followed both of these documentation pages to ensure everything is as it should be:

5 Likes

Another little experiment.

I attempted to add the Metahuman head to the Character mutable asset, and that immediately causes an engine crash as well.

This is the crash I receive with either the head added, or the checkboxes for 16-bit bone weights enabled on the child objects:

[2024.10.02-06.22.34:733][333]OBJ SavePackage: Generating thumbnails for [0] asset(s) in package [/Game/_AHOY/CHARACTERS/MUTABLE/MU_Character] ([1] browsable assets)...
[2024.10.02-06.22.34:733][333]OBJ SavePackage: Finished generating thumbnails for package [/Game/_AHOY/CHARACTERS/MUTABLE/MU_Character]
[2024.10.02-06.22.34:733][333]Cmd: OBJ SAVEPACKAGE PACKAGE="/Game/_AHOY/CHARACTERS/MUTABLE/MU_Character" FILE="D:/AhoyMH/AhoyMH/Content/_AHOY/CHARACTERS/MUTABLE/MU_Character.uasset" SILENT=true
[2024.10.02-06.22.34:765][333]LogSavePackage: Moving output files for package: /Game/_AHOY/CHARACTERS/MUTABLE/MU_Character
[2024.10.02-06.22.34:765][333]LogSavePackage: Moving 'D:/AhoyMH/AhoyMH/Saved/MU_Character0A825BFF455285945616DF8731BFC792.tmp' to 'D:/AhoyMH/AhoyMH/Content/_AHOY/CHARACTERS/MUTABLE/MU_Character.uasset'
[2024.10.02-06.22.34:776][333]LogFileHelpers: InternalPromptForCheckoutAndSave took 79.262 ms (total: 405.400 ms)
[2024.10.02-06.22.34:816][333]LogContentValidation: Display: Starting to validate 1 assets
[2024.10.02-06.22.34:816][333]LogContentValidation: Enabled validators:
[2024.10.02-06.22.34:816][333]LogContentValidation: 	/Script/DataValidation.DirtyFilesChangelistValidator
[2024.10.02-06.22.34:816][333]LogContentValidation: 	/Script/DataValidation.EditorValidator_Localization
[2024.10.02-06.22.34:816][333]LogContentValidation: 	/Script/DataValidation.PackageFileValidator
[2024.10.02-06.22.34:816][333]LogContentValidation: 	/Script/DataValidation.WorldPartitionChangelistValidator
[2024.10.02-06.22.34:816][333]LogContentValidation: 	/Script/InputBlueprintNodes.EnhancedInputUserWidgetValidator
[2024.10.02-06.22.34:817][333]LogContentValidation: 	/Script/MutableValidation.AssetValidator_CustomizableObjects
[2024.10.02-06.22.34:817][333]LogContentValidation: 	/Script/MutableValidation.AssetValidator_ReferencedCustomizableObjects
[2024.10.02-06.22.34:817][333]AssetCheck: /Game/_AHOY/CHARACTERS/MUTABLE/MU_Character Validating asset
[2024.10.02-06.22.35:482][383]LogMutable: Display: Compiling Customizable Object MU_Character for platform WindowsEditor.
[2024.10.02-06.22.35:498][383]Mutable: Compiling MU_Character. Loading assets
[2024.10.02-06.22.37:908][383]Mutable: Compiling MU_Character. Compiling
[2024.10.02-06.22.37:946][383]LogAutomationController: Ignoring very large delta of 2.47 seconds in calls to FAutomationControllerManager::Tick() and not penalizing unresponsive tests
[2024.10.02-06.22.38:045][384]LogMutableCore: Generated roms: 0 (0 KB) are embedded, 43 (18453 KB) are streamed of which 0 (0 KB) are high-res.
[2024.10.02-06.22.38:045][384]LogMutableCore:    Cache Files Written : 0
[2024.10.02-06.22.38:045][384]LogMutableCore:    Cache Files Read    : 0
[2024.10.02-06.22.38:045][384]LogMutableCore:    Cache MB Written    : 0
[2024.10.02-06.22.38:045][384]LogMutableCore:    Cache MB Read       : 0
[2024.10.02-06.22.38:054][385]Mutable: Compiling MU_Character. Saving Data
[2024.10.02-06.22.38:108][388]LogMutable: Enqueue UpdateSkeletalMesh Async. Instance=68890, Frame=12389, Priority=0, dist=18446742974197923840.000000, bIsPlayerOrNearIt=0
[2024.10.02-06.22.38:108][388]LogMutable: Display: Finished compiling Customizable Object MU_Character. Compilation took 2.625 seconds to complete.
[2024.10.02-06.22.38:108][388]Mutable: MU_Character finished compiling.
[2024.10.02-06.22.38:110][388]LogMutable: Enqueue UpdateSkeletalMesh Async. Instance=68890, Frame=12390, Priority=1, dist=18446742974197923840.000000, bIsPlayerOrNearIt=0
[2024.10.02-06.22.38:110][388]LogMutable: Finished UpdateSkeletalMesh Async. Instance=68890, Frame=12390, QueueTime=0.000000, UpdateTime=0.000000
[2024.10.02-06.22.38:110][388]LogMutable: Started UpdateSkeletalMesh Async. Instance=68890, Frame=12390
[2024.10.02-06.22.38:249][391]LogMutable: Warning: Attaching Customizable Skeletal Component to Skeletal Mesh Component with overriden materials! Deleting overrides.
[2024.10.02-06.22.38:256][391]LogMutable: Finished UpdateSkeletalMesh Async. Instance=68890, Frame=12393, QueueTime=0.002362, UpdateTime=0.146207
[2024.10.02-06.22.38:283][392]LogMutable: Started UpdateSkeletalMesh Async. Instance=71616, Frame=12394
[2024.10.02-06.22.38:315][394]LogOutputDevice: Warning: 

Script Stack (0 frames) :

[2024.10.02-06.22.38:325][394]LogWindows: Error: appError called: Assertion failed: (Index >= 0) & (Index < ArrayNum) [File:D:\build\++UE5\Sync\Engine\Source\Runtime\Core\Public\Containers\Array.h] [Line: 783] 
Array index out of bounds: 6 into an array of size 6

[2024.10.02-06.22.38:325][394]LogWindows: Windows GetLastError: The operation completed successfully. (0)

And one last thing.

I’ve been using the Enum switches in the Mutable graphs to determine which mesh to use, or whether to show a mesh at all. You can see that here:

But in Blueprint, there is no “Set Enum Parameter Option”. My assumption was to go with setting an Int parameter anyway, like this:

Obviously it’s hard to verify whether this is working or not, due to the clothing not displaying at all, but perhaps someone could let me know if this is the correct method for a parameter change like this?

I did think to just go back to the Mutable graph and swap the enum parameters for int parameters or even float parameters, but you can “Switch” on either int or float parameter values, so that’s not a solution either.

Documenting my trial and error as I go in case this thread becomes useful for others in the future.

Just figured out that when making parameter changes in Blueprint, you have to run “UpdateSkeletalMeshAsync”, after:
{31981BBD-2CAC-4DB3-AF53-C41E097B6356}

However, when trying to actually change these parameters from the defaults… The same crash as I’ve shared above returns.

Some warnings/errors I get when reloading the engine after these crashes:

3 Likes

Managed to get some of the parameters to ‘work’ without crashing. Here you can see the clipping of the arms changes based on which shirt mesh (A, B, or C) I select using the int parameter set:

However doing the same on Enum switches to determine if a mesh component should be added or not seems to cause a crash still. I’m wondering if that’s because having empty mesh components is bad, or if there are some references that the other objects are pointing at (like masking) that no longer exist if certain components aren’t active…

Edit: Disabling the masking entirely still resulted in a crash, so it is perhaps the ‘empty’ mesh components being switching in that is causing the issue. I’ll try some things…

Edit 2: Okay, yes, don’t leave empty mesh components! This is a crash cause.

Bad, causes crash:
{C1F9606B-F2A3-4933-8E58-F93E2C8192F6}

Fine, doesn’t crash:
{363C9CD3-3193-4717-8FB4-73EB42D41232}

Still no clothing actually displaying though. I can just see the masking of the skin updating.

1 Like

Turns out the “Enable 16-bit Bone Weights” checkbox on the child objects no longer crashes the editor. It was the empty mesh component switches causing that.

However, with those enabled, the meshes still don’t display.

2 Likes

Additionally, I noticed when playing in editor, I get this warning:
{CCF2E336-DA03-452A-8B45-80D6C4C67E1B}

Solved this issue. The warning was seemingly not related at all, but it turns out my body and clothing meshes had a different assigned skeleton. The skeletons were identical, but for whatever reason that was an issue.

I was really hopeful that this would also solve the issue of clothing not rendering at all, but sadly that still remains a problem.

1 Like

Continued to get errors with the empty mesh switcher (merging skeletons error, as the ‘empty’ mesh doesn’t have a valid skeleton), so had to create a skeletal mesh using the same skeleton as everything else, but with an invisible cube as it’s render mesh. Bit of a hacky solution, but until I hear more about best practices it’ll have to do.

Sadly, still no clothing being rendered, even if the parameter setting works perfectly now.

… Okay, so I essentially solved this.

Originally, I was using the Child components (or separate Base components) input for each of the clothing parts, but I’ve found that I can get the clothing to render by combining them all into one component before outputting:

This feels… Wrong? I’m pretty sure the morph targets on these combined mesh sections are not being correctly calculated as a result of this change, and while the meshes are rendering this way, I have to wonder if this is the correct way to go about this, because if so - Why are there “child object” inputs to begin with.

This unlocks my path forward for now, but I won’t mark this as resolved until I can be sure this is either the intentional workflow, or I’ve managed to ensure all of the morphs and other aspects work as necessary.

Hi @AhoyGame thanks for your interest in Mutable. Unfortunately, the team does not have bandwith to provide support to the community via the forum. But we’re working on samples and documentation that will be released alongside with UE5.5 release and the following weeks.
In the meantime, there’s a public wiki with legacy Mutable documentation here. Hope this helps and good luck with your interesting project!

6 Likes

very helpful. I have just begun my journey into this feature, also. You helped me find the documentation to this important new feature. (which is not in the Official Unreal Editor)

2 Likes

Noob questions:

  • Is this system more performance consuming that having multiple skeletal meshes with differents morphs applied?
  • if I will have a basic setup like Character → Shirt → Jacket, the jacket will prevent the compenetration of the shirt? like, the jacket will hide the shirt parts that could compenetrate with itself?

Thanks in advance!

EDIT:

So far, after playing with it for two hours, it seems that this tool seems to be used just for switching materials slots (which have to be the same for each skeletal mesh you would add in your “modular character”), and it just set a material to be showed or hidden according to the structure.

I hoped it could have worked using a WHOLE skeletal mesh.
I achieved this stuff by separating material slots and applying a transparent material a year ago.

Congrats epic, especially for the “you will not need to fight with the z-order” LMFAO.

Are you sure? The following is copied from the “official” document: Use Cases · anticto/Mutable-Documentation Wiki · GitHub

It seems to do much more than you’ve described.

General

  • Integrates well with Unreal Engine.
  • Flexible parameter system to connect customizable objects to multiple effects.
  • Split customizable characters un multiple assets for concurrent technical artist work.

Mesh

  • Remove hidden parts for performance and avoiding z-fighting.
  • Bake morphs at character generation time.
  • Merge meshes to reduce draw call count.
  • Deform meshes based on interaction between characters parts.

Textures

  • Bake images at runtime combining multiple effects.
  • Support multiple type of projectors: planar, cylindrical and wrapping.
  • Support multiple texture blending modes: multiply, soft light, hard light, burn, dodge, etc.
  • Manage UV layouts to remove unnecessary texture parts dynamically.

Animation And Physics

  • Combine animation graphs of multiple parts.
  • Merge and deform collision physics assets together with the meshes.
  • Manage cloth simulation data at character generation time.

Performance

  • Flexible instancing of customized characters.
  • Support LOD management at runtime.
  • Support multiple states for to adjust character generation to the different game use cases.
  • Texture streaming with on-demand generation integrated with UEs.

Not sure if you’re still looking for an answer to this, but the reason your clothing doesn’t show up is because you haven’t set up the “Waistcoat” component anywhere in your BP actor. If you want the clothing in a separate component you need to add another Customizable Skeleton component for the “Waistcoat” mesh component.

1 Like

Hey. I know this is out of topic. But I have issue while using mutable for Multiplayer.|

can you check this : https://forums.unrealengine.com/t/issue-with-character-customization-in-multiplayer-game/2222263