Print view · Mesh Morpher documentation · 538 pagesChoose "Save as PDF" as the destination in the print dialog.
Back to the docs

Mesh Morpher documentation

Mesh Morpher documentation

538 pages · exported 2026-09-06 · https://meshmorpher.com/docs

Introduction

Mesh Morpher allows you to create/remove/modify, copy, import and export morph targets easily from within Unreal Engine Editor.

Mesh Morpher allows you to create/remove/modify, copy, import and export morph targets easily from within Unreal Engine Editor.
Mesh Morpher version 2.0 and above is only available for UE5.0 and later.
Mesh Morpher doesn't use any third party libraries outside the engine.

A Morph Target is a snapshot of vertex locations for a specific mesh that have been deformed in some way. For instance, you can take a character model, reshape their face to create a facial expression, and then save that edited version as a Morph Target.

Mesh Morpher allows users to create Morph Targets using various tools, from sculpting, importing from FBX/OBJ files to Wrapping to other Skeletal Meshes.

Mesh Morpher was awarded a Mega Grant by Epic Games which helped with the development in its initial stage.

Mesh Morpher is only available through https://meshmorpher.com website

This documentation is under construction. New content is added and expect changes.

Classic

137 pages in this section.

Classic

Install

In order to install Mesh Morpher:

  1. Download the .zip file associated with the Unreal Engine version and OS you're using by navigating to Licenses
  2. Create a Plugins folder inside your Project folder
  3. Unzip the downloaded file to YourProject/Plugins

If you want to package with Mesh Morpher, then you need to install it in the engine:
UE_5.X/Engine/Plugins/Marketplace

Make sure to uninstall any previous marketplace versions.

For Engine Source Builds please follow the steps in the video:

Classic

Workflows

Mesh Morpher is a versatile tool that allows you to integrate it into your own workflow.

Here are some workflows for Mesh Morpher that we're using:

Classic

Patch Notes

[MM-1277] Implemented DNA RBF Editor

Mesh Morpher 5.2.6 is Live! (08/28/2026)
  • [MM-1277] Implemented DNA RBF Editor
  • [MM-1278] Removed Unpack RigLogic RBF Data
Mesh Morpher 5.2.4 is Live! (07/24/2026)
  • [MM-1275] Improved DNA interaction
  • [MM-1276] Fixed a bug in 5.8 where Mesh Morpher would use legacy dna wrongfully
Mesh Morpher 5.2.3 is Live! (06/17/2026)
  • [MM-1274] Cleaned shaders and changed threadgroup to 256
Mesh Morpher 5.2.2.1 is Live! (04/07/2026)
  • [MM-1273] Fixed the progress bar in nonrigid fit
Mesh Morpher 5.2.2 is Live! (04/01/2026)
  • [MM-1272] Greatly improved non-rigid algorithm
Mesh Morpher 5.2.1.1 is Live! (02/27/2026)
  • [MM-1271] Fixed a bug with UV mapping in Control Points where mapping would correctly place control points when the mesh had multiple UDIMS
Mesh Morpher 5.2.1 is Live! (02/26/2026)
  • [MM-1268] Wrapper now supports static meshes both as source and target
  • [MM-1269] Elastic Conformer now supports static meshes both as source and target
  • [MM-1270] Control Points in Wrapper now support UV mapping.
Mesh Morpher 5.2.0 is Live! (02/22/2026)
  • [MM-1267] Fixed a bug where the corrective morph targets wouldn't get highlighted when a DNA expression is selected.
Mesh Morpher 5.1.9 is Live! (02/20/2026)
  • [MM-1264] Fixed a bug in Geometry Cache sculpting where UVs wouldn't be properly loaded
  • [MM-1265] Fixed a bug in Animation Sequence sculpting where materials wouldn't be properly loaded.
  • [MM-1266] Fixed a bug with Static Mesh sculpting where sculpting with "only connected" enabled wouldn't work.
Mesh Morpher 5.1.8 is Live! (02/20/2026)
  • [MM-1258] Geometry Cache and animation sequence sculpting settings are now persistent.
  • [MM-1259] Geometry Cache sculpting now work in with welded meshes to avoid gaps at UV seams.
  • [MM-1260] Geometry Cache sculpting now supports non-constant topology
  • [MM-1261] Improved delta rotation in Geometry Cache sculpting.
  • [MM-1262] Fixed a bug in geometry cache and animation sculpting where the materials wouldn't load
  • [MM-1263] Fixed a bug in geometry cache sculpting where sculpting with "only connected" enabled wouldn't work.
Mesh Morpher 5.1.7.1 is Live! (02/15/2026)
  • [MM-1257] Implemented parallelization in geometry cache sculpting and animation sequence sculpting.
Mesh Morpher 5.1.7 is Live! (02/15/2026)
  • [MM-1256] Sculpting Geometry caches and animation sequences now correctly apply delta rotation when sculpting frame ranges.
Mesh Morpher 5.1.6 is Live! (02/13/2026)
  • [MM-1255] Fixed a possible LOD bug in Alembic Export, Delta Mush animation correction and Graph toolkit.
Mesh Morpher 5.1.5 is Live! (02/13/2026)
  • [MM-1242] Implemented Delta Mush Tool
  • [MM-1243] Implemented Delta Mush for Animation Sequences
  • [MM-1244] Implemented the ability to sculpt geometry caches
  • [MM-1245] Implemented the ability to sculpt animation sequences
  • [MM-1246] Implemented the ability to sculpt static meshes
  • [MM-1247] Fixed GPU Solver in Non-Rigid Fit
  • [MM-1248] Wrapper/Elastic Conformer have persistent settings
  • [MM-1249] Alembic Exporter default transformation now correctly matches Blender
  • [MM-1250] Implemented Frame Range widget in Alembic Exporter
  • [MM-1251] Alembic Exporter can now export frame ranges
  • [MM-1252] Various code clean-ups and optimizations
  • [MM-1253] Fixed toolkit tab name bug in Classic
  • [MM-1254] Fixed a bug in Mesh Morpher Classic where we incorrectly forward declare FAnimInstanceProxy
Mesh Morpher 5.1.4 is Live! (02/09/2026)
  • [MM-1238] Implemented the ability to change light angle in all viewports.
  • [MM-1239] Implemented the ability to display Content Browser in mesh morpher with ctrl + spacebar.
  • [MM-1240] Implemented GPU solver in Mesh Morpher
  • [MM-1241] Fixed a bug where the chlomod dlls wouldn't properly load when the plugin was installed in the engine directory.
Mesh Morpher 5.1.3 is Live! (02/05/2026)
  • [MM-1237] Fixed a bug where mesh morpher would crash the engine due to registering itself in persona windows without morph target tabs
Mesh Morpher 5.1.2 is Live! (01/26/2026)
  • [MM-1234] Implemented Import Organization Data
  • [MM-1235] Implemented Export Organization Data
  • [MM-1236] Fixed various performance bugs in Organization Data
Mesh Morpher 5.1.1 is Live! (01/25/2026)
  • [MM-1227] Implemented Meta data for Morph Target and Animation curve lists
  • [MM-1228] Rename Morph Target now supports regex
  • [MM-1229] Rename Morph Target now supports bulk rename
  • [MM-1230] Implemented custom Morph Target viewer in Persona
  • [MM-1231] Improved Non Rigid Fit
  • [MM-1232] Improved Rigid Fit
  • [MM-1233] Fixed Toolkit focus.
Mesh Morpher 5.1.0 is Live! (01/02/2026)
  • [MM-1225] Improved PoseDeltas to work correctly with inverse quaternions when bone rotations are involved.
  • [MM-1226] Viewport saves/loads camera settings
Mesh Morpher 5.0.9 is Live! (12/28/2025)
  • [MM-1223] Added new Non Rigid Fit algorithm
  • [MM-1224] Old NonRigidFit algorithm is renamed to Elastic Conformer.
Mesh Morpher 5.0.8 is Live! (12/07/2025)
  • [MM-1220] Fixed a possible crash in Mesh Morpher Mesh Component where FindingNearestTriangles might return invalid triangle ids and crash
  • [MM-1221] Alembic Exporter now writes FaceSets
  • [MM-1222] Alembic Exporter now computes Normals
Mesh Morpher 5.0.7.2 is Live! (12/04/2025)
  • [MM-1219] Fixed symmetry with Connected vertices ROI in sculpt tools.
Mesh Morpher 5.0.7.1 is Live! (12/04/2025)
  • [MM-1217] Fixed the ability to switch symmetry in sculpting tools
  • [MM-1218] Symmetry default value changed to X axis in sculpting tools
Mesh Morpher 5.0.7 is Live! (12/04/2025)
  • [MM-1214] Greatly Improved Alembic Exporter
  • [MM-1215] Transform Tool now updated mesh bounds so it renders properly
  • [MM-1216] Fixed symmetry in sculpting tools
Mesh Morpher 5.0.6 is Live! (12/03/2025)
  • [MM-1213] Fixed Symmetry in Mesh Morpher Mesh Component
Mesh Morpher 5.0.5 is Live! (12/02/2025)
  • [MM-1212] Greatly improved Alembic Exporter
Mesh Morpher 5.0.4 is Live! (11/29/2025)
  • [MM-1206] Alembic export now uses import data
  • [MM-1207] Alembic export now holds some additional meta data
  • [MM-1208] Implemented Geometry Cache Validation functionality which aims to match the Geometry Cache track names with material names.
  • [MM-1209] Alembic export now preserve the animation sequence frame rate
  • [MM-1210] Fixed a bug where last frame in the alembic export would be skipped
  • [MM-1211] Fixed some UV issues across Mesh Morpher
  • [MM-1212] Fixed a bug in Alembic Preview where seeking backwards would crash
Mesh Morpher 5.0.3 is Live! (11/14/2025)
  • [MM-1203] Runtime Projector now works the same as In-Editor.
  • [MM-1204] Fixed a bug with Runtime Projector where applying deltas to higher LODs wouldn't correctly work
  • [MM-1205] Fixed Camera Speed for 5.7 and above
Mesh Morpher 5.0.2 is Live! (11/05/2025)
  • [MM-1202] Implemented Unpack RigLogic functionality in poser (5.6 and above)
Mesh Morpher 5.0.1 is Live! (10/30/2025)
  • [MM-1201] Improved Project Tool
Mesh Morpher 5.0.0 is Live! (10/29/2025)
  • [MM-1197] Improved performance of all sculpting tools
  • [MM-1198] Implemented throttling for handle based tools
  • [MM-1199] Implemented Transparent Material Mode for sculpting tools.
  • [MM-1200] Fixed a bug with handle based tools that would cause a silent crash when toggling selection mode or when switching to other tool
Mesh Morpher 4.9.9 is Live! (10/15/2025)
  • [MM-1196] Implemented Post-Processing in Wrapper which solves intersections with the Source
Mesh Morpher 4.9.8 is Live! (10/13/2025)
  • [MM-1195] Implemented the ability to remove RBF data in Transfer DNA.
Mesh Morpher 4.9.7 is Live! (10/08/2025)
  • [MM-1194] Improved RBF deformer
Mesh Morpher 4.9.6 is Live! (10/06/2025)
  • [MM-1191] Improved Mirror Tool
  • [MM-1192] Fixed getting Normals in MM Mesh Component
  • [MM-1193] Greatly Improved Project Tool
Mesh Morpher 4.9.5 is Live! (10/03/2025)
  • [MM-1188] Improved Wrapper and landmark system in Wrapper drastically
  • [MM-1189] Improved the speed of FBX importer
  • [MM-1190] Fixed Mesh Import for runtime
Mesh Morpher 4.9.4 is Live! (09/29/2025)
  • [MM-1187] Implemented the ability to re-create DNA expression animation curves
Mesh Morpher 4.9.3 is Live! (09/25/2025)
  • [MM-1182] Removed Ray Tracing option
  • [MM-1183] Fixed a possible bug in Mesh Streaming was sending a 1-byte heartbeat that could make the client disconnect
  • [MM-1184] Improved Non_rigid fitting
  • [MM-1185] Non-Rigid fit speed has been improved by a lot
  • [MM-1186] Simplified Non-Rigid fitting options.
Mesh Morpher 4.9.2 is Live! (09/22/2025)
  • [MM-1173] Fixed a bug in Scene Proxy for Mesh Component
  • [MM-1174] Fixed a bug in Mesh Component when recomputing Normals
  • [MM-1175] Fixed a bug in OBJ exporter where unused empty UVs and Normals where added
  • [MM-1176] Vectorized Wrapper Rigid and Non-Rigid fit functionality
  • [MM-1177] Improved Regular smoothing in Non-Rigid Fit
  • [MM-1178] Implemented Point-To-Plane projection in Wrapper
  • [MM-1179] Implemented Displacement clamping in Non-Rigid fit which aims to reduce irrelevant correspondences.
  • [MM-1180] Improved the overall speed of Non-Rigid Fit algorithm
  • [MM-1181] Updated Mesh Stream icon
Mesh Morpher 4.9.1 is Live! (09/18/2025)
  • [MM-1172] Implemented Guide Morph Target in Copy Morph Targets
Mesh Morpher 4.9.0 is Live! (09/15/2025)
  • [MM-1171] Fixed FBX Importer to load only LOD0 for meshes exported by blender
Mesh Morpher 4.8.9 is Live! (09/15/2025)
  • [MM-1167] Fixed OBJ exporter. Now it correctly exports UV and Normal Layouts and not causing issues anymore with welded meshes.
  • [MM-1168] Greatly Improved FBX/OBJ importer
  • [MM-1169] Added parallelism in FBX importer
  • [MM-1170] Improved DNA export to OBJ to respect UV and Normal layouts
Mesh Morpher 4.8.8 is Live! (09/12/2025)
  • [MM-1164] Copy Morph Target now has the ability to auto-scale transferred morph targets
  • [MM-1165] Greatly improve Copy Morph Targets
  • [MM-1166] Implemented Copy Delta Method. Additive and Replace ('Replace' is more robust, while 'Additive' is faster but assumes similar base meshes.)
Mesh Morpher 4.8.7 is Live! (09/07/2025)
  • [MM-1163] Fixed a bug that would apply the deformation coming from Mesh Stream twice, making the process slow.
Mesh Morpher 4.8.6 is Live! (09/07/2025)
  • [MM-1161] Implemented Mesh Streaming Tool
  • [MM-1162] Fixed a bug where loading an RBF Controls asset would crash if canceled.
Mesh Morpher 4.8.5 is Live! (08/23/2025)

[MM-1160] Fixed a bug where DNA blendshapes wouldn't be correctly saved

Mesh Morpher 4.8.4 is Live! (07/23/2025)
  • [MM-1154] Implemented the ability to switch LODs
  • [MM-1155] Implemented the ability to Sculpt LODs
  • [MM-1156] Implemented the ability to overwrite LODs with Create from Mesh Files
  • [MM-1157] Implemented the ability to export mesh LODs and Animation Curves applied to LODs
  • [MM-1158] Implemented the ability to export texture masks for LODs
  • [MM-1159] Improved Lock Camera in Wrapper
Mesh Morpher 4.8.3 is Live! (07/18/2025)
  • [MM-1147] Implemented feature aware correspondence finder in Wrapper.
  • [MM-1148] Implemented density aware correspondence finder in Wrapper.
  • [MM-1149] Implemented subdivision in Wrapper.
  • [MM-1150] Removed sampling from Wrapper.
  • [MM-1151] Implemented Anisotropic smoothing in Wrapper.
  • [MM-1152] GREATLY improved performance and quality in Wrapper.
  • [MM-1153] Simplified options in Wrapper. Now settings are more user-friendly.
Mesh Morpher 4.8.2 is Live! (07/11/2025)
  • [MM-1146] Handle body DNA correctly in 5.6
Mesh Morpher 4.8.1 is Live! (06/04/2025)
  • [MM-1145] DNA Compatibility with 5.6
Mesh Morpher 4.8.0 is Live! (05/26/2025)
  • [MM-1142] Fixed a possible bug with Inlier Finder in Wrapper
  • [MM-1143] Implemented the ability to load only rotations from bonesnapshots in Poser
Mesh Morpher 4.7.9 is Live! (05/25/2025)
  • [MM-1140] Changed the default Landmark Weight in Wrapper to 100
  • [MM-1141] Implemented Convert DNA expressions in Poser which allows us to convert expressions from one skeleton hierarchy to another.
  • [MM-1142] Fixed KNN in Wrapper`s Affine Transformation
Mesh Morpher 4.7.8 is Live! (05/24/2025)
  • [MM-1137] Wrapper has greatly improved rigid fitting
  • [MM-1138] Wrapper has greatly improved non-rigid fitting
  • [MM-1139] Landmark system in Wrapper has been greatly improved
Mesh Morpher 4.7.7 is Live! (05/19/2025)
  • [MM-1136] Implemented Cage Deformer Tool
Mesh Morpher 4.7.6 is Live! (05/16/2025)
  • [MM-1135] Fixed a possible bug in RBF Deformer Tool that would crash the engine due to NaN transformation in certain cases.
Mesh Morpher 4.7.5 is Live! (05/16/2025)
  • [MM-1134] RBF Deformer Tool Transform gizmo now updates every frame instead of the end of transformation.
Mesh Morpher 4.7.4 is Live! (05/16/2025)
  • [MM-1133] RBF Deformer tool now supports full transformations. location, rotation, scale.
Mesh Morpher 4.7.3 is Live! (05/15/2025)
  • [MM-1127] Implemented Symmetry in RBF Deformer tool
  • [MM-1128] Implemented the ability to load/save RBF Control Points
  • [MM-1129] Implemented the ability to save pose as RBF Control Points asset
  • [MM-1130] RBF Deformer now has the ability to work with vertex selection
  • [MM-1131] RBF Deformer now has the ability to ignore boundary vertices
  • [MM-1132] Improve undo/redo system in RBF Deformer Tool
Mesh Morpher 4.7.2 is Live! (05/09/2025)
  • [MM-1126] Implemented new Skeleton Fitting algorithm that handles scaled down deformations much better.
Mesh Morpher 4.7.1 is Live! (05/01/2025)
  • [MM-1124] Mirroring Tool now has the ability to average the selected neighbors amount to the mirrored position. This allows for non-symmetric topologies to be mirrored at the cost of losing a little bit of detail due to averaging.
  • [MM-1125] Gaussian Kernel in RBF Deformer is now Local Kernel, as intended.
Mesh Morpher 4.7.0 is Live! (04/28/2025)
  • [MM-1123] Fixed Control Point creation in RBF Deformer in UE 5.5
Mesh Morpher 4.6.9 is Live! (04/28/2025)
  • [MM-1119] Implemented RBF Deformer sculpting tool
  • [MM-1120] Implemented rotation in Lattice deformer
  • [MM-1121] Wrapper has different vertex range variable for non-rigid and rigid fit
  • [MM-1122] bUpdateDNAAssetBlendshapes is enabled by default
Mesh Morpher 4.6.8 is Live! (04/20/2025)
  • [MM-1115] Improved Control Points(Landmarks) in Wrapper
  • [MM-1116] Improved Wrapper algorithm
  • [MM-1117] Implemented IDW in Wrapper to propagate deformation to different resolution mesh
  • [MM-1118] Implemented the ability to find correspondences in non-rigid algorithm in wrapper based on the Source mesh Surface.
Mesh Morpher 4.6.7 is Live! (04/17/2025)
  • [MM-1114] Fixed a bug with Transform Tool where Mesh Morpher would crash if the tool was open with a selection
Mesh Morpher 4.6.6 is Live! (04/14/2025)
  • [MM-1110] Bone widget now displays index as well
  • [MM-1111] Improved Transform Tool
  • [MM-1112] Implemented the ability to Lock/Unlock bones in poser
  • [MM-1113] Creating new Morph Target shortcut(Ctrl + A) has been changed to Ctrl + Alt + A
Mesh Morpher 4.6.5 is Live! (04/08/2025)
  • [MM-1107] Improved creating DNA Expressions from Morph Targets
  • [MM-1108] Added the ability in Poser to disable re-inserting missing rotation attributes when Baking Expressions
  • [MM-1109] Having a Morph Target and Expression Curve selected when opening Create DNA Expression will not attempt to automatically match all other expressions
Mesh Morpher 4.6.4 is Live! (04/05/2025)
  • [MM-1106] Implemented the ability to Preserve Location in Blend Tool
Mesh Morpher 4.6.3 is Live! (04/04/2025)
  • [MM-1100] Removed Invert Masking Boolean
  • [MM-1101] Implemented Invert Selection
  • [MM-1102] Implemented Smoothing Outskirts in Restore Side and Manual Restore (Not Relative restore)
  • [MM-1103] Implemented Smoothing Outskirts in Transform Tool
  • [MM-1104] Implemented Smoothing Outskirts in Blend Tool
  • [MM-1105] Improved Undo/Redo in Transform Tool
Mesh Morpher 4.6.2 is Live! (03/25/2025)
  • [MM-1098] Fixed a possible crash when trying to save a morph target on a mesh with corrupted import data
  • [MM-1099] Implemented Inverse Skinning in wrapper
Mesh Morpher 4.6.1 is Live! (03/14/2025)
  • [MM-1096] Implemented Map asset for Create DNA Expression from Morph Target
  • [MM-1097] Create DNA Expression from Morph Target now first search for matching Morph Targets
Mesh Morpher 4.6.0 is Live! (03/13/2025)
  • [MM-1089] Implemented the ability to add DNA Bones to Expressions
  • [MM-1090] Implemented the ability to view all expressions associated with DNA Bones
  • [MM-1091] Fixed a possible DNA bug where adding rotations to certain bones and expressions wouldn't work due to DNA pruning
  • [MM-1092] Show DNA Expressions Bones now displays the bones in Bone List in Poser
  • [MM-1093] Implemented the ability to bulk Create DNA expressions
  • [MM-1094] Added Toolbar button and icon for Create DNA Expression from Morph Target
  • [MM-1095] Added asset icons and thumbnail for Bonesnapshot, Standalone Morph Target and Standalone Mask Selection
Mesh Morpher 4.5.9 is Live! (03/02/2025)
  • [MM-1088] Create DNA Expressions now has the ability to automatically bake the DNA expression
Mesh Morpher 4.5.8 is Live! (02/26/2025)
  • [MM-1082] Added an UV sampler as a secondary failover on UV Matching across Mesh Morpher
  • [MM-1083] Fixed a bug with material in Append Mesh
  • [MM-1084] Transfer Weights now allows to transfer weights to meshes based on Closest Point and UV Matching
  • [MM-1085] Transfer Weights now allows to fit skeleton based on the new weights
  • [MM-1086] Transfer Weights now also transfers DNA asset, post process blueprint and default animation rig
  • [MM-1087] Transfer Weights now has persistent settings.
Mesh Morpher 4.5.7 is Live! (02/24/2025)
  • [MM-1079] Implemented Transfer Weights by UV Match in Append Mesh
  • [MM-1080] Baking grooms now checks for decimation settings in Groom Asset. If decimation values are not 1.0 then baking gets skipped
  • [MM-1081] Improved Matching By UV across Mesh Morpher. Vertices with no exact UV match are now UV projected to find their correspondence
Mesh Morpher 4.5.6 is Live! (02/18/2025)

[MM-1077] Implemented undo/redo for irreversible functions

[MM-1078] Implemented the ability to manually check for updates

Mesh Morpher 4.5.5 is Live! (02/16/2025)
  • [MM-1074] Fixed a bug with delete Morph target
  • [MM-1075] Fixed a bug with rename Morph target
  • [MM-1076] Added undo/redo for Morph Target operations
Mesh Morpher 4.5.4 is Live! (02/13/2025)
  • [MM-1072] Fixed a possible issue with Rename Morph Targets
  • [MM-1073] Fixed possible crashes across Mesh Morpher
Mesh Morpher 4.5.3 is Live! (02/13/2025)
  • [MM-1070] Implemented the ability to add animation curves
  • [MM-1071] Implemented the ability to remove selected animation curves

Patch Notes Archive

Classic › Patch Notes

Patch Notes Archive

[MM-1068] Regenerating Import Data has been greatly improved and now preserves Morph Targets 

Mesh Morpher 4.5.2 is Live! (02/12/2025)
  • [MM-1068] Regenerating Import Data has been greatly improved and now preserves Morph Targets
  • [MM-1069] Implemented an extra validation in PoseDeltas so Mesh Morpher won't crash when the skeletal meshes are corrupted
Mesh Morpher 4.5.1 is Live! (02/11/2025)
  • [MM-1066] Implemented the ability to Merge Skeleton in Append Mesh
  • [MM-1067] Implemented the ability to set LOD Mapping in Append Mesh
Mesh Morpher 4.5.0 is Live! (02/7/2025)
  • [MM-1056] Implemented the ability to automatically create correctives for fitted dna expressions
  • [MM-1057] Implemented Inverse Skinning in Poser in Update From Pose
  • [MM-1058] Implemented DQS in Create from Mesh Files
  • [MM-1059] Implemented DQS in Pose
  • [MM-1060] Implemented DQS in Component Capture
  • [MM-1061] Implemented Create DNA Expression with DQS, which replaces the old To Bonesnapshot with advanced fitting enabled
  • [MM-1062] Implemented Dual Quaternion Skinning in Sculpt Tools
  • [MM-1063] Added Transfer DNA icon
  • [MM-1064] Added the ability to enable/disable Bone Smoothing in Create DNA Expression
  • [MM-1065] Fixed a bug when Adding new Morph Target with an existing name that is not empty wouldn't work
Mesh Morpher 4.4.9 is Live! (02/5/2025)
  • [MM-1065] Fixed a bug when Adding new Morph Target with an existing name that is not empty wouldn't work
Mesh Morpher 4.4.8 is Live! (02/4/2025)
  • [MM-1054] Implemented the ability to remap morph targets
  • [MM-1055] Renaming Morph Targets now asks to overwrite existing morph target if already exists.
Mesh Morpher 4.4.7 is Live! (02/2/2025)
  • [MM-1051] Added the ability to Save/Load/Reset Mappings in Transfer DNA
  • [MM-1052] Matching Pivots in Transfer DNA now works correctly without having to re-bake the mesh
  • [MM-1053] Implemented the ability to zero expressions in Transfer DNA
Mesh Morpher 4.4.6.2 is Live! (02/1/2025)
  • [MM-1050] Fixed a bug where setting a Start Bone in Transfer DNA would crash
Mesh Morpher 4.4.6.1 is Live! (02/1/2025)
  • [MM-1049] Fixed Transfer DNA to work with any skeleton hierarchy
Mesh Morpher 4.4.6 is Live! (01/31/2025)
  • [MM-1047] Fixed a bug with Load Expression in Poser
  • [MM-1048] Implemented Transfer DNA
Mesh Morpher 4.4.5 is Live! (01/30/2025)
  • [MM-1045] License keys are stored more securely
  • [MM-1046] Adding multiple morph targets now is fast
Mesh Morpher 4.4.4 is Live! (01/26/2025)
  • [MM-1043] Mirroring Poses Drivers in Pose Driver Editor now also mirrors pose names
  • [MM-1044] Implemented the ability to rename Poses in Pose Driver Editor
Mesh Morpher 4.4.3 is Live! (01/25/2025)
  • [MM-1038] Improved wireframe display for selection in sculpt tools
  • [MM-1039] Skeletal mesh shows as selected in Create from Mesh Files
  • [MM-1040] Drawing selection in wireframe mode now uses mask selection wireframe setting
  • [MM-1041] Implemented marquee bone selection in poser and wrapper
  • [MM-1042] Transforming a bone selection now works properly if the selection has both parent and child bones
Mesh Morpher 4.4.2 is Live! (01/23/2025)
  • [MM-1034] Fixed a crash where On End PIE would crash when trying to restore a skeletal mesh created at runtime
  • [MM-1035] Fixed a bug where bulk exporting standalone morph targets would crash when canceling in the select folder dialog
  • [MM-1036] Fixed a bug in sculpt tools where indicator brush settings wouldn't update unless closing and re-opening the tool
  • [MM-1037] Wireframe mode now displays colored selection
Mesh Morpher 4.4.1 is Live! (01/18/2025)
  • [MM-1033] Fixed a possible crash on Recompute Normals
Mesh Morpher 4.4.0 is Live! (01/18/2025)
  • [MM-1031] Fixed a bug in Append Meshes where appending an auto-generated LOD would crash
  • [MM-1032] Fixed a possible crash in Remove from Mesh
Mesh Morpher 4.3.9 is Live! (01/18/2025)
  • [MM-1027] Changing FOV now immediately updates in viewport
  • [MM-1028] Implemented the ability to disable Surface Projection in Copy Morph Target
  • [MM-1029] Copying Bulk Morph Targets now notifies users on finish
  • [MM-1030] Implemented the ability to bake groom assets on mesh bake
Mesh Morpher 4.3.8 is Live! (01/11/2025)
  • [MM-1025] Fixed a bug with Remove from Mesh where re-indexing material ids wouldn't work properly.
  • [MM-1026] Fixed icon in Append Meshes
Mesh Morpher 4.3.7 is Live! (01/10/2025)
  • [MM-1023] Implemented the ability to bulk export to standalone morph targets
  • [MM-1024] Fixed a bug that would crash PIE when end play on duplicated skeletal mesh
Mesh Morpher 4.3.6 is Live! (01/05/2025)
  • [MM-1020] Fixed a bug where brush sphere indicators wouldn't be set to invisible once a sculpt tool is unloaded.
  • [MM-1021] Fixed Marquee selection in Lattice tool to work with all desktop resolutions
  • [MM-1022] Fixed Marquee selection in Masking to work with all desktop resolutions
Mesh Morpher 4.3.5 is Live! (12/25/2024)
  • [MM-1019] Brush Size and Symmetry option in sculpting tools have been moved outside of the side panel.
Mesh Morpher 4.3.4 is Live! (12/22/2024)
  • [MM-1018] Implemented marquee selection in sculpting tools.
Mesh Morpher 4.3.3 is Live! (12/20/2024)
  • [MM-1012] Capturing Component now works without deformer graphs enabled
  • [MM-1013] Fixed a bug with Displace and Laplacian Smooth tools where dragging cursor on top of the mesh would apply Move tool.
  • [MM-1014] Mirror Tool is now moved to separate tool.
  • [MM-1015] Added the ability to draw skeleton in sculpting tools.
  • [MM-1016] Implemented the ability to set selection bone pivot in sculpt tools.
  • [MM-1017] Implemented the ability to capture Bonesnapshot from Sequencer Component
Mesh Morpher 4.3.2 is Live! (12/19/2024)
  • [MM-1008] Implemented the ability to select Lattice points inside meshes
  • [MM-1009] Reset and Refresh Curves are now disabled when no mesh is selected
  • [MM-1010] Lattice deformer now supports multiple selection. Hold shift to remove from selection, hold control to add to selection.
  • [MM-1011] Implemented Lattice symmetry
Mesh Morpher 4.3.1 is Live! (12/17/2024)
  • [MM-1005] Implemented "Recents" in Mesh Morpher Toolkit
  • [MM-1006] Implemented the ability to refresh Morph Targets/Curves list
  • [MM-1007] Capturing Component can take a NewMorphName input
Mesh Morpher 4.3.0 is Live! (12/15/2024)
  • [MM-1000] Mesh Morpher now fully works with Corrective Morph Targets
  • [MM-1001] Improved Capturing Skeletal Mesh Components
  • [MM-1002] Create from FBX now fully works with Corrective Morph Targets
  • [MM-1003] Capturing Skeletal Mesh Components now fully works with Corrective Morph Targets
  • [MM-1004] Implemented the option to load Morph Target in or without pose.
Mesh Morpher 4.2.9 is Live! (12/14/2024)
  • [MM-995] Improved Copy Morph Target algorithm
  • [MM-996] Copy Morph Target now allows target selections assets.
  • [MM-997] Fixed a bug in To Mesh Deformer where Mesh Morpher would crash due to wrong vertex indices passed
  • [MM-998] Implemented the ability to create a Morph Target from current render state on selected component in sequencer/levelviewport
  • [MM-999] Create a Deformer Graph that can be assigned to skeletal meshes to apply deformations post skinning
Mesh Morpher 4.2.8 is Live! (12/11/2024)
  • [MM-988] Implemented the ability to bake to Skeleton Asset
  • [MM-989] Implemented the ability to not load driven bones when loading Pose Drivers from Anim BP
  • [MM-990] Implemented the ability to move Up and Down Pose drivers in the list
  • [MM-991] Implemented the ability to write Morph Targets to Pose Drivers
  • [MM-992] Load Pose Drivers from Anim BP has new dialog window
  • [MM-993] Save Pose Drivers to Anim BP has new dialog window
  • [MM-994] Fixed a bug where selecting a bone from the viewport wouldn't automatically scroll to it in the bone list.
Mesh Morpher 4.2.7 is Live! (12/07/2024)
  • [MM-987] Fixed Remesh to Target Edge Length
Mesh Morpher 4.2.6 is Live! (12/05/2024)
  • [MM-986] Implemented the ability to stitch meshes and morph targets by Bone Weights. This assumes the boundary vertices of the meshes already have the correct topology and bone weights and that at some point they were playing nice together. This new functionality has been tested with Meta Humans only and it doesn't work with different body types. It's intended to repair meta humans and not extend them to automatically stitch head to different body types or vice versa.
Mesh Morpher 4.2.5 is Live! (12/01/2024)
  • [MM-985] Fixed a bug in Create Morph Target from Mesh.
Mesh Morpher 4.2.4 is Live! (11/24/2024)
  • [MM-983] Exporting to OBJ from Poser now exports render data.
  • [MM-984] Fixed a bug with Copy Morph Target that would crash Mesh Morpher in certain cases.
Mesh Morpher 4.2.3 is Live! (11/12/2024)
  • [MM-981] Bone List in Poser now has its own Tab. This allows for better access and interaction with skeletons.
  • [MM-982] Sculpt Tools now display specific properties in a separate movable widget.
Mesh Morpher 4.2.2 is Live! (11/07/2024)
  • [MM-979] Fixed a bug where selecting a DNA expression wouldn't mark it's correspondent Morph Target if the Morph Target was empty
  • [MM-980] Fixed a bug where saving an empty Morph Target wouldn't go through.
Mesh Morpher 4.2.1 is Live! (10/31/2024)
  • [MM-974] Implemented the ability to set Magnitude to DNA expressions
  • [MM-975] Fixed a possible crash in Remove Mesh Data
  • [MM-976] Bake Skeleton in Poser has been renamed to Bake
  • [MM-977] Bake Morph Target has been removed. Poser can be used to Bake Morph Targets
  • [MM-978] Fixed an issue where Mesh Morpher would crash when saving morph targets for meshes that have vertices with no triangles
Mesh Morpher 4.2.0 is Live! (10/29/2024)
  • [MM-971] Fixed a bug Bake Skeletal Mesh where baking would sometimes offset the mesh
  • [MM-972] Fixed a bug Bake Skeleton in Poser where baking would sometimes offset the mesh
  • [MM-973] Implemented the ability to load Post Process animation blueprint with rotation only
Mesh Morpher 4.1.9 is Live! (10/23/2024)
  • [MM-970] Morph Target to Bonesnapshot is using again Render Data due to the fact that some skeletal meshes(meta human bodies as well) can have corrupted import data.
Mesh Morpher 4.1.8.3 is Live! (10/20/2024)
  • [MM-968] Fixed a possible bug where subdividing a mask selection with boundary edges would crash Mesh Morpher
  • [MM-969] Fixed a bug where exporting a Morph Target with no deltas with export an empty file instead of the neutral mesh.
Mesh Morpher 4.1.8.2 is Live! (10/19/2024)
  • [MM-967] Fixed a possible bug that would crash Mesh Morpher when loading skeletal meshes with corrupted triangle data.
Mesh Morpher 4.1.8.1 is Live! (10/18/2024)
  • [MM-965] Fixed a bug in 5.5 Preview 1 that prevented settings to be saved.
  • [MM-966] Fixed various small bugs across Mesh Morpher
Mesh Morpher 4.1.8 is Live! (10/18/2024)
  • [MM-962] Fixed a bug in Append Meshes where when multiple meshes were appended at once the weights would be transferred only to the first one.
  • [MM-963] Loading Pose Drivers from Anim BP now loads the neutral pose from skeletal mesh.
  • [MM-964] Saving Pose Drivers now makes sure no duplicate curve names are generated.
Mesh Morpher 4.1.7.1 is Live! (10/09/2024)
  • [MM-961] Loading Pose Drivers from Anim BP now correctly adds rotation to the source bone even when the pose drivers assets don't match the skeletal mesh.
Mesh Morpher 4.1.7 is Live! (10/08/2024)
  • [MM-957] Implemented the ability to update neutral poses in pose drivers for selected post process anim bp
  • [MM-958] Implemented the ability to load in Poser pose drivers from selected post process anim bp
  • [MM-959] Improved the saving of pose drivers to animation blueprints
  • [MM-960] Morph Target to Bonesnapshot now uses import data
Mesh Morpher 4.1.6.1 is Live! (10/07/2024)
  • [MM-956] Fixed a bug with alembic support in UE 5.4 and above
Mesh Morpher 4.1.6 is Live! (10/06/2024)
  • [MM-955] Internally Mesh Morpher now uses import data and on export render data
Mesh Morpher 4.1.5 is Live! (10/05/2024)
  • [MM-952] Fixed a bug with Remove from Mesh where bone weights wouldn't be correctly Removed.
  • [MM-953] Standalone Selection now works correctly in Remove From Mesh and Remesher.
  • [MM-954] Fixed a newly introduced bug that prevented saving setting and patch notifications.
Mesh Morpher 4.1.4 is Live! (10/04/2024)
  • [MM-948] Huge Refactoring on the underlying morph target and baking functionality in UE 5.4 and above. This refactoring should ease up further development.
  • [MM-949] Fixed a bug that would crash Mesh Morpher when generating a bonesnapshot from a morph target and the skeleton would contain virtual bones.
  • [MM-950] Implemented the ability to generate an Animation Sequence with random poses for ML Deformer
  • [MM-951] Morph Target LOD projection now uses only Closest Neighbor

UE 5.2 and 5.3 are now in Legacy support.

Mesh Morpher 4.1.3 is Live! (09/30/2024)
  • [MM-946] Implemented the ability to mark and focus associated corrective morph targets for Meta Human expressions
  • [MM-947] In poser, enabling an animation curve will not reset the Morph Targets
Mesh Morpher 4.1.2 is Live! (09/27/2024)
  • [MM-944] Implemented the ability to re-orient bones on Bake Skeleton in Poser
  • [MM-945] Implemented the ability to stick bones to the closest bone segment in Poser
Mesh Morpher 4.1.1 is Live! (09/23/2024)
  • [MM-941] Append Mesh now has a preview
  • [MM-942] Implemented the ability in Append Mesh to transform appended meshes
  • [MM-943] Improved Bone Orientation in Morph Target to Bonesnapshot
Mesh Morpher 4.1.0 is Live! (09/19/2024)
  • [MM-938] Remove Section is now called Remove Mesh Data
  • [MM-939] Implemented the ability to remove standalone selection in Remove Mesh Data
  • [MM-940] Implemented the ability to preview in Remove Mesh Data
Mesh Morpher 4.0.9 is Live! (09/14/2024)
  • [MM-936] Implemented the ability to recalculate bone orientation in Morph Target to Bonesnapshot
  • [MM-937] Implemented the ability to set a bone where recalculating orientation stops in Morph Target to Bonesnapshot
Mesh Morpher 4.0.8 is Live! (09/09/2024)
  • [MM-932] Implemented the ability to load Bonesnapshots in Bone space.
  • [MM-933] Fixed a bug with frame number text input in main window which didn't allow to correctly scroll through frames.
  • [MM-934] Implemented a slider in Poser which allows to navigate through animation sequences directly.
  • [MM-935] Implemented the ability to update a frame in an animation sequence.
Mesh Morpher 4.0.7 is Live! (09/04/2024)
  • [MM-926] Subdivision now has Preview
  • [MM-927] Greatly improved subdivision algorithm
  • [MM-928] Implemented Remesher
  • [MM-929] Smooth Tool now can automatically ignore boundary vertices
  • [MM-930] Projecting Morph Targets has been slightly improved
  • [MM-931] Fixed some possible crashes with Mesh Morpher Mesh Component
Mesh Morpher 4.0.6 is Live! (08/20/2024)
  • [MM-925] Implemented the ability to Hide sections in Sculpting Tools.
Mesh Morpher 4.0.5 is Live! (07/27/2024)
  • [MM-921] Implemented Grab Sculpt Tool
  • [MM-922] Implemented Scale Sculpt Tool
  • [MM-923] Implemented Twist Sculpt Tool
  • [MM-924] Implemented Sculpt tool falloff types
Mesh Morpher 4.0.4 is Live! (07/26/2024)
  • [MM-919] Implemented the ability to load a bonesnapshot with Pivot Editor enabled
  • [MM-920] Slightly improved Spike Smoother in Laplacian Smooth Tool
Mesh Morpher 4.0.3 is Live! (07/16/2024)
  • [MM-916] Added menu to RigLogicNoBones node
  • [MM-917] Implemented the ability to paste bones from clipboard in RigLogicNoBone node
  • [MM-918] Implemented the ability to clear selected bones in RigLogicNoBone node
Mesh Morpher 4.0.2 is Live! (07/15/2024)
  • [MM-915] Added the ability in RigLogic anim node to select bones to ignore
Mesh Morpher 4.0.1 is Live! (07/14/2024)
  • [MM-911] Blend Sculpt tool now has 3 Blend Types: Replace, Append and Subtract
  • [MM-912] Move Tool now correctly moves along the Normals
  • [MM-913] Fixed a bug with export animation curves with bone movement to morph targets or obj files where the export in certain cases wouldn't be completely accurate.
  • [MM-914] Implemented a new animation node Anim Node Rig Logic No Bones which is a variant of the engine's Rig Logic node but without any bone movement.
Mesh Morpher 4.0.0 is Live! (07/12/2024)
  • [MM-904] Fixed a bug that would crash the engine on close when Mesh Morpher was opened with additional viewport windows(Poser etc)
  • [MM-905] Implemented the ability to transform bone selection in Poser.
  • [MM-906] Set Pivot from Selected Section now supports multiple bone selection
  • [MM-907] Add axis rotation now supports multiple bone selection
  • [MM-908] Adding Selected Bones to Pose Driver now supports multiple bone selection
  • [MM-909] Fixed a bug that wouldn't close the child Windows on Skeletal Mesh change
  • [MM-910] Transform Widget in Poser now supports Local and World Transforms
Mesh Morpher 3.9.9 is Live! (07/10/2024)
  • [MM-901] Implemented MoveCurvesToSkeleton
  • [MM-902] Implemented MoveCurvesToMesh
  • [MM-903] Fixed a newly introduced bug in 5.2 that wouldn't open the sculpting tools when a morph target was selected
Mesh Morpher 3.9.8.1 is Live! (07/09/2024)
  • [MM-900] Fixed a bug where windows with viewports wouldn't be properly cleaned up resulting in gpu memory getting filled
Mesh Morpher 3.9.8 is Live! (07/09/2024)
  • [MM-898] Reset in Poser now correctly reset bones
  • [MM-899] Fixed a bug where the meta human dna would cache only morph targets containing deltas.
Mesh Morpher 3.9.7 is Live! (07/05/2024)
  • [MM-895] Fixed a bug where baking DNA Mesh data wouldn't write correct normals
  • [MM-896] DNA To OBJ now exports section names
  • [MM-897] Implemented the ability to set scale and color on DNA to OBJ export
  • Updater.exe has been compiled now for x64 allowing bigger downloads. (Requires package download from website)
Mesh Morpher 3.9.6 is Live! (07/05/2024)
  • [MM-894] Implemented the ability to export DNA asset to OBJ
Mesh Morpher 3.9.5 is Live! (07/02/2024)
  • [MM-889] Implemented Blend Sculpt Tool
  • [MM-890] Baking DNA Bone Expression attempts to rebuild the mesh
  • [MM-891] Implemented the ability to Reset bone selection
  • [MM-892] Fixed a bug where Control Points and Ruler Points would not be rendered correctly with DPI Scale
  • [MM-893] Slightly improved the speed of wrapper
Mesh Morpher 3.9.4 is Live! (06/25/2024)
  • [MM-887] Greatly improved Wrapping algorithm
  • [MM-888] Fixed a newly introduced bug with Copy Morph Targets
Mesh Morpher 3.9.3 is Live! (06/24/2024)
  • [MM-882] Expression Bones are now color coded in the Bone List as well
  • [MM-883] Baking Meta Human Heads now automatically attempts to fix eye pivot bones. This can be Disabled in Bake Skeleton window.
  • [MM-884] Enabling an Animation curves now refreshes and resets enabled Morph Targets.
  • [MM-885] Add Morph Target now allows multiple row input enabling multiple morph target creation at once.
  • [MM-886] Fixed a bug on Mac where selecting a file in Create from Mesh File would hang the engine
Mesh Morpher 3.9.2 is Live! (06/14/2024)
  • [MM-878] Bone Transform Widget in Poser now allows copy and paste
  • [MM-879] Fixed a bug that would crash the engine when Bone Options Tab was hidden and then shown again in Poser
  • [MM-880] Advanced Fitting settings are now persistent
  • [MM-881] Implemented a Toolbar in Poser
Mesh Morpher 3.9.1 is Live! (06/13/2024)
  • [MM-876] Fixed a bug with Flatten Tool
  • [MM-877] Fixed a bug with Plane Tool
Mesh Morpher 3.9.0 is Live! (06/12/2024)
  • [MM-875] Implemented Advanced Bone Fitting for DNA Bone Expressions
Mesh Morpher 3.8.9 is Live! (06/12/2024)
  • [MM-873] Improved Mirroring Morph Targets
  • [MM-874] Fixed a possible crash in 5.4.2
Mesh Morpher 3.8.8 is Live! (06/10/2024)
  • [MM-869] Updated icon colors
  • [MM-870] Selected DNA bone expression now have their affected bones color coded
  • [MM-871] Fixed a bug in Remove Section where changing the LOD index wouldn't always refresh the list with the LOD sections
  • [MM-872] Bake DNA Expression now asks for confirmation
Mesh Morpher 3.8.7 is Live! (06/08/2024)
  • [MM-867] Greatly improved Meta Human DNA Bone Expressions Baking
  • [MM-868] Implemented the ability to move a bone without affecting its children
Mesh Morpher 3.8.6 is Live! (06/07/2024)
  • [MM-862] Fixed a bug that would crash the Engine on shutdown after Mesh Morpher was opened (UE 5.4.2).
  • [MM-863] Ability to write to dna file the bone expression changes.
  • [MM-864] Implemented the ability to Load Expression which loads from a bonesnapshots only the bones associated with the expression.
  • [MM-865] Implemented the ability to update DNA bone expression from a bonesnapshot
  • [MM-866] Updated UI theme (Thanks to Yassine Rahal)
Mesh Morpher 3.8.5.2 is Live! (06/06/2024)
  • [MM-861] Fixed a bug where DNA Bone expression changes wouldn`t be correctly calculated.
Mesh Morpher 3.8.5.1 is Live! (06/05/2024)
  • [MM-860] DNA Bone Expression changes can be exported to dna file
Mesh Morpher 3.8.5 is Live! (06/05/2024)
  • [MM-858] Implemented the ability to modify and bake DNA expressions (bone expressions)
  • [MM-859] Implemented the ability to display bones affected by DNA expression
Mesh Morpher 3.8.4 is Live! (06/03/2024)
  • [MM-852] Implemented the ability to Mirror Morph Targets
  • [MM-853] Implemented the ability to Mirror Poses
  • [MM-854] Implemented the ability to set End Bone on Bonesnapshot save
  • [MM-855] Implemented the ability to Remove Sections(experimental)
  • [MM-856] Alembic exporter now captures cloth simulation
  • [MM-857] Alembic exporter now captures physics simulation
Mesh Morpher 3.8.3 is Live! (05/23/2024)
  • [MM-849] Implemented Fix Spikes in Laplacian Smooth tool
  • [MM-850] Alembic exporter now captures curves from animation sequence.
  • [MM-851] Mesh Morpher now displays animation curves from skeletal meshes as well instead of only from skeleton
Mesh Morpher 3.8.2 is Live! (05/16/2024)
  • [MM-846] Implemented another layer of poses to be loaded. Users can now load Bonesnapshots and Sequences simultaneously. This should allow for extra possibilities when creating correctives for more complex poses.
  • [MM-847] Alembic Exporter now evaluates animation sequence completely.
  • [MM-848] Changing Pose or Reference Mesh now asks if the current opened Morph Target(if any) should be saved.
Mesh Morpher 3.8.1 is Live! (05/07/2024)
  • [MM-845] Fixed a bug with stitching
Mesh Morpher 3.8.0 is Live! (05/07/2024)
  • [MM-844] Modal windows now automatically scale based on resolution
Mesh Morpher 3.7.9 is Live! (05/05/2024)
  • [MM-842] Improved OBJ exporter
  • [MM-843] Improved OBJ importer
Mesh Morpher 3.7.8 is Live! (05/01/2024)
  • [MM-841] Fixed a possible bug with Recompute Normals where applying new normals would crash in certain cases after a mesh was appended.
Mesh Morpher 3.7.7 is Live! (05/01/2024)
  • [MM-838] Implemented a workaround for 5.4 bug with Persona that doesn't clear correctly its binding when the Persona window is closed. This resulted in a crash on mesh rebuild.
  • [MM-839] There is a new MaxKNN option in Edit->Settings that attempts to speed up the projection in certain operations. Higher values would mean more time to project.
  • [MM-840] Fixed a bug in Append Mesh where each LOD iteration would attempt to rebuild the mesh.
Mesh Morpher 3.7.6 is Live! (04/30/2024)
  • [MM-836] Improved Append Mesh
  • [MM-837] Fixed Transform tool bug where it wouldn't work correctly while scaling and rotating with preserve pivot point enabled.
Mesh Morpher 3.7.5 is Live! (04/30/2024)
  • [MM-834] Subdivision and Mesh Append now preserve correctly all attributes.
  • [MM-835] Implemented a possible fix for engine crash when mesh gets rebuild while opened in Persona
Mesh Morpher 3.7.4 is Live! (04/29/2024)
  • [MM-831] Implemented the ability to export Quad OBJs
  • [MM-832] Fixed a bug with Lattice Deformer Tool where the normals and spatial data wouldn't be regenerated on undo/redo
  • [MM-833] Fixed a bug with Transform Tool where the normals and spatial data wouldn't be regenerated on undo/redo
Mesh Morpher 3.7.3.1 is Live! (04/26/2024)

[MM-830] Fixed a bug with stitching where stitching wouldn't correctly work with enabled morph targets on reference mesh and when the delta vertices moved the boundary vertices away from their location..

Mesh Morpher 3.7.3 is Live! (04/25/2024)
  • [MM-824] Stitching now correctly recomputes normals
  • [MM-825] Stitching now preserves settings
  • [MM-826] Append mesh now preserves settings
  • [MM-827] Recompute Normals now preserves settings
  • [MM-828] Subdivide now preserves settings
  • [MM-829] Laplacian Smoothing now preserves settings
Mesh Morpher 3.7.2 is Live! (04/23/2024)
  • [MM-816] Improved Subdivision
  • [MM-817] Implemented Laplacian and Corrective Smoothing
  • [MM-818] Implemented the ability to subdivide selected sections
  • [MM-819] Improved the speed of ICP algorithm for certain operations
  • [MM-820] Improved Stitch Morph Target algorithm
  • [MM-821] Stitch Morph Target can now position on the closest edge. Useful for meshes with different vertex density.
  • [MM-822] Implemented the ability to merge skeletons
  • [MM-823] Load Bonesnapshot node is now available in Control Rig as well (only 5.4 and as experimental as it gets)
Mesh Morpher 3.7.1 is Live! (04/13/2024)
  • [MM-812] Fixed a newly introduced bug that would prevent getting correct correspondent from skeletal to welded mesh
  • [MM-813] OBJ export now exports per section color if selected
  • [MM-814] Fixed a bug that would prevent correct bulk animation curve export
  • [MM-815] Mesh Morpher can now be packaged in 5.4
Mesh Morpher 3.7.0 is Live! (04/12/2024)
  • [MM-810] Fixed a bug where Displace Tool would not correctly load Platform Data for certain texture formats.
  • [MM-811] Changed the Transfer Weight defaults on Subdivide Mesh to generate more accurate bone weight data.
Mesh Morpher 3.6.9 is Live! (04/10/2024)
  • [MM-806] Implemented the ability to subdivide meshes (5.4 and above)
  • [MM-807] Implemented Displace Tool
  • [MM-808] Implemented the ability to not apply Morph Targets to LODs.
  • [MM-809] Greatly improved the speed at which the resulted morph targets from sculpt tools are applied to the mesh. This should help working with high density meshes.
Mesh Morpher 3.6.8 is Live! (04/08/2024)
  • [MM-801] Implemented the ability to append meshes and transfer bone weights to new mesh data
  • [MM-802] Implemented the ability to transfer weights to another compatible skeletal mesh
  • [MM-803] Implemented the ability to copy morph targets from source with post process enabled or disabled
  • [MM-804] Fixed a possible bug with OBj export that might give unexpected results when subdivision steps higher than 0
  • [MM-805] Fixed a possible bug that would crash Mesh Morpher if opening Recompute Normals once the window was already open
Mesh Morpher 3.6.7.1 is Live! (03/31/2024)
  • [MM-800] Fixed a bug with Projection tool where projection wouldn't correctly work in certain cases.
Mesh Morpher 3.6.7 is Live! (03/29/2024)
  • [MM-797] Fixed a bug where commiting an animation curve value would reset it back to the original value
  • [MM-798] Added extra refining option to Morph Target to Bonesnapshot functionality
  • [MM-799] Morph Target to Bonesnapshot now has persistent settings
Mesh Morpher 3.6.6.1 is Live! (03/28/2024)
  • [MM-796] Improved bone fitting
Mesh Morpher 3.6.6 is Live! (03/28/2024)
  • [MM-795] Implementing the ability to create a Bonesnapshot for skeletal and reference skeletal mesh in Poser. The morph target has to have the same name on both meshes.
Mesh Morpher 3.6.5 is Live! (03/22/2024)
  • [MM-787] Requires re-entering license key. License information can be found in Saved\Config\WindowsEditor\MeshMorpher.ini file now (remove it from there if sharing the project)
  • [MM-788] Cleaned up the code
  • [MM-789] Implemented UObject smart pointers
  • [MM-790] Greatly improved skeleton fitting
  • [MM-791] Skeleton fitting allows fitting based on bone weights
  • [MM-792] Skeleton fitting allows fitting based on surface bones
  • [MM-793] Removed baking to skeleton asset
  • [MM-794] Fixed a possible issue that could crash when writing to dna asset with no geometry
Mesh Morpher 3.6.4 is Live! (03/20/2024)
  • [MM-786] Fixed a problem that could occur with Alembic Export.
Mesh Morpher 3.6.3 is Live! (03/20/2024)
  • [MM-785] Fixed a possible bug that could prevent bone updating in alembic export
Mesh Morpher 3.6.2 is Live! (03/18/2024)
  • [MM-783] Fixed a bug where exporting animation curves and morph targets by right clicking on the curve list, would export an obj with deltas from post process enabled mesh and default mesh
  • [MM-784] Implemented the ability to quickly disable post process in main toolkit
Mesh Morpher 3.6.1 is Live! (03/17/2024)
  • [MM-778] Dynamic Skeletal Mesh Component now have Set Bone Delta and Get Bone Delta functionality
  • [MM-779] Implemented the ability to create Texture Masks from Selection
  • [MM-780] Implemented the ability to bake Pivot editor to reference mesh in Poser
  • [MM-781] Implemented the ability to create Bonesnapshot from Reference Mesh in Poser
  • [MM-782] Fixed a potential memory leak in Create from Mesh Files
Mesh Morpher 3.6.0 is Live! (03/12/2024)
  • [MM-777] Fixed baking with removed scale
Mesh Morpher 3.5.9 is Live! (03/11/2024)
  • [MM-772] Loading Bonesnapshot now resets existing deltas
  • [MM-773] Fixed a bug where bone transforms would append post process changes
  • [MM-774] Fixed a bug where pivot editor bone transforms would append post process changes
  • [MM-775] Creating Bonesnapshots from Morph Target now allows a vertex sample to compute deltas
  • [MM-776] Saving Bonesnapshots now make sure post process is not part of the deltas.
Mesh Morpher 3.5.8.1 is Live! (03/09/2024)
  • [MM-771] Implemented the ability in Dynamic Skeletal Mesh Component in Load Bonesnapshot to skip deltas for bones that exists in leader pose components.
Mesh Morpher 3.5.8 is Live! (03/09/2024)
  • [MM-770] Implemented runtime DynamicSkeletalMeshComponent which enables bone transformation for blueprints at runtime for Skeletal Mesh Components.
Mesh Morpher 3.5.7.3 is Live! (03/07/2024)
  • [MM-768] Appended Meshes to OBJ Exports now have post process blueprints applied to them
  • [MM-769] Creating a Morph Target from an animation curve now doesn't contain any post process results
Mesh Morpher 3.5.7.2 is Live! (03/07/2024)
  • [MM-766] Fixed a newly introduced bug where loading Pose Driver Poses wouldn't work
  • [MM-767] Fixed a newly introduced bug where loading bone transformations in Deformer Graph wouldn't work.
Mesh Morpher 3.5.7.1 is Live! (03/06/2024)
  • [MM-765] On Bake reset bone deltas
Mesh Morpher 3.5.7 is Live! (03/06/2024)
  • [MM-764] Fixed possible issues and artifacts that could occur when Baking and Post Process blueprints would transform bones.
Mesh Morpher 3.5.6 is Live! (03/06/2024)
  • [MM-762] Improved how Mesh Morpher handles post process blueprints
  • [MM-763] Blend Morph Targets takes into account post process to avoid additional possible deltas.
Mesh Morpher 3.5.5 is Live! (03/05/2024)
  • [MM-754] Implemented subdivision for OBj exports
  • [MM-755] Improved save assets dialog.
  • [MM-756] Animation Sequences and Pose Assets can be overwritten.
  • [MM-757] Reference mesh in Poser can only be a skeletal mesh
  • [MM-758] Implemented the ability in Poser to set leader pose for reference skeletal mesh.
  • [MM-759] Animation Sequences and Pose Assets editors close automatically on save.
  • [MM-760] Implemented the ability to save pose drivers to pose assets only without writing to animation blueprint
  • [MM-761] Fixed a bug where Load Pose from Context menu in Pose Driver would instead Update the Pose.
Mesh Morpher 3.5.4 is Live! (03/01/2024)
  • [MM-752] Alembic Exporter now provides different transform options.
  • [MM-753] Alembic exporter now correctly export unmirrored mesh data
Mesh Morpher 3.5.3 is Live! (02/26/2024)
  • [MM-749] Fixed mesh component to work properly with post process allowing users to load poses in post process and work correctly with them in Mesh Morpher
  • [MM-750] Animation curves don't get automatically set to 0 on create/delete/modify morph target
  • [MM-751] Implemented the ability in Load Bonesnapshot to enable/disable applying bones to parent shared bones.
Mesh Morpher 3.5.2.1 is Live! (02/18/2024)
  • [MM-748] Fixed a newly introduced bug that wouldn't allow users to select vertices further from current selection.
Mesh Morpher 3.5.2 is Live! (02/18/2024)
  • [MM-747] Transform Tool can now preserve pivot point on rotation
Mesh Morpher 3.5.1 is Live! (02/17/2024)
  • [MM-740] Fixed a bug that crashed Mesh Morpher when baking skeleton with virtual bones added.
  • [MM-741] Implemented the ability to simulate physics in Poser. Simulation can be disabled from Edit->Settings->bDisablePhysics
  • [MM-742] Implemented the ability to enable/disable Cloth Simulation in Poser
  • [MM-743] Implemented the ability to enable/disable CCD for all bodies in Poser
  • [MM-744] Implemented the ability to send a posed mesh to Deformer Graph allowing to apply deformer graphs to it and save it as a Morph Target. (>= 5.3)
  • [MM-745] Implemented the ability to send from Poser to Deformer Graph (>= 5.3)
  • [MM-746] Fixed a bug with sculpting tools where HitTesting selection wouldn't correctly ignore unwanted triangles.
Mesh Morpher 3.5.0 is Live! (02/11/2024)
  • [MM-739] Implemented a new Load Bonesnapshot node that doesn't run in Component Space. The old node is still available and is marked as (Legacy)
Mesh Morpher 3.4.9 is Live! (02/09/2024)
  • [MM-736] Scaling with Transform Tool now preserve pivot point.
  • [MM-737] Transform Widget is synced with the Gizmo.
  • [MM-738] Fixed Camera Speed Scalar.
Mesh Morpher 3.4.8.1 is Live! (02/08/2024)
  • [MM-735] Fixed a newly occurring bug that prevented saving changes in morph targets.
Mesh Morpher 3.4.8 is Live! (02/07/2024)
  • [MM-728] Improved performance of sculpting tools
  • [MM-729] Removed refinement from sculpt tools
  • [MM-730] Enabled Mode overrides for Mesh Morpher Component
  • [MM-731] Implemented Ray Tracing in Mesh Morpher Component
  • [MM-732] Improved performance of Transaction system(undo/redo)
  • [MM-733] Implemented Pen Pressure in Sculpting Tools.
  • [MM-734] Implemented the ability to enable/disable ray tracing for sculpting from Editor->Settings (requires Mesh Morpher restart)
Mesh Morpher 3.4.7 is Live! (02/01/2024)
  • [MM-727] Implemented the ability to create corrective bonesnapshots
Mesh Morpher 3.4.6 is Live! (01/31/2024)
  • [MM-720] Improved wrapper control points system.
  • [MM-721] Fixed a bug where loading a morph target would reload the mesh in other related tools like wrapper and poser.
  • [MM-722] Simplified Wrappers options so it's much easier to configure it
  • [MM-723] Added additional options to Non rigid wrapping that allow selection of vertex range and orientation separately from rigid settings.
  • [MM-724] Fixed a bug where changing source mesh in wrapper would attempt to notify all mesh morpher windows.
  • [MM-725] Optimized and fixed non rigid registration in wrapper.
  • [MM-726] Implemented Scale to OBJ export
Mesh Morpher 3.4.5 is Live! (01/12/2024)
  • [MM-712] Implemented the ability to Bulk Import from OBJ/FBX
  • [MM-713] Fixed a bug with Morph Target to Bonesnapshot that prevented to correctly calculate the bones above ignore bones in the hierarchy
  • [MM-714] Wrapper Target mesh gets divided and refined. Increased the vertex threshold to 5.0
  • [MM-715] Update From Pose in Poser now allows to update Morph Targets with Base from other Morph Targets or Animation Curves
  • [MM-716] Exporting to Animation Sequence now exports Morph Targets and Animation Curves with selected Weights
  • [MM-717] Implemented the ability to reset Weight Values to curve selection in Curve Lists.
  • [MM-718] Fixed a Bug where Morphed Directory would be disabled by default even though bulk import was enabled on Load Settings in Create From Mesh Files.
  • [MM-719] Automatically Overwrite in Create from Mesh Files now works for single file import as well.
Mesh Morpher 3.4.4 is Live! (01/07/2024)
  • [MM-709] Fixed a bug where smoothing in Sculpt, Pinch and Inflate wouldn't get registered for undo/redo.
  • [MM-710] Improved Tool subdivision
  • [MM-711] Implemented new Material mode Tension which allows to visualize per vertex stretch and compression.
Mesh Morpher 3.4.3 is Live! (01/06/2024)
  • [MM-697] Transform Tool now places the gizmo in the center of selection automatically.
  • [MM-698] Added key shortcut (B) that allows to dynamically change brush size moving mouse left and right
  • [MM-699] Added key shortcut (N) that allows to dynamically change brush falloff moving mouse left and right
  • [MM-700] Added key shortcut (S) that allows to dynamically change brush strength moving mouse left and right
  • [MM-701] Added remesher for sculpt tool
  • [MM-702] Added remesher for inflate tool
  • [MM-703] Added remesher for pinch tool
  • [MM-704] Moving along the normals now requires holding CTRL and moving left and right
  • [MM-705] Fixed a bug where falloff was inverted in sculpting tools
  • [MM-706] Fixed a bug where grabbing vertex ROI in sculpting tools wouldn't use full brush radius
  • [MM-707] Moving vertices along the Normal doesn't use falloff anymore
  • [MM-708] Step Size has been set to 0.001 by default in Sculpting Tools
Mesh Morpher 3.4.2 is Live! (01/05/2024)
  • [MM-691] Fixed a bug where Exporting a selection to OBJ wouldn't properly append additional meshes.
  • [MM-692] Fixed a bug that prevented cached mesh data update when exporting animation curves to obj in main toolkit.
  • [MM-693] Exporting to OBJ now automatically creates new sections for additional meshes
  • [MM-694] Ruler doesn't get enabled automatically on tool shutdown
  • [MM-695] Greatly improved the animation curve system in main toolkit.
  • [MM-696] Greatly improved the morph target system in main toolkit.
Mesh Morpher 3.4.1 is Live! (01/04/2024)
  • [MM-685] Optimized Sculpting Tools
  • [MM-686] Fixed a bug that wouldn't properly render a mesh section if material was null
  • [MM-687] Implemented the Ability to render section colors in Sculpt Tools
  • [MM-688] Revamped the rendering of Mesh Morpher Mesh Component
  • [MM-689] Revamped selection in Mesh Morpher Mesh Component
  • [MM-690] Added the ability to project on selected target sections.
Mesh Morpher 3.4.0.2 is Live! (12/31/2023)
  • [MM-681] Applying Smoothing to selection now correctly stores the action for Undo/Redo
  • [MM-682] Implemented the ability to subdivide projection target
  • [MM-683] Implemented Projection iterations
  • [MM-684] Implemented Projection Smoothing
Mesh Morpher 3.4.0.1 is Live! (12/30/2023)
  • [MM-679] Fixed a bug with Project tool when failing to project would provide a NaN vector
  • [MM-680] Fixed a possible bug with Smoothing while attempting to preserve volume.
Mesh Morpher 3.4.0 is Live! (12/30/2023)
  • [MM-671] Implemented the ability to Apply Smoothing Tool to selection or full mesh
  • [MM-672] Implemented the ability to set smoothing iteration in Apply Smoothing(manual)
  • [MM-673] Implemented the ability to preserve volume in Apply Smoothing(manual)
  • [MM-674] Implemented Project Tool which allows users to project on Reference Skeletal Mesh
  • [MM-675] Implemented the ability to Apply Restore Tool to selection or full mesh
  • [MM-676] Implemented the ability to preserve location in Apply Restore(manual)
  • [MM-677] Subdividing on Copy Morph Target applies refinement to source subdivide mesh.
  • [MM-678] Stitching doesn't create a seam anymore. We just stitch boundary vertices.
Mesh Morpher 3.3.9 is Live! (12/27/2023)
  • [MM-669] Fixed a bug where removing an enabled Morph Target wouldn't recreate the dynamical meshes internally
  • [MM-670] Improved asset picker performance while loading assets in Poser and Toolkit
Mesh Morpher 3.3.8 is Live! (12/26/2023)
  • [MM-668] Fixed a bug with overwriting bonesnapshots, rulers, pose drivers and control points assets
Mesh Morpher 3.3.7 is Live! (12/24/2023)
  • [MM-664] Fixed a bug that prevented bone list refresh on source mesh selection in Wrapper
  • [MM-665] Improved wrapping algorithm by refining subdivided source mesh.
  • [MM-666] Implemented the ability to set Max Sticky and Elastic Iterations in Wrapper
  • [MM-667] Fixed a bug that didn't update selected morph target pointer when refreshing morph target list.
Mesh Morpher 3.3.6 is Live! (12/21/2023)
  • [MM-663] Fixed a bug that prevented Morph Target export when exporting selection from Morph Targets list
Mesh Morpher 3.3.5 is Live! (12/18/2023)
  • [MM-658] Implemented the ability to remove Driven Bones in Pose Driver Creator
  • [MM-659] Selecting sequence and bonesnapshots has been improved in Poser and Wrapper
  • [MM-660] Loaded sequences in Poser now use Frame Index rather than frame time to provide better precision and accuracy when navigating through the sequence.
  • [MM-661] Implemented the ability to enable/disable Ruler
  • [MM-662] Ruler is disabled by default
Mesh Morpher 3.3.4 is Live! (12/18/2023)
  • [MM-657] Implemented the ability to mirror Pose Driver bones in Poser.
Mesh Morpher 3.3.3 is Live! (12/17/2023)
  • [MM-655] Implemented the ability to switch Poser transform gizmo from world to local coordinate system.
  • [MM-656] Fixed a bug that would prevent Pose Driver nodes created procedurally by Mesh Morpher to display correctly debug data.
Mesh Morpher 3.3.2 is Live! (12/16/2023)
  • [MM-651] Fixed a bug that would crash Mesh Morpher when selecting reference mesh and setting the master pose type to reference.
  • [MM-652] Fixed a bug that would export inverted Alembic.
  • [MM-653] Implemented the ability to exported flattened Alembic
  • [MM-654] Implemented the ability to add a child component in ABC exporter. Child gets own abc file.
Mesh Morpher 3.3.1 is Live! (12/15/2023)
  • [MM-650] Added the ability to enable curves and morph targets in main toolkit window, thus allowing us to easily sculpt correctives.
Mesh Morpher 3.3.0 is Live! (12/11/2023)
  • [MM-643] Implemented Add Axis Rotation in Poser
  • [MM-644] Bonesnapshot menu works with pivot editor enabled
  • [MM-645] Loading Sequences and Bonesnapshots now disable each other. Can't have both simultaneously.
  • [MM-646] Implement the ability to pick assets and overwrite them
  • [MM-647] Fixed a possible bug with undo/redo bone transforms
  • [MM-648] Implemented the ability to create Pose Drivers with Poser
  • [MM-649] Implemented the ability to export a pose to a Sequence
Mesh Morpher 3.2.9 is Live! (12/08/2023)
  • [MM-640] Fixed a bug in LOD baking when Baking Skeleton
  • [MM-641] Implemented the ability to ignore weighted bones when creating Bonesnapshot from Morph Target
  • [MM-642] Implemented the ability to select multiple bones and copy names of the selection
Mesh Morpher 3.2.8.2 is Live! (12/07/2023)
  • [MM-639] Improved alembic exporter
Mesh Morpher 3.2.8.1 is Live! (12/07/2023)
  • [MM-638] Fixed a bug with alembic exporter where certain animations would be exported with wrong bone transformations
Mesh Morpher 3.2.8 is Live! (12/07/2023)
  • [MM-630] Improved Morph Target to Bonesnapshot algorithm
  • [MM-631] Implemented the ability to match bones by vertex weight(Useful for big meshes like bodies) in Morph Target to Bonesnapshot
  • [MM-632] Implemented the ability to ignore bones containing strings(can use multiple strings divided by ;) in Morph Target to Bonesnapshot
  • [MM-633] Improved Focus at Cursor.
  • [MM-634] Implemented Focus at Cursor in Sculpting Tools
  • [MM-635] Implemented Focus at Cursor in Wrapper
  • [MM-636] Implemented Focus at Cursor in Poser
  • [MM-637] Implemented Alembic Exporter(can export skeletal meshes and sequences to abc)
Mesh Morpher 3.2.7.1 is Live! (11/28/2023)
  • [MM-629] Fixed a bug that would crash when in Blend, Bake Morph Target and Select Reference Mesh and a curve was enabled
Mesh Morpher 3.2.7 is Live! (11/27/2023)
  • [MM-627] Implemented Rigid Fitting in Wrapper which allows us to match rotation and scale of the source
  • [MM-628] Greatly improved Wrapper algorithm
Mesh Morpher 3.2.6 is Live! (11/25/2023)
  • [MM-620] Implemented Ruler in Poser
  • [MM-621] Implemented Ruler in Sculpt Tools
  • [MM-622] Fixed a bug with Wrapper that would project distorted resulted deltas back to the initial mesh
  • [MM-623] Fixed a bug with Wrapper where Mesh Morpher would crash when initializing with Pivot Editor enabled
  • [MM-624] Load Save and Save As Bonesnapshot menu button are disabled when Pivot Editor is enabled.
  • [MM-625] Removed Inverse Matching from Wrapper
  • [MM-626] Standalone selection assets now store identical mesh indices
Mesh Morpher 3.2.5 is Live! (11/19/2023)
  • [MM-612] Implemented Pivot Editor in Poser
  • [MM-613] Implemented the ability to Update Children in Pivot Editor
  • [MM-614] Improved Bone Editor performance in Poser
  • [MM-615] Fixed a bug where selecting a bug in Poser while symmetry is enabled would automatically attempt to rotate the symmetric bone
  • [MM-616] Improved bone undo/redo in Poser
  • [MM-617] Fixed a bug with Set Pivot Bone from Section where the Mesh wouldn't correctly translate with new bone transforms.
  • [MM-618] Implemented the ability to enable/disable Update Children in Set Pivot Bone from Section
  • [MM-619] Set Pivot Bone menu entry has been renamed to Set Pivot Bone from Section
Mesh Morpher 3.2.4 is Live! (11/16/2023)
  • [MM-608] Fixed a bug where changing between Sculpt Tools wouldn't reselect the mesh sections in the section list if any selection was made.
  • [MM-609] Implemented the ability to Set Animation Curves in Toolkit Main window.
  • [MM-610] Implemented the ability to Set Morph Targets in Toolkit Main window.
  • [MM-611] Poser now doesn't use Main Toolkit pose as base pose. Instead it only uses the Base Pose set from the Poser.
Mesh Morpher 3.2.3.1 is Live! (11/12/2023)
  • [MM-606] Fixed a bug where DNA asset blendshapes updates wouldn't be correctly stored
  • [MM-607] Disabling Mesh Data Bake will not bake Mesh Data to DNA asset
Mesh Morpher 3.2.3 is Live! (11/11/2023)
  • [MM-603] Implemented the ability to modify Meta Human blendshapes and export them to DNA asset.
  • [MM-604] Exporting to DNA asset now exports spine_04 translation
  • [MM-605] Greatly improved the speed of baking in Poser and Bake Morph Targets.
Mesh Morpher 3.2.2 is Live! (11/10/2023)
  • [MM-602] Improved speed of bulk Morph Target copy.
Mesh Morpher 3.2.1 is Live! (11/09/2023)
  • [MM-600] Implemented Clipping fix for Restore Tool. This functionality tries to move the vertices over the closest triangle. Could provide better results in certain cases.
  • [MM-601] Implemented the Ability to set pivot bone to mesh section selection
Mesh Morpher 3.2.0 is Live! (11/02/2023)
  • [MM-598] Implemented the ability to remove Scaling when Baking to Skeleton. This will preserve bones translation and rotation while setting the scale to (1,1,1)
  • [MM-599] Implemented the ability to preserve settings in Bake to Skeleton
Mesh Morpher 3.1.9 is Live! (10/28/2023)
  • [MM-592] Implemented the ability to export Animation Curves (bulk) to OBJ Files (Poser and any weighted curve list)
  • [MM-593] Implemented the ability to export Morph Targets (bulk) to OBJ Files (Poser and any weighted curve list)
  • [MM-594] Implemented the ability to enable Connected Only for brushes which allows brushes to affect only connected triangles.
  • [MM-595] Fixed a bug with undo/redo which crashed Mesh Morpher when actions where triggered too fast.
  • [MM-596] Fixed a bug where bInvertMask option would be saved and transferred on tool change.
  • [MM-597] Fixed a bug where increasing/decreasing brush size with key shortcut wouldn't save and transfer the new brush size on tool change
Mesh Morpher 3.1.8 is Live! (10/25/2023)
  • [MM-588] Renamed Blend window to the correct name "Blend" instead of "Bake"
  • [MM-589] Implemented the ability to select and copy name of the selected Morph Target in Blend
  • [MM-590] Implemented the ability to select and copy name of the selected Morph Target in Bake
  • [MM-591] Fixed a bug with Morph Target list that appeared in certain cases when Auto was enabled and then disabled
Mesh Morpher 3.1.7 is Live! (10/24/2023)
  • [MM-582] Fixed a bug with Transaction(Undo/Redo) for Sculpt tools
  • [MM-583] Improved Transaction(Undo/Redo) performance
  • [MM-584] Improved performance of Relative Restore
  • [MM-585] Improved performance of Side Restore
  • [MM-586] Implemented the ability to temporarily subdivide the morph target in Sculpt tools. Use with caution as the sculpt performance decreases the more subdivision steps.
  • [MM-587] Improved performance of lattice deformer
Mesh Morpher 3.1.6 is Live! (10/22/2023)
  • [MM-579] Implemented Lattice Deformer Tool
  • [MM-580] Fixed a selection bug with Tools that prevented to display selection when navigating through tools
  • [MM-581] Fixed a selection bug with Tools that would always add full section selection vertices even though some vertices were removed by masking.
Mesh Morpher 3.1.5.1 is Live! (10/20/2023)
  • [MM-578] Fixed a bug in Sculpt tool when changing the tool would only select back the section selection if having section selection and additional selected masked vertices
Mesh Morpher 3.1.5 is Live! (10/20/2023)
  • [MM-577] Implemented Relative Restore
Mesh Morpher 3.1.4 is Live! (10/19/2023)
  • [MM-557] Sculpt Tools now are listed as a side menu instead of a dropdown list.
  • [MM-558] Converted sculpt tools to C++
  • [MM-559] Implemented the ability to scale Modal Windows (In Edit->Settings.)
  • [MM-560] Moved Bone settings from Edit->Settings to Bone widget
  • [MM-561] Moved Control Points settings from Edit->Settings to Control Points widget
  • [MM-562] Moved Masking settings in Wrapper from Edit->Settings to Masking Widget
  • [MM-563] Implemented the ability to export selection and morph targets as welded/unwelded
  • [MM-564] Create from Mesh Files now preserves the settings
  • [MM-565] Export to OBJ now preserves the settings.
  • [MM-566] Implemented the ability to open a Current Pose from Poser in OBJ/FBX Importer
  • [MM-567] Implemented the ability to export a pose to OBJ file directly from Poser.
  • [MM-568] Added Tools menu to Poser
  • [MM-569] Implemented the ability to set or remove a Base Pose in Poser. A base pose is used when creating a corrective morph target which will contain the deltas between the Base Pose and the Current Pose.
  • [MM-570] Implemented the ability to open Base Pose from Poser to OBJ/FBX Importer
  • [MM-571] Copy Morph Target now preserve settings
  • [MM-572] Create From Mesh now preserve settings
  • [MM-573] Implemented confirmation message when overwriting bonesnapshots.
  • [MM-574] Transform Tool now supports Invert Mask
  • [MM-575] Added progress dialog to selection export
  • [MM-576] Implemented the ability to focus selected bone.
Mesh Morpher 3.1.3 is Live! (10/03/2023)
  • [MM-553] Implemented Progress Bar on Copy multiple Morph Targets
  • [MM-554] Implemented the ability to copy the name(s) of selected in Curve lists
  • [MM-555] Fixed a bug where sculpt tools would not correctly project morph targets to skeletal mesh in certain cases
  • [MM-556] Implemented the ability to enable PerSectionWeld
Mesh Morpher 3.1.2 is Live! (09/27/2023)
  • [MM-551] Implemented Rotation and Location grid snapping in all Viewports
  • [MM-552] Added bUsePrecompiled = true to build.cs files to prevent the plugin to be recompiled while using source builds and C++ projects
Mesh Morpher 3.1.1 is Live! (09/26/2023)
  • [MM-545] Implemented the ability to select delta vertices in Tools
  • [MM-546] Implemented the ability to set a static mesh as reference in Poser
  • [MM-547] Renamed Create from Pose menu entries to Poser
  • [MM-548] Fixed a bug with Transform tool where having the mask selection enabled and setting transform inputs or moving the gizmo would cause issues.
  • [MM-549] Moved the transform bone widget above the bone list
  • [MM-550] Added Buffer View Menu to all Mesh Morpher Viewports.
Mesh Morpher 3.1.0 is Live! (09/19/2023)
  • [MM-543] Improved Morph Target to Bonesnapshot algorithm
  • [MM-544] Improved Update Morph Target from Pose
Mesh Morpher 3.0.9 is Live! (09/18/2023)
  • [MM-541] Implemented the ability to update bone rotations when creating bonesnapshots from morph targets
  • [MM-542] Implemented the ability to use relative transforms when creating bonesnapshots from morph targets
Mesh Morpher 3.0.8 is Live! (09/17/2023)
  • [MM-539] Morph Target curves are now added to the skeleton instead of mesh
  • [MM-540] Fixed a bug where transform widget in Poser and Wrapper wouldn't process manual input for Location
Mesh Morpher 3.0.7 is Live! (09/16/2023)
  • [MM-536] Implemented DuplicateSkeletalMesh at runtime
  • [MM-537] Implemented DuplicateStandaloneMorphTarget at runtime
  • [MM-538] Fixed a packaging issue with UE 5.3 (Windows)
Mesh Morpher 3.0.6 is Live! (09/14/2023)
  • [MM-534] Implemented the ability to enable/disable symmetry rotation
  • [MM-535] Implemented the ability to change symmetry axis
Mesh Morpher 3.0.5 is Live! (09/14/2023)
  • [MM-528] Improved Animation Curve list widget.
  • [MM-529] Implemented the ability to enable/disable Auto in Animation Curve/Morph Target list, which resets the weight to 0.
  • [MM-530] Animation Curves are now grabbed from the skeleton (and skeletal mesh in 5.3) instead of animation sequence.
  • [MM-531] Improved Bone Transform Widget in Poser and Wrapper.
  • [MM-532] Implemented Scale Lock in Bone Transform Widget in Poser and Wrapper
  • [MM-533] Improved and re-arranged Bone Widgets in Poser and Wrapper
Mesh Morpher 3.0.4 is Live! (09/12/2023)
  • [MM-524] Implemented bone symmetry in Poser and Wrapper.
  • [MM-525] Morph Target curves are properly created, renamed and removed in 5.3
  • [MM-526] Fixed a bug that could possibly crash Mesh Morpher when the versioning URL is not accessible
  • [MM-527] Improved Transform widget in Wrapper and Poser
Mesh Morpher 3.0.3 is Live! (09/09/2023)
  • [MM-522] Improved version update notification
  • [MM-523] Creating Morph Targets in UE 5.3 now explicitly creates a Curve for the Morph Target.
Mesh Morpher 3.0.2 is Live! (09/09/2023)
  • [MM-521] Load Bonesnapshot doesn`t modify bones that are also shared by a parent component (if any)
Mesh Morpher 3.0.1 is Live! (09/06/2023)
  • [MM-519] Implemented Subdivision in Create from Mesh Files
  • [MM-520] Implemented Match UV Iterations in Create from Mesh Files
Mesh Morpher 3.0.0 is Live! (08/30/2023)
  • [MM-500] Removed Sculpt Max Tool. Sculpt Tool now holds parameters for Max variant as well.
  • [MM-501] Smooth Tool now has a boolean that allows to preserve UV flow
  • [MM-502] Improved Flatten Tool performance with multi-threading
  • [MM-503] Improved Inflate Tool performance with multi-threading
  • [MM-504] Improved Move Tool performance with multi-threading
  • [MM-505] Improved Pinch Tool performance with multi-threading
  • [MM-506] Improved Plane Tool performance with multi-threading
  • [MM-507] Improved Sculpt Tool performance with multi-threading
  • [MM-508] Improved Smooth Tool performance with multi-threading
  • [MM-509] Improved Restore Tool performance with multi-threading
  • [MM-510] Improved Flatten Tool algorithm.
  • [MM-511] Improved Plane Tool algorithm.
  • [MM-512] Improved Sculpt Tool algorithm.
  • [MM-513] Improved Inflate Tool algorithm.
  • [MM-514] Removed Cotan, Mean Value and Legacy smooth types and they're been replaced by Preserve UV Flow and Delta smooth types
  • [MM-515] Implemented Subdivision in Copy Morph Target which allows to subdivide the source mesh. This most likely will provide better results when a subdivision level higher than 0 is used.
  • [MM-516] Changed default Smooth type to Preserve UV Flow
  • [MM-517] Fixed a bug in wrapper where setting a bonesnapshot wouldn't update the reference mesh
  • [MM-518] Improved Delta Projection algorithm in editor

Please remove the current Mesh Morpher files and replace them with the new ones.

Mesh Morpher 2.9.5 is Live! (08/26/2023)
  • Fixed a newly introduced bug with GetDynamicMeshDataPairs where the pairs were not correctly created between target and source
Mesh Morpher 2.9.4 is Live! (08/26/2023)
  • [MM-498] Improved control points behavior and how they function
  • [MM-499] Reorganized Wrapper Settings
Mesh Morpher 2.9.3 is Live! (08/23/2023)
  • [MM-495] Improved Control Points performance in Wrapper.
  • [MM-496] Control Points now can affect triangles facing the same direction as the control point
  • [MM-497] Wrapping can now be canceled.
Mesh Morpher 2.9.2 is Live! (08/22/2023)
  • [MM-484] Re-organized Wrapper settings structure
  • [MM-485] Wrapper can now be forced to attempt to preserve details
  • [MM-486] Creating Bonesnapshot for Morph Target now implements the ability to create automatically the Morph Target with deltas between the skeleton changes and the final form
  • [MM-487] Implemented the ability to update a Morph Target`s deltas with the current pose in Poser
  • [MM-488] Implemented Load Bonesnapshot widget
  • [MM-489] Implemented Save Bonesnapshot widget
  • [MM-490] Implemented the ability to create Reverse Morph Targets in Poser
  • [MM-491] Implemented the ability to select whether to load delta or absolute transforms from bonesnapshots
  • [MM-492] Implemented the ability to save bonesnapshots from a starting bone
  • [MM-493] Implemented the ability to removes bones in a bonesnaposhot from a bonesnapshot
  • [MM-494] Various other small fixes and UI changes
Mesh Morpher 2.9.1 is Live! (08/20/2023)
  • [MM-478] Implemented UV Matching in Copy Morph Targets
  • [MM-479] Creating from Mesh now has an advanced UV Matching functionality that allows multiple UV Matching iterations and smoothness
  • [MM-480] Removed Merge Morph Targets and it was replaced by Blend Morph Targets.
  • [MM-481] Wrapper no longer projects final result once more to the target mesh.
  • [MM-482] Wrapper now allows to bleed deltas from selection to nearby vertices, using Inverse Matching.
  • [MM-483] Fixed a bug that would crash the engine when changing skeletal meshes.
Mesh Morpher 2.9.0 is Live! (08/16/2023)
  • [MM-477] Improved speed of converting animation curves to morph targets.
Mesh Morpher 2.8.9 is Live! (08/11/2023)
  • [MM-473] Implemented the ability to Stitch a Morph Target back to the reference mesh
  • [MM-474] Improved UV Matching algorithm. Creating from Mesh files with UV matching disabled allows for inputs with different vertex count.
  • [MM-475] Implemented UV Matching in Create from Mesh Asset
  • [MM-476] Fixed a bug in UV Matching where if the morphed triangle count was lower than the base triangle count, the engine would crash.
Mesh Morpher 2.8.8 is Live! (08/06/2023)
  • [MM-470] Implemented the ability to match Base and Morphed files in Create From Mesh Files by UVs. This allows users to create Morph Targets from files with different vertex order if the UVs are intact in both files.
  • [MM-471] Implemented the ability to create a backup of skeletal mesh on bake.
  • [MM-472] Implemented the ability to select whether to bake Mesh Data on bake skeleton.
Mesh Morpher 2.8.7 is Live! (07/28/2023)
  • [MM-469] Fixed a newly introduced bug where the bonesnapshots wouldn't be correctly loaded in certain cases in animation blueprint
Mesh Morpher 2.8.6 is Live! (07/27/2023)
  • [MM-463] Fixed an issue with bonesnapshots where in Mesh Morpher the stored absolute transform wasn't used at all.
  • [MM-464] Bonesnapshots Deltas are now the bone transforms relative to their parents.
  • [MM-465] Add Support for UE 5.3 Preview 1
  • [MM-466] Implemented the ability to disable Post Process Animation Blueprints in Mesh Morpher by going to Edit->Settings
  • [MM-467] Implemented Morph Target Blender which allows to quickly select multiple values for Morph Targets and create a new one based on their blended results.
  • [MM-468] Runtime Nodes require activation when they are executed in Editor(PIE, Standalone). When packaged, the nodes don't require any activation. User have two new nodes: Is Activated and Activate available in blueprints.

Bonesnapshots format has been changed. Bonesnapshots created in previous versions are not working anymore and users have to recreate them.

Mesh Morpher 2.8.5 is Live! (07/02/2023)
  • [MM-460] Improved the side menu in Poser.
  • [MM-461] Moved authentication to cloud.
  • [MM-462] Improved Mac version.
Mesh Morpher 2.8.4 is Live! (06/22/2023)
  • [MM-458] Implemented the ability to match material IDs on copy morph target. This should provide better results when target and source meshes share same material layers count and order.
  • [MM-459] Checking for updates is now done only once per session.
Mesh Morpher 2.8.3 is Live! (06/21/2023)
  • [MM-455] Implemented Main Iterations in Wrapper which adds extra control on iterations. More iterations mean better quality. A Main Iteration of 1 is the default.
  • [MM-456] Fixed a bug in Wrapper where selecting a section in Target mesh would not correctly apply the resulted wrapping.
  • [MM-457] Runtime module refactoring which cleans and optimizes the code

This update on the backend is big. Don't hesitate to get in touch if you face any issues.

Mesh Morpher 2.8.2 is Live! (06/17/2023)
  • [MM-452] Implemented the ability to lock viewport camera in wrapper. This allows to automatically replicate viewport camera transformation from focused viewport to the other
  • [MM-453] Implemented the ability to select different Control Point influence values in the same wrapping operation.
  • [MM-454] Implemented the ability to select a control point and modify its influence radius
Mesh Morpher 2.8.1 is Live! (06/12/2023)
  • [MM-451] Fixed a bug with Merging Morph Targets where the resulted Morph Target wouldn't be properly created
Mesh Morpher 2.8.0 is Live! (05/29/2023)
  • [MM-450] Fixed a bug where on Lost Focus of viewport in wrapper will cause symmetric control points to remain enabled even while shift key was released
Mesh Morpher 2.7.9 is Live! (05/21/2023)
  • [MM-444] Fixed an issue where baking skeleton or morph target in some cases the engine would change the vertex order. On bake now we reload the baked skeletal mesh.
  • [MM-445] Creating a Bonesnapshot from Morph Target now opens a settings dialog which allows to configure how the bonesnapshot will be created.
  • [MM-446] Improved the layout of all modal dialogs
  • [MM-447] Bone Transform Widgets in Poser and Wrapper now work in local bone space.
  • [MM-448] Bake Skeleton in Poser now offers a set of option which allow to pick whether users want to bake to mesh skeleton reference, skeleton asset and DNA asset
  • [MM-449] Recompute Normals now has an improved output for selected meshes with different LOD count(eg. Meta Humans) for LOD indexes higher than 0
Mesh Morpher 2.7.8 is Live! (05/16/2023)
  • [MM-443] Implemented the ability to save only changed bones in bonesnapshots
Mesh Morpher 2.7.7 is Live! (05/16/2023)
  • [MM-442] Fixed a bug where transitioning through states between 0 and 1 using Anim Node Load Bonesnapshots wouldn't work perfectly
Mesh Morpher 2.7.6 is Live! (05/15/2023)
  • [MM-436] Fixed DNA export to file
  • [MM-437] Implemented Load Bonesnapshot animnode
  • [MM-438] Bonesnapshot now save both local deltas and world transforms
  • [MM-439] Implemented the ability to set a bonesnapshot as a pose in toolkit window
  • [MM-440] Implemented the ability to save bonesnapshots as.. in Poser
  • [MM-441] Implemented the ability to merge bonesnapshots in Poser

Bonesnapshots created prior to 2.7.6 need to be recreated as they will not function anymore

Mesh Morpher 2.7.5 is Live! (05/06/2023)
  • [MM-434] Default value for Smooth Iterations in Create from Mesh Files has been changed to 0
  • [MM-435] Improved authentication in Mesh Morpher. Now when there's no Mesh Morpher window open, there's no request for authentication.
Mesh Morpher 2.7.4 is Live! (05/02/2023)
  • [MM-433] Bone trees selection gets updated when bones are selected from Bone Proxies in viewports
Mesh Morpher 2.7.3 is Live! (04/27/2023)
  • [MM-430] Fixed viewport flickering (if it still flickers please send an email at support@meshmorpher.com)
  • [MM-431] Duplicate Morph Targets now pre-fills the morph name to the existing one
  • [MM-432] Fixed a bug with re-applying morph target to LODs.
Mesh Morpher 2.7.2 is Live! (04/14/2023)
  • [MM-428] Implemented the ability to select an Animation Blueprint in Poser, enabling Arkit and everything related to animation in Mesh Morpher
  • [MM-429] Selected Bone Transform Widget in Poser now follows animation bone position.
Mesh Morpher 2.7.1 is Live! (04/12/2023)
  • [MM-425] Restore Tool can now restore by side: Right, Left, Up, Down, Front, Back
  • [MM-426] Masking can now select by side: Right, Left, Up, Down, Front, Back
  • [MM-427] Fixed a bug where adding a new morph target with an existing name wouldn't overwrite the deltas.
Mesh Morpher 2.7.0 is Live! (04/06/2023)
  • [MM-223] All binaries files are now digitally signed
  • [MM-224] Implemented auto-updater in Mesh Morpher. Upcoming Mesh Morpher version can be fetched within the engine.
Mesh Morpher 2.6.9 is Live! (04/01/2023)
  • [MM-422] Fixed a bug where grabbing deltas from import data wouldn't work correctly in certain cases. Instead, we now grab deltas only from UMorphTarget objects.
Mesh Morpher 2.6.8 is Live! (03/31/2023)
  • [MM-418] Bonesnapshots have been changed. The bone transformation storage is completely changed and requires users to recreate them.
  • [MM-419] Renaming a Morph Target now pre-fills the text block with current Morph Target name
  • [MM-420] Wrapper control points index indicator are not render anymore if they're outside of viewport frustum
  • [MM-421] Fixed a bug where creating the bones gizmos would crash the engine
Mesh Morpher 2.6.7 is Live! (03/30/2023)
  • [MM-417] Bone Tree fits better in Poser side panel
Mesh Morpher 2.6.6 is Live! (03/28/2023)
  • [MM-416] Improved authentication in Mesh Morpher. This resets the current authentication token stored locally.
Mesh Morpher 2.6.5 is Live! (03/26/2023)
  • [MM-415] Implemented Recompute Normals
Mesh Morpher 2.6.4 is Live! (03/24/2023)
  • [MM-414] Fixed a bug where selecting a Reference Skeletal Mesh wouldn't display its Morph Targets
Mesh Morpher 2.6.3 is Live! (03/23/2023)
  • [MM-412] Implemented the ability to enable Animation Curves in Poser
  • [MM-413] Implemented the ability to Create Morph Targets from Animation Curves Selection
Mesh Morpher 2.6.2 is Live! (03/21/2023)
  • [MM-410] Added Symmetric Control Points
  • [MM-411] Updated default Wrapping settings
Mesh Morpher 2.6.1 is Live! (03/21/2023)
  • [MM-409] Improved the smoothing for non-rigid wrapping
Mesh Morpher 2.6.0 is Live! (03/20/2023)
  • [MM-407] Implemented the ability to chose fitting algorithm for control points.
  • [MM-408] Wrapping progress for Control Points now display the control point index instead of the nearest vertex index in the mesh
Mesh Morpher 2.5.9 is Live! (03/20/2023)
  • [MM-406] Vertices in Control Points influence radius can have multiple correspondence vertices
Mesh Morpher 2.5.8 is Live! (03/20/2023)
  • [MM-399] Control Points in Wrapper now just hint the non-rigid algorithm about their correspondence vertices in their influences radius instead of rigidly fitting.
  • [MM-400] Greatly improved the non-rigid algorithm in Wrapper
  • [MM-401] Implemented the ability to save/load control points.
  • [MM-402] Implemented the ability to clear control points.
  • [MM-403] Control Points now display their index in Wrapper viewport
  • [MM-404] Subdivision steps in Wrapper now subdivides the source mesh for the amount of steps at the beginning instead of going through each step with the non-rigid fitting.
  • [MM-405] Removed bFitToTarget from wrapper as this causes issues with non-manifold meshes
Mesh Morpher 2.5.7 is Live! (03/12/2023)
  • [MM-397] Added extra validations when writing to DNA asset.
  • [MM-398] Implemented the ability to turn off DNA asset update when baking skeleton or morph target. (Edit->Settings)
Mesh Morpher 2.5.6 is Live! (03/12/2023)
  • [MM-394] Applying Deltas from Welded(sculpted version) to Skeletal Mesh now matches material IDs, providing higher quality projection
  • [MM-395] Creating from Mesh Files now offers the ability to match material IDs
  • [MM-396] Creating from Mesh now offers the ability to match material IDs
Mesh Morpher 2.5.5 is Live! (03/02/2023)
  • [MM-393] Fixed and improved Regenerate Import Data and Model
Mesh Morpher 2.5.4 is Live! (02/26/2023) [Only on MeshMorpher.com]
  • [MM-388] Bonesnapshots are now saved with bone names included
  • [MM-389] Implemented the ability to create bonesnapshot assets using blueprints in editor (CreateBoneSnapshotAsset)
  • [MM-390] Implemented the ability in Poser to load bonesnapshots that are not skeleton compatible. Common bones with same names will be transferred
  • [MM-391] Baking Skeleton and Baking Morph Targets now write the joint and mesh data to DNA asset for Meta Humans
  • [MM-392] Implemented the ability to export the DNA asset(Meta Humans) to .dna file (experimental)
Mesh Morpher 2.5.3 is Live! (02/22/2023) [Only on MeshMorpher.com]
  • [MM-385] Create From FBX Files now uses the skeletal mesh from toolkit viewport(pose or master pose component applied)
  • [MM-386] Export Mesh to OBJ now uses the skeletal mesh from toolkit viewport(pose or master pose component applied)
  • [MM-387] Export Morph Target to OBJ now uses the skeletal mesh from toolkit viewport(pose or master pose component applied)
Mesh Morpher 2.5.2 is Live! (02/19/2023) [Only on MeshMorpher.com]
  • [MM-381] Fixed a bug with transform tool where closing and reopening the tool would wrongfully reposition the gizmo
  • [MM-382] Baking Bonesnapshots now notify all existing viewports that the mesh was changed
  • [MM-383] Baking Bonesnapshots now reinitializes render data and clears out much better.
  • [MM-384] Ok button in Poser has been renamed to Create Morph Target
Mesh Morpher 2.5.1 is Live! (02/16/2023) [Only on MeshMorpher.com]
  • [MM-380] Fixed a bug with Copy where the Morph Target wouldn't be properly projected on the target LODs > 0 and disabling UV Projection wouldn't work properly.
Mesh Morpher 2.5.0 is Live! (02/16/2023) [Only on MeshMorpher.com]
  • [MM-379] Implemented the ability to fit skeletons to Morph Targets
Mesh Morpher 2.4.9 is Live! (02/15/2023) [Only on MeshMorpher.com]
  • [MM-376] Implemented the ability to bake skeletons
  • [MM-377] Implemented the ability to draw simplified bones in Wrapper and Poser
  • [MM-378] Implemented the ability to scale bone indicators to bones in Wrapper and Poser
Mesh Morpher 2.4.8 is Live! (02/05/2023)
  • [MM-375] Fixed a bug with creating Morph Targets at runtime
Mesh Morpher 2.4.7 is Live! (01/30/2023)
  • [MM-372] Fixed a bug with Pinch Tool
  • [MM-373] Moved unnecessary components and libraries from Runtime module to Core. Only necessary stuff will now be packaged.
  • [MM-374] Fixed baking once and for all. (Special thanks to @kostenickj for helping out with this)
Mesh Morpher 2.4.6 is Live! (01/25/2023)
  • [MM-367] Fixed a bug with Mesh Morpher Debug Skeletal Mesh where assigning a different mesh after a mesh was previously assigned, would preserve the materials from the old mesh.
  • [MM-368] Fixed a bug where on save, Source bone snapshot was selecting the target mesh as skeletal mesh in Wrapper
  • [MM-369] Fixed a bug with Bone Snapshot assets where the Skeletal Mesh Property wouldn't preserve its value
  • [MM-370] Fixed a bug with Standalone Mask Selection assets where the Skeletal Mesh Property wouldn't preserve its value
  • [MM-371] Fixed a bug in Mesh Morpher Mesh Component where the Scene Proxy wasn't flushing rendering commands when the topology was changed potentially crashing
Mesh Morpher 2.4.5 is Live! (01/23/2023)
  • [MM-366] Fixed a possible bug with baking where in certain cases where import data is not consistent, the mesh becomes scrambled.
Mesh Morpher 2.4.4 is Live! (01/18/2023)
  • [MM-365] Fixed a bug in Mesh Morpher Mesh Component Scene Proxy where updating the mesh data could result in a crash
Mesh Morpher 2.4.3 is Live! (01/15/2023)
  • [MM-364] Bone Snapshot menu has been re-added to Poser. It went MIA during UI refactoring
Mesh Morpher 2.4.2 is Live! (01/11/2023)
  • [MM-361] Fixed a bug with baking where Mesh Morpher would fail to offset the existing Morph Targets
  • [MM-362] Baking performance has been greatly improved.
  • [MM-363] Fixed a bug with Symmetric Brush for Tools where the Symmetric Brush would be incorrectly positioned when Only Facing Camera was disabled
Mesh Morpher 2.4.1 is Live! (01/10/2023)
  • [MM-354] Windows with Viewports and Morph Targets Lists have been replaced with dockable tabs
  • [MM-355] Implemented an Entitlement Check which attempts to inform users if they don't own the product. Mesh Morpher as any other code plugin on the UE Marketplace is licensed per seat.
  • [MM-356] Implemented the ability to regenerate import data which is useful for some marketplace assets.
  • [MM-357] Code refactor for Editor and Core Modules
  • [MM-358] Fixed a bug where closing windows(now tabs) with viewports in 5.1 would result in a crash(sometimes)
  • [MM-359] Various optimizations to UI across the plugin
  • [MM-360] Fixed a bug with Fit to Target in Wrapper when sometimes could result in a crash. Fit to Target can fail fitting but won't crash.
Mesh Morpher 2.4.0 is Live! (12/30/2022)
  • [MM-351] Copy Morph Targets now uses the source skeletal mesh with pose applied (if any)
  • [MM-352] Reference Mesh Master Pose functionality has been simplified. Instead of two booleans now it uses an enum to set the correct Master pose.
  • [MM-353] Fixed a bug where changing a bone transformation using the text widgets and then moving the transform gizmo would result in a crash in Wrapper and Poser
Mesh Morpher 2.3.9 is Live! (12/26/2022)
  • [MM-348] Fixed a bug where on opening a mask selection asset, the selection will always be appended.
  • [MM-350] Mask selection mesh is drawn at an offset distance of Normal * 0.1 to make sure is always on top
Mesh Morpher 2.3.8 is Live! (12/26/2022)
  • [MM-349] Fixed a bug with Reference Mesh in Poser where the mesh would attempt to inherit vertices from the Pose Mesh Component
Mesh Morpher 2.3.7 is Live! (12/24/2022)
  • [MM-334] Fixed control points in Wrapper
  • [MM-335] Optimized wrapper
  • [MM-336] Implemented Masking in Wrapper.
  • [MM-337] Tools are using now internal smooth enum
  • [MM-338] Implemented Legacy smooth option which allows users to use the old smoothing algorithm(if they want to)
  • [MM-339] Implemented the ability to enable Morph Targets in poser.
  • [MM-340] On bonesnapshot save, users are now notified when the save is complete.
  • [MM-341] Implemented the ability to select a Reference Mesh in poser.
  • [MM-342] Implemented the ability to Fit Scale Source to Target in Wrapper
  • [MM-343] Implemented the ability to Hide Preview and Reference Meshes in Wrapper
  • [MM-344] IsDynamicMeshIdentical doesn't check for identical normals anymore.
  • [MM-345] Renamed Select Only Facing Camera to Only Facing Camera in Tools.
  • [MM-346] Removed Hit Back Faces from Tools, functionality is replaced by Only Facing Camera.
  • [MM-347] Now Bones in Poser and Wrapper are reset on Bonesnapshot load
Mesh Morpher 2.3.6 is Live! (12/20/2022)
  • [MM-324] Fixed a bug with Add New Morph Target where if the selected name is already in use, the overwrite happens without unloading the Morph Target if it is already loaded
  • [MM-325] Fixed a bug with Duplicate Morph Target where if the selected name is already in use, the overwrite happens without unloading the Morph Target if it is already loaded
  • [MM-326] Fixed a bug with Merging Target where if the selected name is already in use, the overwrite happens without unloading the Morph Target if it is already loaded
  • [MM-327] Merging doesn't allow anymore to pick a Destination name that is part of the selection
  • [MM-328] Fixed a bug with UMeshMorpherDebugSkelMesh where the bone caching wasn't working as intended
  • [MM-329] Fixed a bug in wrapper and poser viewport where clicking bones wouldn't work as intended due to cursor hiding
  • [MM-330] Fixed bonesnapshot bugs in wrapper and poser where the bonesnapshot wouldn't be correctly saved or loaded
  • [MM-331] Fixed a packaging issue for 5.1 due to fbxsdk missing files
  • [MM-332] Added Docs and Support menu option under Help dropdown menu
  • [MM-333] Threshold and Normal Incompatibility Threshold have been removed from the wrapper as they were not used.
Mesh Morpher 2.3.5 is Live! (12/09/2022)
  • [MM-317] Fixed a bug where Cancel on saving bone snapshot bug would crash the engine
  • [MM-318] Fixed a bug where the material for reference meshes in wrapper weren't properly assigned
  • [MM-319] Fixed a bug where undoing bone actions would sometimes fail in the wrapper and poser
  • [MM-320] Selecting an animation in the wrapper and poser still allows you to move bones around thus enabling further pose customization
  • [MM-321] Removed bDisablePostProcessBlueprint. The Debug Skeletal Mesh Component has been redone.
Mesh Morpher 2.3.4 is Live! (12/06/2022)
  • [MM-323] Fixed a baking bug where the Normals wouldn't be properly stored
Mesh Morpher 2.3.3 is Live! (12/06/2022)
  • [MM-322] Cleaned the wrapper
Mesh Morpher 2.3.2 is Live! (11/21/2022)
  • [MM-312] Implemented the ability to enable/disable Post Process Animation blueprint
  • [MM-313] Added some extra validation for the Pose frame slider
  • [MM-314] Separated Wrapper from Create from Mesh to its own window.
  • [MM-315] Fixed a possible bug where browsing corrupted assets would crash the engine. Now Mesh Morpher attempts to filter them out.
  • [MM-316] Create From Mesh window doesn't automatically close after the Morph Target was created, allowing users to select another mesh directly.
Mesh Morpher 2.3.1 is Live! (11/11/2022)
  • [MM-309] Improved baking(Set Weight) Standalone Morph Target at runtime
  • [MM-310] Implemented profiling for runtime functionality
  • [MM-311] Fixed a bug in Mesh Morpher Mesh Component where changing the mesh would crash the editor
Mesh Morpher 2.3.0 is Live! (11/04/2022)
  • [MM-306] Implemented the ability to Create Standalone Morph Targets from FBX/OBJ Files at runtime
  • [MM-307] Implemented the ability to Create Morph Targets from FBX/OBJ Files at runtime
  • [MM-308] Implemented the ability to Export Skeletal Mesh Render Data (reflects already baked standalone morph targets) to OBJ Files at runtime. Welded and non-welded support
Mesh Morpher 2.2.9 is Live! (11/02/2022)
  • [MM-305] Fixed a bug with Baking(Set Weight) of standalone morph targets in packaged builds where it would crash the game.
Mesh Morpher 2.2.8 is Live! (10/31/2022)
  • [MM-301] Implemented the option to project at runtime Standalone Morph Targets to another mesh Standalone Morph Targets
  • [MM-302] Implemented the option to project at runtime Standalone Morph Targets to another mesh Morph Targets
  • [MM-303] Implemented various utility nodes for Standalone Morph Targets assets.
  • [MM-304] Implemented the ability to bake Standalone Morph Targets on the skeletal mesh at runtime

There is a bug with baking Standalone Morph Targets at runtime in packaged builds but the fix has been submitted already to Epic and it will be available in 2.2.9 version.

Mesh Morpher 2.2.7 is Live! (10/30/2022)
  • [MM-299] Implemented Smooth Types in Mesh Morpher core functionality. There are 3 smooth types: uniform, mean value, cotan
  • [MM-300] Improved performance and quality of smoothing in core functionality.

You'll see that the default smoothing values have changed across Mesh Morpher(Copy, Create From Mesh File, Wrapper etc.) because the entire algorithm has changed and the impact is different. However, this change doesn't affect previously created Morph Targets.

Mesh Morpher 2.2.6 is Live! (10/28/2022)
  • [MM-297] Merge Morph Targets now can use 3 types of merging: Append, Magnitude and Mean Average
  • [MM-298] Baking has been further improved.
Mesh Morpher 2.2.5 is Live! (10/26/2022)
  • [MM-296] Fixed a bug where changing the Skeletal Mesh to another one after any modification was made would result in a crash.
Mesh Morpher 2.2.4 is Live! (10/22/2022)
  • [MM-295] Pose Mesh Component and Reference Mesh Component in Toolkit now have disabled post process and control rig
Mesh Morpher 2.2.3 is Live! (10/19/2022)
  • [MM-287] Discontinued Meta Morph assets
  • [MM-288] Importing from FBX/OBJ now has default Forward axis to Y and T0 pose enabled. This is implemented by default to match Unreal Engine's behavior
  • [MM-289] Optimized wrapping to use vertex pairs per material. This could slightly increase the quality of the results when copying, wrapping etc.
  • [MM-290] Create from Pose now allows users to manage bones individually while in Mesh Morpher.
  • [MM-291] Mesh Morpher can be compiled by users to support UE 5.1 P1/2
  • [MM-292] Fixed a bug with FBX importer where it would crash from time to time
  • [MM-293] Bone Editor in Wrapper and Poser doesn't duplicate the skeletal meshes anymore hence the performance is a little bit improved
  • [MM-294] Added Create from Mesh and From Pose to the Toolbar
Mesh Morpher 2.2.2 is Live! (10/04/2022)
  • [MM-284] Fixed a bug with Bone Snapshots where the skeletal mesh wouldn't get stored and would result in an engine crash when browsing the assets.
  • [MM-285] Windows with Viewports (Wrapper, Create From Mesh Files etc) now have persistent window size.
  • [MM-286] Implemented Section Selection in the Wrapper.
Mesh Morpher 2.2.1 is Live! (09/22/2022)
  • [MM-233] Implemented Bone Snapshots in the Wrapper, allowing users to save the current Bones Transformation to an asset, and load it when needed
  • [MM-283] Implemented Source Pose and Frame for the wrapper, allowing users to set an animation sequence frame bone transformations to the Source Mesh

Mesh Morpher 2.2.0 is Live! (09/20/2022)
  • [MM-274] Improved bone rendering and interaction in the wrapper
  • [MM-275] Improved control point rendering and interaction in the wrapper
  • [MM-276] The wrapper now automatically attempts to rigid fit the target to source. Scaling is optional
  • [MM-277] Improved the performance speed of control points processing
  • [MM-278] The wrapper now centers target and source, as well as vertices affected by control points and their correspondents
  • [MM-279] Added GUI settings for the Wrapper in the Mesh Morpher's Settings window
  • [MM-280] Fixed a bug with undo/redo bone transforms in the wrapper. Now each bone has its own transform gizmo
  • [MM-281] Fixed several possible crashes when undo/redo transform bones in the wrapper
  • [MM-282] Fixed a bug where control points were displaying wrong influence radius
Mesh Morpher 2.1.9 is Live! (09/20/2022)
  • [MM-272] Implemented bone alignment for Wrapper
Mesh Morpher 2.1.8 is Live! (09/16/2022)
  • [MM-260] Fixed a bug where renaming a morph target to a previously removed morph target would result in a crash
  • [MM-261] Removed the option in baking where you could select to either remove or not the baked morph target. All baked morph targets are automatically removed.
  • [MM-262] Cleaned the Toolkit code a little bit
  • [MM-263] Projecting Morph Targets on an invalid LOD doesn't crash the engine anymore. Event is logged in Output log.
  • [MM-264] Implemented bOnCompleteRigidFitToOriginalMesh in Wrapper Settings which attempts to match the proportions and rotation of the resulted morph target to the original target mesh.
  • [MM-265] Implemented the ability to set a source from from file(FBX/OBJ) when using the wrapper.
  • [MM-266] Implemented the ability to manually change transform of the source mesh to manually match the target when using the wrapper
  • [MM-267] Implemented Control Points when using the Wrapper.
  • [MM-268] Wrapper automatically uses welded meshes for both target and source.
  • [MM-269] Rigid and Non-Rigid Settings are now separated when using Wrapper.
  • [MM-270] Cleaned and optimized the Wrapper
  • [MM-271] Fixed a bug in Transform Tool where Rotation Y axis would mistakenly be bound to Scale Y
Mesh Morpher 2.1.7 is Live! (09/01/2022)
  • [MM-257] Fixed a bug where smooth type combo box was not visible
  • [MM-258] Fixed a bug where the FBX Importer wouldn't import all mesh sections
  • [MM-259] Improved the Wrapper. We now have two types of fitting, rigid and non-rigid. Rigid attempts to align, rotate and scale(optional) the meshes to fit them as much as possible before non-rigid to make it easier on the algorithm. Non-rigid is using an enhanced ICP algorithm which attempts to fit the meshes by wrapping the target mesh around the source mesh.

The wrapper algorithm changed drastically, we now have plenty of options to optimize the wrapping process. We've reached a point where I believe the wrapping works as intended. Next step is to add the possibility to set control points to help the algorithm in certain areas.

Mesh Morpher's Wrapper is still in its early stages, very experimental but I'm heavily invested into implementing it.

Mesh Morpher 2.1.6 is Live! (08/25/2022)
  • [MM-256] Improved Create Morph Target From Mesh. This functionality is originally intended to work with Meta Human heads. With this version it allows the creation of Morph Targets from all kind of meshes.

This is still very experimental and work in progress. The best results come from meshes that share the skeleton and proportions and manifold.

Mesh Morpher 2.1.5 is Live! (08/21/2022)
  • [MM-253] Improved performance and accuracy of Morph Target projection on meshes. We're slowly preparing the grounds for the Wrapper functionality.
  • [MM-254] Improved ROI return performance in UMeshMorpherMeshComponent. Now it has better distribution across all threads.
  • [MM-255] Creating Morph Target from Meta Morphs (current mesh) has been implemented. It uses as a target mesh the current mesh with pose (if any)
Mesh Morpher 2.1.4 is Live! (08/18/2022)
  • [MM-240] Implemented T0 pose on FBX Import
  • [MM-241] Implemented the ability to set an offset location on FBX/OBJ import
  • [MM-242] Increased the accuracy of pose frame slider
  • [MM-243] Implemented a new SpinBox near the pose frame slider which allows to jump to certain frames and view the current frame position.
  • [MM-244] Section List in Tools is now using a fixed size with a scrollbar
  • [MM-245] Implemented Select All Sections in Tools
  • [MM-246] Implemented Export Morph Target As OBJ
  • [MM-247] Welding Settings are now centralized in Settings under Internal Welding Settings category. This allows for more consistency between Exported Meshes as OBJ(welded), Exported Morph Targets as OBJ(welded) and Mesh Morpher's internal mesh(welded)
  • [MM-248] Create Morph Target from Mesh Files is now using as a target mesh the existing mesh with pose applied(if any)
  • [MM-249] Removed Legacy OBJ Importer. Legacy OBJ Importer was only used for OBJ quad meshes. FBX/OBJ Importer now supports triangle/quad meshes with polygons of 3 or 4 elements. This change also fixes an existing visual rendering bug with quad meshes.
  • [MM-250] Mask Selection triangles are sorted now on Export Mask Selection to OBJ. This allows for more consistent exports.
  • [MM-251] Fixed a bug where if the sections materials are invalid then the mesh would be invisible when a Morph Target is open
  • [MM-252] Fixed a bug with Mesh Materials in Custom Scene Proxy where having invalid Materials on the skeletal mesh would sometimes cause a crash
Mesh Morpher 2.1.3 is Live! (08/16/2022)

This long overdue update is about improving performance and stability in Mesh Morpher core functionality.

I improved Scene Proxy performance and stability, allowing Mesh Morpher to send to the GPU only changes that were made instead of the whole mesh/selection data.

I also Improved Mesh Morpher's Mesh Component stability and performance by taking advantage of all CPU power/threads whenever possible.

Mesh Operations are now more performant due to better distribution across all available threads.

A lot of core functionalities were re-written to achieve this performance/stability improvement. If you find a bug, don't hesitate to let me know.

Mesh Morpher 2.1.2 is Live! (08/11/2022)
  • [MM-238] Fixed a bug in Baking where only the last selected Morph Target would be baked.
  • [MM-239] Camera Location, Rotation, Speed, Speed Scalar and FOV are now saved when users close Mesh Morpher window. This allows to preserve viewport camera settings.
  • [MM-240] Changing Pose asset or frame now automatically saves and close current selected Morph Target. The process is heavy and reopening the Morph Target everytime the pose frame is changed will halt Mesh Morpher for a long time.
Mesh Morpher 2.1.1 is Live! (07/30/2022)
  • [MM-231] Implemented the ability to customize Brush Sphere Indicator Alpha and Color in Settings
  • [MM-232] Implemented the ability to Display Material Slot Names instead of IDs in Tools
  • [MM-234] Renamed Mask Behaviour to Mask Visibility
  • [MM-235] Disable Mask Visibility when painting Mask Selection is enabled
  • [MM-236] Disable Mask Painting when Enabling Mask Visibility
  • [MM-237] Implemented the ability to export Material Slot Names instead of IDs on OBJ Export
Mesh Morpher 2.1.0 is Live! (07/24/2022)
  • [MM-229] Implemented the ability to hide Masked/Unmasked Vertices
  • [MM-230] Re-implemented Brush Sphere. It can be Enabled/Disabled in Edit->Settings
Mesh Morpher 2.0.9 is Live! (07/16/2022)
  • [MM-226] Implemented the ability to set Master Pose for Reference Skeletal Mesh
  • [MM-227] Pose assets now check compatibility between the skeleton and the animation asset thus allowing to select retargeted animations.
Mesh Morpher 2.0.8 is Live! (07/14/2022)
  • [MM-225] Implemented the ability to enable Morph Targets on Reference Skeletal Mesh
Mesh Morpher 2.0.7 is Live! (06/07/2022)
  • [MM-224] Fixed a bug where Smooth Tool didn't work correctly with Symmetry enabled
Mesh Morpher 2.0.6 is Live! (06/06/2022)
  • [MM-222] Fixed a bug where GetMaxGroupID() in UMeshMorpherMeshComponent was not displaying the correct sections count
  • [MM-223] OBJ and FBX importing now both use the FBX module in Unreal Engine. In Mesh Morpher now you can see one option, Create From Mesh Files which allows users to select both FBX and OBJ file formats. OBJ quad meshes behind the scenes are still processed by the old OBJ importer
Mesh Morpher 2.0.5 is Live! (06/02/2022) This version is available for UE 5.0.0 and higher.
  • [MM-220] Enhanced OBJ export functionality. Implemented the ability to append additional skeletal meshes to OBJ output allowing users to attach bodies to heads and so on. See notes.
  • [MM-221] Fixed a bug where changing the selected skeletal mesh while a dialog box was open wouldn't close the dialog box.

Notes: There are various options available now for OBJ export functionality, allowing users to weld exported mesh based on the given parameters or group additional meshes into separate Objects. These enhancements aim to ease up and simplify workflows.

Mesh Morpher 2.0.4 is Live! (05/28/2022) This version is available for UE 5.0.0 and higher.
  • [MM-215] Tools Material Mode selection is now saved and persistent
  • [MM-217] Fixed a bug in Create Morph Target from FBX Files widget when changing the Coordinate System or any of the Axis wouldn't show up the progress bar
  • [MM-218] Switched Versioning URL to new host. If users don't update to the latest version 2.0.4 they will not receive any further notifications about new versions.
Mesh Morpher 2.0.3 is Live! (05/09/2022) This version is available for UE 5.0.0 and higher.
  • [MM-211] Implemented the ability to select boundary vertices
  • [MM-212] Implemented the possibility to create Morph Targets from FBX files. See notes.
  • [MM-213] Cleared files from unnecessary includes.
  • [MM-214] Fixed a bug where OBJ importer wouldn't process quad meshes correctly
  • [MM-216] Implemented RebuildTangentBasis in baking Morph Targets to Skeletal mesh. Hopefully this will generate more consistent baking results.

Note: Creating Morph Targets from FBX files has been implemented to remove the need to import the FBX files in the engine first, which is causing vertices count/order inconsistencies by getting the meshes optimized by the Engine.

Mesh Morpher is only attempting to get the highest vertex count LOD(LOD0) when importing FBX files.

This has been tested with FBX files exported from UE, Maya and Blender.

This functionality is still experimental so please don't hesitate to report back with issues and suggestions.

Mesh Morpher 2.0.2 is Live! (04/15/2022) This version is available for UE 5.0.0 and higher.
  • [MM-207] Removed UStandaloneMorphTarget. UMetaMorph will take its place
  • [MM-208] Removed the ability to bake morph targets at runtime. This was an experimental feature and it failed to perform in UE5. As soon as I find a replacement I will implement it
  • [MM-209] Fixed a bug where on baking morph targets the normals would be broken when Virtual Shadow Mapping is selected.
Mesh Morpher 2.0.1 is Live! (04/09/2022) This version is available for UE 5.0.0 and higher.
  • [MM-176] Transform Gizmo in Transform Tool now allows Scaling
  • [MM-177] Convert float to double precision. This allows for higher quality Morph Targets when working with Mesh Morpher. However, UE's deltas are still floats.
  • [MM-178] Indicator now is drawn in Mesh Component Scene Proxy
  • [MM-182] Convert Tools to UMG Widgets
  • [MM-185] Fixed a bug in UMeshMorpherToolHelper::GetNormalizedLength
  • [MM-186] Implemented the ability to get the bounds of mask selection in UMeshMorpherMeshComponent
  • [MM-187] Updated Shortcuts for Commands
  • [MM-188] Implemented Toggle Mask Selection Command
  • [MM-190] Implemented Clear Mask Selection Command
  • [MM-204] Support for Mac
  • [MM-205] Removed Enable/Disable build mesh data functionality
  • [MM-206] Fixed a bug where progress bars wouldn't show up

And various fixes and improvements here and there.

Currently UE5 version supports: Win64, Linux and Mac. After some more testing I will add back the other platforms.

Classic

Editor

106 pages in this section.

Classic › Editor › UI

New

Classic › Editor › UI

Exit

Classic › Editor › UI

Camera FOV

Mesh Morpher allows users to change the camera FOV in the preview viewport.

Navigate to the camera menu in the viewport and set the slider to the desired value.

Classic › Editor › UI

Focus Camera

Mesh Morpher allows users to focus the camera while pointing at the Skeletal Mesh to focus the camera on that specific point.

Navigate to Edit top dropdown menu and click Focus Camera.

Keyboard shortcut: F

Use Mouse Wheel to adjust the Focusing distance.

Classic › Editor › UI

Ruler

Ruler allows us to measure and Track MetaHuman Deformations with Ruler. We can track how Morph Targets, Animations, Animations Curves affect our selected Points of Interest so we can better underst...

Ruler allows us to measure and Track MetaHuman Deformations with Ruler. We can track how Morph Targets, Animations, Animations Curves affect our selected Points of Interest so we can better understand what we can do to fine-tune our skeletal meshes.

Left Click to add points. Right Click on points to remove them.

Classic › Editor › Basic Operations

Open Skeletal Mesh

There are several ways you can open a Skeletal Mesh in Mesh Morpher.

  • Use the asset picker in Mesh Morpher's toolbar.
  • Select the Skeletal Mesh in Content Browser and click on Mesh Morpher icon.
  • Select the Skeletal Mesh in Content Browser, right click and select Open with Mesh Morpher.

Classic › Editor › Basic Operations

Save

Saves the changes to the Skeletal Mesh making them persistent.

Save button is accessible through:

  • Toolbar
  • Navigating to File top dropdown menu and clicking save

Keyboard shortcut: Ctrl + S

The button is greyed out when there's nothing recorded to save.

Saving is irreversible.

Classic › Editor › Basic Operations

Open Morph Target

Mesh Morpher allows users to load and sculpt existing Morph Targets in-engine.

There are three ways to load a Morph Target:

  • Double-click on the Morph Target you want to load in Morph Targets list.
  • Right-click on the Morph Target you want to load in Morph Targets list and select Open Morph Target.
  • Navigating to Edit top dropdown menu and clicking Open Morph Target

Keyboard shortcut: Ctrl + O

Classic › Editor › Basic Operations

Close Morph Target

Mesh Morpher allows users to unload Morph Targets that have been previously loaded.

There are two ways to unload a loaded Morph Target:

  • By right-clicking on the Morph Targets list and select Close Morph Target.

  • Navigating to Edit top dropdown menu and clicking Close Morph Target.

If there are any changes to the Morph Target, Mesh Morpher will attempt to save them.

Keyboard shortcut: Ctrl + D

The button is greyed if no Morph Target is loaded.

Classic › Editor › Basic Operations

Add New

Mesh Morpher allows users to create and sculpt new Morph Targets in-engine without the need of any other DCC software.

There are three ways to create new Morph Targets:

  • By clicking Add New in Mesh Morpher's toolbar
  • By right-clicking on the Morph Targets list and select Add new
  • Navigating to Edit top dropdown menu and clicking Add new

Once the Add New button is pressed, a dialog box will open, asking for a name for the new Morph Target.

If the selected Morph Target name is already in use, a new dialog box will pop asking whether to overwrite or change the name. Pressing Yes will clear and overwrite the existing Morph Target.

Keyboard shortcut: Ctrl + A

Classic › Editor › Basic Operations

Delete

Mesh Morpher allows users to delete Morph Targets in-engine without the need of any other DCC software.

You can delete a single Morph Target or multiple Morph Targets by using Ctrl+Click or Shift+Click to select additional Morph Targets in the Morph Targets list.

There are three ways to delete Morph Targets:

  • By clicking Delete in Mesh Morpher's toolbar
  • By Right-clicking on the Morph Target you want to Delete in Morph Targets list and select Rename.
  • Navigating to Edit top dropdown menu and clicking Delete

A new dialog will pop asking for confirmation. Clicking Yes will proceed with Morph Target removal.

Keyboard shortcut: DELETE

The button is greyed out when there's no selection.

Morph Target removal is irreversible.

Delete allows multi-selection.

Classic › Editor › Basic Operations

Rename

Mesh Morpher allows users to rename Morph Targets in-engine without the need of any other DCC software.

There are three ways to rename Morph Targets:

  • By clicking Rename in Mesh Morpher's toolbar
  • By Right-clicking on the Morph Target you want to rename in Morph Targets list and select Rename.
  • Navigating to Edit top dropdown menu and clicking Rename

Once the Rename button is pressed, a dialog box will open, asking for a New Morph Target Name.

If the selected Morph Target name is already in use, a new dialog box will pop with the information.

Keyboard shortcut: Ctrl + R

The button is greyed out when there's no selection.

Morph Target renaming is irreversible.

Rename doesn't allow multi-selection.

Classic › Editor › Basic Operations

Duplicate

Mesh Morpher allows users to duplicate Morph Targets in-engine without the need of any other DCC software.

There are three ways to duplicate Morph Targets:

  • By clicking Duplicate in Mesh Morpher's toolbar
  • By Right-clicking on the Morph Target you want to duplicate in Morph Targets list and select Duplicate.
  • Navigating to Edit top dropdown menu and clicking Duplicate

Once the Duplicate button is pressed, a dialog box will open, asking for a name for the new Morph Target.

If the selected Morph Target name is already in use, a new dialog box will pop asking whether to overwrite or change the name. Pressing Yes will clear and overwrite the existing Morph Target.

Keyboard shortcut: Ctrl + Alt + D

Duplicate doesn't allow multi-selection.

Classic › Editor › Basic Operations

Set Magnitude

Set Magnitude works as a Multiplier in Mesh Morpher.

Set Magnitude works as a Multiplier in Mesh Morpher.
It allows users to change the impact of the deltas in a Morph Target by a given value. Values can go both ways, negative to decrease the impact and positive the increase the impact.

You can Set Magnitude for a single Morph Target or multiple Morph Targets by using Ctrl+Click or Shift+Click to select additional Morph Targets in the Morph Targets list.

There are two ways to Set Magnitude of a Morph Target:

  • By Right-clicking on the Morph Target you want to change Magnitude for, in Morph Targets list, and select Set Magnitude.
  • Navigating to Tools top dropdown menu and clicking Set Magnitude

Once the Set Magnitude button is pressed, a dialog box will open, asking for a Magnitude value.

Keyboard shortcut: Alt + M

Set Magnitude allows multi-selection.

Here is an example of how Magnitude Works with both negative and positive magnitude values.

Original Morph Target

Magnitude: -1.0

Magnitude: 0.5

Magnitude: 2.0

Setting Magnitude is irreversible.

Classic › Editor › Basic Operations

Merge

Mesh Morpher allows users to merge two or more Morph Targets into a single Morph Target.

You can merge two or more Morph Targets by using Ctrl+Click or Shift+Click to select additional Morph Targets in the Morph Targets list.

There are three ways to Merge Morph Targets:

  • By clicking Merge in Mesh Morpher's toolbar
  • By Right-clicking on the Morph Targets list and select Merge.
  • Navigating to Tools top dropdown menu and clicking Merge

Once the Merge button is pressed, a dialog box will open where users can select several options.

  1. Destination Morph Target Name
    Users have to select a new Morph Target name, this Morph Target will hold the merge result.

  2. Delete source Morph Target on Merge
    Enabling this option will remove the selected Morph Targets used for merging.

  3. Merge Type
    There are currently three types of merging availble in Mesh Morpher which can output different results:

    Type Description
    Append Will append the deltas in each selected Morph Target for each Vertex.
    Magnitude Will select the deltas with the highest Magnitude from each Morph Targets for each Vertex.
    Mean Average Will get the sum of deltas in each selected Morph Target for each Vertex and will get the average by dividing the sum by the number of deltas for that vertex.

If the Destination Morph Target name is already in use, a new dialog box will pop asking whether to overwrite or change the name. Pressing Yes will clear and overwrite the existing Morph Target.

If the Destination Morph Target name is part of the selection, a new dialog box will pop asking to pick another name.

Keyboard shortcut: Ctrl + M

The button is greyed out when there's no selection or the selection doesn't have two or more Morph Targets.

Merge only allows multi-selection.

Morph Target merging is irreversible.

Classic › Editor › Tools › General

Options

Mesh Morpher allows users to configure the visuals indicators to help them with the Tools.

Options Description
Enable Wireframe Users can enable/disable Wireframe in Tools.
Wireframe Color Pick a Wireframe color
Material Mode

Sometimes the mesh materials can confuse users or hide certain details. Mesh Morpher allows users to use the meshes material or the Focus Material.

Subdivision Steps Allows users to subdivide the mesh in sculpt tool. The subdivided mesh gets projected on the skeletal mesh when the editing is finished.

Classic › Editor › Tools › General

Masking

Mesh Morpher allows users to select and mask certain portions of the meshes in order to provide them with precision when applying Tools.

Side Masking Menu

Options Description
Toggle Selection

Allows users to toggle drawing selection on/off. When the Mask Selection Drawing is enabled, the notification area will display the following message

Clear Selection Clears the current mask selection
Select All Selects all sections in Mesh Sections
Select Boundary Selects the boundary vertices of the mesh
Select Deltas Selects affected vertices
Select Side Allows users to select vertices located in the picked side.
Sections Displays the current Sections available in the mesh data and allows users to select them. When selecting a section, previous masked vertices are cleared. Once a section is selected, toggling masking allows users to add additional masked vertices to the selection

Draw

Options Description
Draw Selection Mesh

If enabled, the selection will be drawn as a mesh on top of the existing Mesh

Draw Wireframe

If enabled, draws the wireframe of the selection

Draw Bounding Box

If enabled, draws a bounding box around the selection

Draw Points

If enabled, draws the vertices points of the mask selection

Color Set the color of the selection mesh
Wireframe Color Set the color of the selection wireframe
Thickness Set the thickness of the selection drawing elements

Behavior

Options Description
Invert Mask Inverts the behavior of the selection. If enabled, only the vertices that are not part of the selection can be modified. If disabled, users can only modify the vertices that are part of the selection.
Render Unselected Whether to render unselected vertices

Users can save a mask selection to a UStandaloneMaskSelection asset to use it later whenever they want.
To save a selection, users need to go to Edit->Selection
and select Save Selection(enabled only if a selection is already open) or Save Selection As...

Users can also open a previously saved UStandaloneMaskSelection asset by going to Edit->Selection and clicking on Open Mask Selection which will open a asset browser.



Enabling Append Selection, will add the Mask Selection to the existing selection in Tools.

Users can also export a selection to an OBJ file by going to Edit->Selection and clicking on Export Mask Selection to OBJ...

When Masking is toggled on, the Tool is disabled, users can only draw mask selection.

Classic › Editor › Tools › General

Brush

Mesh Morpher allows users to configure the Brush parameters to help them achieve wanted results with the Tools.

Options Description
Size Size of the brush indicator relative to the mesh size
Specify Radius Users can also manually specify a brush radius by enabling this option
Radius Radius of the brush
Step Size By pressing [ and ] users can increase/decrease the brush size by the Step Size amount
Strength Strength of the brush. Changes how impactful the brush actions are
Depth Depth allow to change how deep the Brush gets placed on the Drag Plane, the initial brush positioning.
Falloff Allows to change how impactful the brush can be on the outskirts.
Falloff Type Falloff type applied on the outskirts of the brush.
Enable Symmetry If enabled, a second brush indicator will appear that will be placed at 180 rotation to the Symmetry Axis.
Symmetry Axis Mesh Morpher uses Y forward so the symmetric brush will be placed accordingly
Update Vertex Selection Whether to update the vertex selection on brush move
Only Facing Camera Whether to only hit and select vertices only facing camera.
Only Connected Enabling this options disables Only Facing Camera option. This options allows users to select and use the brushes only on connected triangles.
Angle Threshold The angle threshold at which the triangles are still marked as connected
Stop at UV Seams Stops the iteration of connected triangles at UV seams
Stop at Normal Seams Stops the iteration of connected triangles at Normal seams

Classic › Editor › Tools › General

Indicators

Mesh Morpher allows users to configure how Brush indicators are rendered. Changing thsese settings can increase visibility in certain cases and improve overall user experience.

Options Description
Indicator Thickness Set the Indicator thickness
Indicator Color Set the Indicator color
Show Indicator Sphere Whether to display Sphere Indicators
Indicator Sphere Color Set the color of Sphere Indicators
Indicator Sphere Alpha Set the opacity of Sphere Indicators

Classic › Editor › Tools › General

Shortcuts

Hold key (B) to dynamically change brush size moving mouse left and right 

Hold key (N) to dynamically change brush falloff moving mouse left and right

Hold key (T) to dynamically change brush strength moving mouse left and right

The values are increased by the Step Size value in Brush Settings.

Classic › Editor › Tools

Move Tool

Move Tool allows users to move around vertices using the brush.

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Move tool has two additional modes that allow further functionality:

Holding Ctrl while moving the brush left and right will Move the vertices along the normal

Classic › Editor › Tools

Grab Tool

Grab Tool allows users to grab vertices using the brush.

Grab is an elastic deformation tool.

There are several options that affect how Grab Tool works.

Option Description
Type Grab Type
Stiffness How much the mesh resists shear
Incompressiblity How compressible the spatial region is: 1 - 2 x Poisson ratio
IntegrationTime Integration Time for elasticity
BrushSteps Integration steps

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Classic › Editor › Tools

Sculpt Tool

Sculpt Tool allows users to Sculpt vertices using the sculpt brush.

Holding Ctrl will invert the Sculpt effect to the vertices.

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Classic › Editor › Tools

Smooth Tool

Smooth Tool allows users to Smooth vertices using the sculpt brush.

There are two types of Smoothing. by Preserving UV flow or if disabled then the smoothing is uniform.

Smooth can also be applied to the entire mesh or a mask selection by click on Apply Smoothing.

Options Description
Preserve Volume Reprojects the smoothed vertices maintaining volume.
Iterations Iterations count performed by Apply Smoothing(not by brush sculpting)

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Classic › Editor › Tools

Inflate Tool

Inflate Tool allows users to inflate vertices using the sculpt brush.

Holding Ctrl will deflate(inverted effect) the vertices.

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Classic › Editor › Tools

Pinch Tool

Pinch Tool allows users to Pinch vertices using the sculpt brush.

Holding Ctrl will invert the pinch effect to the vertices.

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Classic › Editor › Tools

Plane Tool

Plane Tool allows users to flatten vertices on the brush plane.

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Classic › Editor › Tools

Flatten Tool

Flatten Tool allows users to flatten vertices using the sculpt brush.

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Classic › Editor › Tools

Restore Tool

Restore Tool allows users to Restore vertices using the brush to their initial(original) position.

Restore is a very powerful tool in Mesh Morpher and it goes beyond using the brush to restore to original positions.

Users can also select a Mask and Apply Restore to the mask selection or the entire mesh.
Preserve Location option restore the vertices while also keeping the bounding box centered at the same location. Preserve Location works with mask selections.

Users can also restore selected sides of the mesh.

Relative Restore allows users to make a section selection and a relative section selection and restore relatively.

The options here are straight forward.

Option Description
Attempt Clip Fix Whether to attempt fixing vertex penetrations
Clip Offset The maximum threshold value we move the vertices to prevent clipping.

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Classic › Editor › Tools

Transform Tool

Option Description
Preserve Pivot Point Wether to preserve Pivot point on transform
Enable Gizmo Offseting Move the Gizmo without affecting Geometry. Holding shift while moving the Gizmo has same effect
Transform Manual Transformation Input

Classic › Editor › Tools

Displace

Classic › Editor › Tools

Scale Tool

Scale Tool allows users to scale vertices using the brush.

Scale is an elastic deformation tool.

Holding Ctrl will invert the Scale effect to the vertices.

There are several options that affect how Scale Tool works.

Option Description
Stiffness How much the mesh resists shear
Incompressiblity How compressible the spatial region is: 1 - 2 x Poisson ratio
IntegrationTime Integration Time for elasticity
BrushSteps Integration steps

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Classic › Editor › Tools

Twist Tool

Twist Tool allows users to twist vertices using the brush.

Twist is an elastic deformation tool.

There are several options that affect how Twist Tool works.

Option Description
Type Twist Type
Stiffness How much the mesh resists shear
Incompressiblity How compressible the spatial region is: 1 - 2 x Poisson ratio
IntegrationTime Integration Time for elasticity
BrushSteps Integration steps

Users can press Ctrl + Z to Undo and Ctrl + Y to Redo the operation.

Classic › Editor › Tools

Select Pose

Classic › Editor › Tools

Reference Skeletal Mesh

Mesh Morpher allows users to select a Reference Mesh in order to help them with Sculpting Tools.

Reference Skeletal Mesh Window can be open by navigating to Tools drop down menu and clicking on Select a Reference Skeletal Mesh.

Once the Select a Reference Skeletal Mesh button is pressed, a dialog box will open where users can select several options.

Options Description
Reference Skeletal Mesh The selected Reference Skeletal Mesh
Materials Materials can be manually assigned to the Reference Skeletal Mesh. If none, then the mesh's materials will be used.
Transform

Transformation that can be applied to the Reference Skeletal Mesh.

Master Pose Type

There are 3 types of Master Pose.
None: No Master Pose
Main: Reference Skeletal Mesh Component has the Main Skeletal Mesh Component as Master Pose
Reference: Main Skeletal Mesh Component has the Reference Skeletal Mesh Component as Master Pose

Users can also enable Morph Targets on the Reference Skeletal Mesh from the right Morph Target List.

Setting the Master Pose component to "Reference" allows to create Corrective Morph Targets which can be used to achieve various things like fitting clothing to other body types.

Keyboard shortcut: Ctrl + Shift + L

Classic › Editor

Advanced Operations

Classic › Editor › Advanced Operations

Create from Mesh

Mesh Morpher allows users to create a Morph Target from another Mesh, thus providing the ability to morph objects/face/bodies into other Skeletal Meshes.

In order for this functionality to work correctly, meshes need to share same vertex count and order.

Mesh Morpher goes even further by checking for the same vertex count and order on any of the available LODs, and if found, will grab the deltas and project them on LOD0(and then the LOD0 projected result will be re-projected on all other LODs).

There are two ways to create Morph Targets from Mesh:

  • By clicking Create from Mesh in Mesh Morpher's toolbar
  • Navigating to Tools top dropdown menu and clicking Create from Mesh

Once the Create from Mesh button is pressed, a dialog box will open where users can select several options.

Options Description
Source The Skeletal Mesh to create the Morph Target from.
New Morph Name Users can also pick the Morph Target name that will be created.
Threshold Maximum Distance threshold between a vertex in the target mesh and a vertex in source mesh, at which they are considered to be correspondent. Used only by Projection.
Normal Incompatibility Threshold Normal threshold at which a triangle is deemed as incompatible. This helps to avoid triangle flipping during Projection.
Smooth Iterations Smooth Iterations steps used to Smooth the resulted Projected Deltas.
Smooth Strength Smooth Strength used to Smooth the resulted Projected Deltas.
Smooth Type Smooth Type used to Smooth the resulted Projected Deltas.

For Meta Human faces, in order to have the best result, in MHC, select same body, eyelashes, eyebrows and hair in order to maximize the possibility to have same vertex count and order on LOD0.

Result

If successful, a dialog box will pop, notifying users whether the operation was successful.

If the Morph Target name is already in use, a new dialog box will pop asking whether to overwrite or change the name. Pressing Yes will clear and overwrite the existing Morph Target.

Keyboard shortcut: Ctrl + Shift + I

The button is greyed out when there's no skeletal mesh loaded

Classic › Editor › Advanced Operations

Create from Mesh Files

Mesh Morpher allows users to create a Morph Target from another Mesh Files and it supports both FBX/OBJ formats.

In order to create Morph Targets from Mesh Files, Mesh Morpher requires two file inputs (Base and Morphed), from which it grabs the deltas. Those deltas are then projected on the Skeletal Mesh.

In order for this functionality to work correctly, both Mesh Files (Base and Morphed) need to share same vertex count and order.

Enabling UV Matching allows users to overcome this limitation.

There are two ways to create Morph Targets from Mesh Files:

  • By clicking Create from Mesh Files in Mesh Morpher's toolbar
  • Navigating to Tools top dropdown menu and clicking Create from Mesh Files

Create from Mesh Files supports both triangulated and quads meshes with the condition that both files have same vertex count and order.

It is recommended that if users want to work with quads, to convert the base file to quads(Blender or any other DCC) and then they duplicate the quad base file(name it Morphed) and they do the work on the duplicate file.

In Blender this is how to convert triangle meshes to quads.

Mesh Morpher exports and imports Mesh Files with X as Forward Axis and Y as Up Axis, therefor imports and exports in third-party DCC files should use the same settings.

In order for the Morph Target to be successfully created, all 3 meshes (Base, Morphed and Skeletal Mesh) should face same direction. This can be always achieved by changing the axes or transforms of the input files.

Mesh OBJ Files have been imported using X as Front and Y UP in blender and exported using the same.

Result

Mesh Morpher doesn't require for Base file to be identical with the Skeletal Mesh, but the more they resemble the better the output result.

Threshold is what controls how permissive Mesh Morpher is when the projection is happening. Higher Threshold means that Mesh Morpher is more permissive with the differences between Base and Skeletal Mesh. With a very low Threshold(for example 0.001) users are hinting that only very similar vertices would be part of the final result.

Mesh Morpher will throw errors when something goes wrong:

  • Morph Target: %s has no valid data. Base Mesh and Morphed Mesh are the same or did not generate any deltas. This error is self explanatory, when the Base and Morphed files are the same, there are no deltas to project.
  • Morph Target: %s has no valid data. Base Mesh and Skeletal Mesh have no similarities? This error could happen for various reasons, either the base mesh is too different from the skeletal mesh, or it doesn't face the same direction as the skeletal mesh.

Default settings are what works in most tests and experiments. Users are supposed to tweak and customize the settings based on their inputs.

Create from Mesh Files and CC4 in Mesh Morpher

If successful, a dialog box will pop, notifying users whether the operation was successful.

If the Morph Target name is already in use, a new dialog box will pop asking whether to overwrite or change the name. Pressing Yes will clear and overwrite the existing Morph Target.

Keyboard shortcut: Ctrl + Shift + F

The button is greyed out when there's no skeletal mesh loaded

Classic › Editor › Advanced Operations › Create from Mesh Files

General

Option Description
Automatically Overwrite If selected, Morph Targets on target Skeletal Mesh will automatically be overwritten without asking.
Bulk Import Whether to enable or disable bulk import. Enabling this option will switch Morphed File to Morphed Directory and vice-versa
Prefix String to prefix morph targets names on bulk import (appears when Bulk Import enabled)
Suffix String to append to morph targets names on bulk import (appears when Bulk Import enabled)

Other settings:

Option Description
New Morph Name Target Morph Name. If it exists you can overwrite. (appears only with Bulk Import disabled)
Render Meshes Whether files are rendered in the scene

Classic › Editor › Advanced Operations › Create from Mesh Files

Base

Options Description
Base File Original/Unchanged Mesh File
Base Use T0 Pose Enable this option to use frame 0 as reference pose. This works only for FBX files. Useful for imports from CC3/CC4
Base Coordinate System Coordinate System used to import the file. Supports both left and right.
Base Front Axis The default Front axis in Unreal Engine(Y)
Base Up Axis The default UP axis in Unreal Engine(Z)
Base Transform Offset the mesh file. Allows location, rotation and scale.

Classic › Editor › Advanced Operations › Create from Mesh Files

Morphed

Options Description
Morphed File Modified version of Base File (appears with Bulk Import disabled)
Morphed Directory Directory containing multiple modified versions of Base File (appears with Bulk Import enabled)
Morphed Use T0 Pose Enable this option to use frame 0 as reference pose. This works only for FBX files. Useful for imports from CC3/CC4
Morphed Coordinate System Coordinate System used to import the file. Supports both left and right.
Morphed Front Axis The default Front axis in Unreal Engine(Y)
Morphed Up Axis The default UP axis in Unreal Engine(Z)
Morphed Transform Offset the mesh file. Allows location, rotation and scale.
Lock Transform If enabled, Morphed inputs use same transform as Base mesh.

Classic › Editor › Advanced Operations › Create from Mesh Files

Options

Option Description
Threshold Maximum Distance threshold between a vertex in the target mesh and a vertex in source mesh, at which they are considered to be correspondent.
Normal Incompatibility Threshold Normal threshold at which a triangle is deemed as incompatible. This helps to avoid triangle flipping during Projection.
Match Material IDs Apply deltas only to vertices that have same material ID. The material ID is checked between skeletal mesh and base file. This requires both to have same material count and order.
Subdivision Subdivide the input files. This usually increase quality and the precision of the final resulted Morph Target if topology is drastically changed in base file

Classic › Editor › Advanced Operations › Create from Mesh Files

UV Match

Option Description
Match By UV

!!Experimental!!

Match Base and Morphed files by UVs, ignoring vertex count and order.

This shouldn't be used with welded meshes because they don't have their UVs intact.

Match UV Iterations Match UV iterations. Vertices without a matching UV correspondent are reiterated for the amount of iterations and assigned neighbor found matches.

Classic › Editor › Advanced Operations › Create from Mesh Files

Smoothing

Option Description
Smooth Iterations Smooth Iterations steps used to Smooth the resulted Projected Deltas.
Smooth Strength Smooth Strength used to Smooth the resulted Projected Deltas.
Smooth Type Smooth Type used to Smooth the resulted Projected Deltas.

Classic › Editor › Advanced Operations

Poser

Mesh Morpher allows users to create Morph Targets from Poses.

Mesh Morpher allows users to create Morph Targets from Poses.
Poses can be an Animation frame, a Bone Snapshot or a combination of an Animation frame and Bones modification.

There are two ways to create Morph Targets from Pose:

  • By clicking Create from Pose in Mesh Morpher's toolbar
  • Navigating to Tools top dropdown menu and clicking Create from Pose

Once the Create from Pose button is pressed, a dialog box will open where users can select several options.

Options Description
Animation Blueprint Allows users to select and enable an Animation Blueprint in Poser
Disable Post Process Blueprint

Toggles the Post Process blueprint in the selected skeletal mesh in Poser

Disable Cloth Simulation

Toggles the cloth simulation for the selected skeletal mesh in Poser

Enable CCD Toggles Continuous Collision Detection in Poser
Reference Mesh Allows users to select a skeletal mesh as a reference
Enable Master Pose Set the Leader/Master Pose Component for the reference mesh to the main skeletal mesh opened in Poser
New Morph Name Users can also pick the Morph Target name that will be created.

Classic › Editor › Advanced Operations › Poser

Bake Skeleton

Bake Skeleton allows users to permanently bake skeleton and mesh changes in Poser to the Skeletal Mesh and Skeleton.

Option Description
Bake to Skeletal Mesh Reference Skeleton This option enables the skeleton changes to be baked in the Skeleton Reference which is located inside the Skeletal Mesh.
Bake Mesh Data This option allows to bake Mesh data to skeletal Mesh. Required to reflect skeleton changes in the mesh data.
Bake To DNA Asset Bakes skeleton and Mesh data to the DNA Asset if available. This is intended for Meta Humans only. It doesn't bake any Morph Target data.
Remove Scaling This scales back to 1,1,1 all bones while preserving translations and rotation. Useful for FBX exports.
Orient Bones List of bones to recompute orientations for. To disable, simply remove the bones from the list. This impacts how Pose Drivers and control Rigs functions(for metahumans as well)
Orient Bones Above Bone Recomputes the orientations for all the bones above the selected bone name in the hierarchy. To disable, simply set the bone name to None. This impacts how Pose Drivers and control Rigs functions(for metahumans as well)
Create Skeletal Mesh Backup Whether to create a backup before baking. Users will be prompted to save the asset. The asset will have "_bk" suffix automatically added.

Classic › Editor › Advanced Operations › Poser

Create Reverse Morph Target

This option allows users to create a reversed Morph Target from the current Pose. 

By default the Morph Targets contain the deltas between the default Skeletal Mesh and the modified Skeletal Mesh.

By creating a Reverse Morph Target, the Morph Target will hold the deltas between the Modified Skeletal Mesh and the default Skeletal Mesh.

If the Toolkit(Main Window) has a Pose asset selected or there is a Base Pose selected in Poser then this Morph Target will be a reversed corrective Morph Target between those two poses.

Classic › Editor › Advanced Operations › Poser

Create Morph Target

This option allows users to create a Morph Target from the current Pose. 

By creating a Morph Target, the Morph Target will hold the deltas between the default Skeletal Mesh and the modified Skeletal Mesh(Poser pose).

If the Toolkit(Main Window) has a Pose asset selected or there is a Base Pose selected in Poser then this Morph Target will be a reversed corrective Morph Target between those two poses.

Classic › Editor › Advanced Operations › Poser

Animation Curves

Poser allows users to interact with Animation Curves.

Animation curves can be enabled and disabled and also exported to OBJ files or converted to Morph Targets.

Classic › Editor › Advanced Operations › Poser › Animation Curves

To Morph Targets

Animation Curves can be converted to Morph Targets.

To do so, select the animation curves and click on To Morph Targets.

A new dialog will open.

In this new dialog users can select a prefix and suffix for the new Morph Targets names.

Classic › Editor › Advanced Operations › Poser › Animation Curves

To OBJ Files

Animation Curves can be exported to OBJ files.

To do so, select the animation curves and click on To OBJ Files or right click the list and select the same.

A new dialog will open.

In this dialog window, users will be able to select a prefix and suffix for the OBJ files, append additional meshes and also weld the OBJ file.

Classic › Editor › Advanced Operations › Poser

Morph Targets

Poser allows users to interact with Morph Targets.

Morph Targets can be enabled and disabled and also exported to OBJ files.

Classic › Editor › Advanced Operations › Poser › Morph Targets

To Bonesnapshot

Bone Snapshots can be created from Morph Targets which allows users to fit the skeleton to match the Morph Target shape.

In order to do so, select a Morph Target and click on To Bonesnapshot.

A dialog window will open.

Option Description
Start Bone Pick the first bone in the Bonesnapshot. Users can select whether to bonesnapshot will start from root or any other bone in the skeleton hierarchy
End Bone The end Bone in the hierarchy that will be part of the bonesnapshot
Include Reference Mesh Whether to include the selected reference skeletal mesh in the bonesnapshot. This option appears only when a reference skeletal mesh is selected in Poser and a Morph Target with the same name exists on both meshes.
Ignore Bones List of Bones to ignore. One per row. Ignored bones will not be part of the bonesnapshot
Ignore String Ignore all bones containing the string. Ignored bones will not be part of the bonesnapshot
Orient Bones List of bones to recompute orientations for. To disable, simply remove the bones from the list. This impacts how Pose Drivers and control Rigs functions(for metahumans as well)
Orient Bones Above Bone Recomputes the orientations for all the bones above the selected bone name in the hierarchy. To disable, simply set the bone name to None. This impacts how Pose Drivers and control Rigs functions(for metahumans as well)
Save Changed Bones Only Whether the bonesnapshot will hold only the bones that have their transform changed during the fitting.
Advanced Fitting Enable this when fitting bones to morph targets for meta human expressions.
Bone to Vertex Threshold Maximum distance at which a bone is deemed to be compatible with a vertex.
Bone to Bone Threshold Maximum distance at which a bone is deemed to be compatible with another bone.
Max Distance To Surface Maximum distance to surface
Use Vertex Weights Whether to use vertex weights when available
Preserve Relative Bone Transforms Whether to preserve relative bone transformations.
Vertex Sample Size Nearest Vertex Sample Size used to reposition the bones.
Advanced Bone Fitting

Advanced Bone Fitting is using Dem Bones and its purpose solely intended to create bonesnapshots from facial expressions morph targets.

Copyright (C) 2019 Electronic Arts Inc. All rights reserved.

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution.
  3. Neither the name of Electronic Arts, Inc. ("EA") nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY ELECTRONIC ARTS AND ITS CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL ELECTRONIC ARTS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Classic › Editor › Advanced Operations › Poser › Morph Targets

Update from Pose

Morph Targets can be updated from the current Pose in Poser.

This means that if the bones changed, by Updating from Pose the deltas in Morph Target will only contain the deltas between the Pose in Poser and the final Morph Target shape.

Classic › Editor › Advanced Operations › Poser › Morph Targets

To OBJ Files

Morph Targets can be exported to OBJ files from Poser

To do so, select the Morph Target and click on To OBJ Files or right click the list and select the same.

A new dialog window will open.

In this dialog window, users will be able to select a prefix and suffix for the OBJ files, append additional meshes and also weld the OBJ file.

Classic › Editor › Advanced Operations › Poser

Correctives

The Poser allows users to create corrective Morph Targets. 

Corrective Morph Targets hold deltas between Base Pose and Current Pose.

In order to set a Base Pose users have to navigate to Tools menu and select Set Current Pose as Base.

To reset the Base Pose select Clear Base Pose.

Clicking on Create Morph Target or Create Reverse Morph Target will create the corrective Morph Target.

Classic › Editor › Advanced Operations › Poser

Bone Editor

Bone Editor in Poser allows users to modify bone transforms and pivots.

Bone Editor allows Symmetry and a lot of additional customization that can improve the experience.

Holding Left Ctrl while clicking a bone will toggle its selection status. Users can select multiple bones at once.

Clicking on no bone will deselect all bones.

Bone editor supports Bone Symmetry and can be enabled by enabling the Symmetry Checkbox

Bonesnapshots are another important component of Bone Editor and users are allowed to Load and Save Bonesnapshots that will hold the skeleton transformation.

Classic › Editor › Advanced Operations › Poser › Bone Editor

Symmetry

The Poser in Mesh Morpher allows users to have transform symmetric bones.

Options Description
Use Symmetric Bones Whether to enable or disable bone Symmetry
Mirror Rotation Whether transforming a symmetric bone uses symmetric rotation
Symmetry Axis Symmetry axis used for symmetric bone transformation

Classic › Editor › Advanced Operations › Poser › Bone Editor

Pivot

The Poser in Mesh Morpher allows Pivot editing.

Options Description
Enable Pivot Editor Enabling Pivot Editor allows users to transform bones without affecting Mesh Data. Disabling the Pivot Editor will bake the changes to the skeletal mesh.
Update Children Whether changing the transform of a Pivot Bone updates its children bones.

Classic › Editor › Advanced Operations › Poser › Bone Editor

Draw

Mesh Morpher allows users to customize the way bones are drawn in the viewport.

Options Descriptions
Draw Bones Whether to draw Bones in viewport
Draw Full Bones Whether to draw Full Bones in viewport
Bone Thickness Bone Indicator Thickness
Bone Indicator Size Bone Indicator Size
Scale Bone Indicator to Bone Size Whether to scale Bone Indicator based on the Bone size
Deselected Bone Color Color used to draw deselected bones
Selected Bone Color Color used to draw selected bones

Classic › Editor › Advanced Operations › Poser › Bone Editor

Bone Scale and Animation Retargeting

When working with Animation or control rigs(modular rigs as well) the engine in general doesn't play well with scaled bones.

To overcome this users should bake with Remove Scaling enabled

The above options works only for bones above root in the skeleton hierarchy.
For root bone(or any other bone) scaling can be removed manually.
After scaling, disable Update Children option in Bone Options side panel and set back the scale to 1.(don't forget to re-enable Update Children after you've completed this step).

Here's a video going through the process.

Classic › Editor › Advanced Operations › Poser › Bone Editor

Lock Bones

Lock the selected bones. Locked Bones always preserve their original transformation when using Transform Gizmo to edit skeleton.

Lock the selected bones. Locked Bones always preserve their original transformation when using Transform Gizmo to edit skeleton.

Classic › Editor › Advanced Operations › Poser › Bone Editor

Unlock Bones

Unlock the selected bones. Locked Bones now being unlocked can be edited using Transform Gizmo.

Unlock the selected bones. Locked Bones now being unlocked can be edited using Transform Gizmo.

Classic › Editor › Advanced Operations › Poser

Bone Snapshots

Bone snapshots are a snapshot of all bones in a skeletal mesh that hold the required data to be loaded at runtime or in editor.

Bonesnapshot menu

Options Description
Asset Picker Allows users to load a bonesnapshot or an animation sequence
Reset Resets the current pose to the Default neutral pose
Save Save a pose to the current bonesnapshot. If a bonesnapshot is not loaded it asks for a new bonesnapshot location
Save As... Save the current pose as a new bonesnapshot
Add Axis Rotation Manually add rotation in degrees on the selected axis. Allows users to rotate manually with increased precision
To Sequence.. Save current Pose as an animation sequence

Classic › Editor › Advanced Operations

Copy

Mesh Morpher allows users to copy/project Morph Targets from one Skeletal Mesh to other Skeletal Meshes.

Users can bulk-copy Morph Targets to multiple Target Skeletal Meshes at once.

Mesh Morpher checks if the source and target skeletal meshes are identical(vertex count, Positions and Normals).
If the Skeletal Meshes are identical then Mesh Morpher proceeds with simply transferring the Morph Targets from Source to Target.
If the Skeletal Meshes are not identical then Mesh Morpher will attempt to project the Morph Targets on the Target Skeletal Meshes using the given parameters.

The quality of the resulted projection is directly proportional with the resemblance and similarity between the Source and Target. The more the meshes look alike, the better the projected result will be.

You can Copy a single Morph Target or multiple Morph Targets by using Ctrl+Click or Shift+Click to select additional Morph Targets in the Morph Targets list.

There are three ways to Copy Morph Targets:

  • By clicking Copy in Mesh Morpher's toolbar
  • By Right-clicking on the Morph Target you want to copy in Morph Targets list and select Copy.
  • Navigating to Tools top dropdown menu and clicking Copy

Once the Copy button is pressed, a dialog box will open where users can select several options.

Users can add and remove multiple Targets by clicking the + sign in the Targets field

Users can remove items from the Targets list by the symbol as in the bellow image and select Delete.

Options Description
New Morph Name This parameter will become visible if only one Morph Target is selected for copying. This is the Morph Target Name on the Target Skeletal Mesh where Mesh Morpher will copy.
Automatically Overwrite

This option will allow users to automatically overwrite Morph Targets on the Target Skeletal Mesh if they already exist. Otherwise, if this option is disabled and a Morph Target with the same name exists on the Target Skeletal Mesh, users will be asked if they want to overwrite.

Selecting No will skip to the next Morph Target to copy, if any.

Threshold Maximum Distance threshold between a vertex in the target mesh and a vertex in source mesh, at which they are considered to be correspondent. Used only by Projection.
Normal Incompatibility Threshold Normal threshold at which a triangle is deemed as incompatible. This helps to avoid triangle flipping during Projection.
Smooth Iterations Smooth Iterations steps used to Smooth the resulted Projected Deltas.
Smooth Strength Smooth Strength used to Smooth the resulted Projected Deltas.
Smooth Type Smooth Type used to Smooth the resulted Projected Deltas.

For single Morph Target copy/projection, if there is any generated result, a dialog box will pop, notifying users whether the operation was successful. For multiple selection this dialog will not show.

Keyboard shortcut: Ctrl + C

The button is greyed out when there's no selection.

Copy allows single and multi-selection.

Morph Target copying is irreversible.

Classic › Editor › Advanced Operations › Wrapper

Options

here are several options that allow users to interact with the Wrapper and pre-configure it.

Source

OptionDescription
SourceMeshAllows users to select the Source Mesh. Source Mesh is the mesh we want to take the shape from using the wrapper.
SourcePoseAllows users to set a pose from an animation sequence asset.
SourcePoseFrameAllows users to select a frame from the pose animation sequence
bHideSourcePreviewMeshWhether to hide the Source preview mesh component
bHideSourceReferenceMeshWhether to hide the Source reference mesh component

Target

OptionDescription
TargetPoseAllows users to set a pose from an animation sequence asset.
TargetPoseFrameAllows users to select a frame from the pose animation sequence
bHideTargetPreviewMeshWhether to hide the Source preview mesh component
bHideTargetReferenceMeshWhether to hide the Source reference mesh component

Options

OptionDescription
NewMorphNameTarget Morph Name. If it exists you can overwrite.

View

OptionDescription
bLockCamerasWhether to lock the cameras to same transform in both viewports. Works only when both viewports have the same view types.

Classic › Editor › Advanced Operations › Wrapper

Wrapper Settings

The Wrapper has various options that allow users to customize how the wrapping performs and influence its results.

General

OptionDescription
KNNNumber of closest points when looking for correspondents on the opposite surface.
AffinityThresholdAffinity values higher than this make flag values 1 (all others 0).
bNormaliseAffinityAllow vertex affinities to be normalized independently to negate distance bias.
VertexRangeRange for discovering correspondences
bUseOrientationWhether or not to use Vertex Normals when evaluating correspondences.

Iterations

OptionDescription
IterationsNumber of iterations. Higher count often provides better results.
StickyIterationsWeight Smoothing Sticky Iterations. Higher value means less impact as the vertices are moving together.
ElasticIterationsWeight Smoothing Elastic Iterations. Higher value means less impact as the vertices are moving together.

Smoothing

OptionDescription
SmoothNeighboursNumber of neighbors in local smoothing region for each vertex.
SmoothGaussianWidthSmoothing Gaussian Width.

Resolution

OptionDescription
SourceResolutionResolution subdivision for source mesh.
TargetResolutionResolution subdivision for target mesh.
bForceFitForce fitting attempts a final fit of the wrap result to the source mesh. This requires a higher source resolution for better results.

Control Points

OptionDescription
ControlPointInfluenceControl Point Influence Radius.
ControlPointNormalThresholdWhether or not the Control Points can find in their radius only un-flipped triangles.

Classic › Editor › Advanced Operations › Wrapper

Control Points

Control Points are used to hint the geometry to the non-rigid fitting algorithm.

Control Points are used to hint the geometry to the non-rigid fitting algorithm.
Users can add as many Control Points they want and can overlap them without any issue.

Control points need to have same count and order in both target and source meshes as they`re used to hint correspondent landmarks between the two of them to the non-rigid fitting algorithm.

There are several options that allow users to configure how control points work in Mesh Morpher's wrapper.

In order to add/remove Control Points, users have to select Control Points in Advanced Menu.

Users can Save, Load, Clear and change the Influence of the Control Points for both Target and Source.

To select a Control Point, users can Left Click on it which also allows them to change the influence for the selected Control Point

Reset Influence resets the Influences for all Control Points to the value located in Wrapper Settings.

Right Clicking on a Control Point will remove it and doing so will change the Index for the Control Points with a higher index.

Aligning bones, changing Section Selection or masking will clear out the selected Control Points.

Options Description
Control Point Influence The Influence of a Control Point determines the radius in which the control points gather mesh vertices and uses them to find correspondent vertices in its Pair.
ControlPointNormalThreshold Whether or not the Control Points can find in their radius only un-flipped triangles.

Holding Left Shift while adding a Control Point will create a Symmetric Control Point as well.

There are several visual settings for Control Points that can be access by navigating to Edit->Settings.

Options Description
ElementThickness The thickness used to display the debug sphere for Control Points
ControlPointSize The size of the displayed Control Point dot marker on the mesh
ControlPointFontColor Font Color of the Control Point Index Indicator
ControlPointFontShadowColor Font Shadow Color of the Control Point Index Indicator
bShowDebugControlPoints Whether to display the influence radius debug sphere for Control Points.

Classic › Editor › Advanced Operations › Wrapper

Bone Editor

The Bone Editor in the Wrapper allows users to match poses or set specific poses for both Target and Source.

In order to open Bone Editor, users have to select Bone Editor in Advanced Menu.

Selecting a bone in the Bone list or clicking on a bone in the viewport for both target and source will select the bone and display a Gizmo that allows to change rotation, translation and scale.

Users can also manually enter transformation values in the widgets below the bone list.

Bone Editor allows Undo/Redo actions by using Ctrl+Z and Ctrl+Y

Bone editor supports Bone Symmetry and can be enabled by enabling the Symmetry Checkbox

Bonesnapshots are another important component of Bone Editor and users are allowed to Load and Save Bonesnapshots that will hold the skeleton transformation.

There are several visual settings for Bone Editor that can be accessed by navigating to Edit->Settings.

bDrawBones Whether to draw bone indicators in the Target and Source Viewports
bDrawFullBones Whether to draw bone indicators from start to end in the Target and Source Viewports
BoneIndicatorSize The bone drawing indicator size
bScaleBoneIndicatorToBoneSize Whether to scale the bone indicator relative to the bone size
DeselectedBoneColor The color of the bone indicators when they're unselected
SelectedBoneColor The color of the bone indocators when they're selected

Classic › Editor › Advanced Operations › Wrapper

Section Selection

Section Selection in the Wrapper allows users to select certain mesh sections in both Target and Source. The wrapping will proceed only for the selected mesh data.

In order to open Section Selection, users have to select it in Advanced Menu.

Users can select multiple sections or deselect.

Classic › Editor › Advanced Operations › Wrapper

Masking

Classic › Editor › Advanced Operations

Bake

Mesh Morpher allows users to bake Morph Targets on the Skeletal Mesh.

Mesh Morpher allows users to bake Morph Targets on the Skeletal Mesh.
Baking writes the Morph Target deltas to the Skeletal Mesh Import data(if available) or LOD Model data.
Baking is persistent and permanent.

There are two ways to Bake Morph Targets:

  • By clicking Bake in Mesh Morpher's toolbar
  • Navigating to Tools top dropdown menu and clicking Bake

Once the Bake button is pressed, a dialog box will open where users can select which Morph Targets to Bake.

Mesh Morpher will attempt to bake the Morph Targets that have a weight different than 0.
After baking is completed the baked Morph Targets are removed from the Skeletal Mesh.

Users can select multiple Morph Targets with different weight from the list and in the preview viewport they can visualize how the final result will look like.

After the Morph Targets are baked. Mesh Morpher will also attempt to offset the existing Morph Targets in Import Data so they'll reflect the actual mesh.

Keyboard shortcut: Ctrl + B

The button is greyed out when there's no skeletal mesh loaded

Morph Target Baking is irreversible.

Classic › Editor › Advanced Operations

Recompute Normals

Recompute Normals allows users to recompute the Normals for a selection of skeletal meshes.

The Normals are computed in such way that there is no seam if multiple skeletal meshes are selected as the meshes are getting welded in the underlying algorithm and the normals are then projected back to the Skeletal Meshes.

Option Description
Skeletal Meshes Array of skeletal Meshes
Update DNA Asset Bakes Normals to DNA Asset Mesh Data if available. This is intended for Meta Humans only.
Merge Vertex Tolerance Edges are coincident if both pairs of endpoint vertices are closer than this distance
Merge Search Tolerance Edges are considered as potentially the same if their midpoints are within this distance. Due to floating-point roundoff this should be larger than MergeVertexTolerance.
Merge Only Unique Pairs Only merge unambiguous pairs that have unique duplicate-edge matches

Classic › Editor › Advanced Operations

Stitch

Mesh Morpher has the ability to stitch two morph targets between two meshes.

Option Description
Boundary Threshold Distance Threshold at which the boundary vertices are coincident
Use Edge Closest Point Whether the correspondent vertices are glued to the closest point on edges.
Vertex Threshold The Maximum Threshold between the original position and the welded position
Merge Vertex Tolerance Edges are coincident if both pairs of endpoint vertices are closer than this distance
Merge Search Tolerance Edges are considered as potentially the same if their midpoints are within this distance. Due to floating-point roundoff this should be larger than MergeVertexTolerance.
Merge Only Unique Pairs Only merge unambiguous pairs that have unique duplicate-edge matches

Classic › Editor › Advanced Operations

Transfer Weights

Classic › Editor › Exporter

OBJ To FBX

With UE 5.1 the import pipeline has changed for meshes.

With UE 5.1 the import pipeline has changed for meshes.
In order to import the full body meta humans OBJs as FBX to use it for Wrapper follow these steps

Classic › Editor › Exporter

Export Morph Target as OBJ

Morph Targets can be exported to OBJ files from anywhere in Mesh Morpher where there is a Morph Target List

To do so select your Morph Targets and right click the list and select Export to OBJ File(s).

A new dialog window will open.

In this dialog window, users will be able to select a prefix and suffix for the OBJ files, append additional meshes and also weld the OBJ file.

Classic

Runtime

25 pages in this section.

Classic › Runtime

Standalone Morph Target

Standalone Morph Targets are a custom implementation of standard Morph Targets.

Standalone Morph Targets are a custom implementation of standard Morph Targets.
This new type of asset format allows users to store Morph Targets as standalone assets which can be visible in Content Browser.

The usage of Standalone Morph Targets is different from standard Morph Targets and the main purpose here is to allow transferring, baking and projection at runtime, easier, without interfering with the existing Morph Targets.

Standalone Morph Targets are exposed to blueprints and there are several nodes and tools that allow users to manipulate them at runtime.

Get Delta

Get Delta LODs

Get Delta Num

Get Skeletal Mesh

Get Morph Target Name

Set Morph Target Name

Get Weight

Set Weight

Classic › Runtime › Standalone Morph Target

Get Delta

Retrieves a Delta at Index for the provided Standalone Morph Target and LOD.

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Target

Standalone Morph Target Object Reference

Standalone Morph Target to retrieve the Delta from.

LOD

Integer

LOD Index to retrieve the Delta from. If the LOD is not available in the Standalone Morph Target then the function will retrieve false.

Index

Integer

Delta Index to retrieve

Outputs

Parameter Description

Position

Vector

Delta Position

Normal

Vector

Delta Normal

Source Index

Integer

Vertex index associated with found Delta

Return Value

Boolean

Returns true if the Delta index was found.

Classic › Runtime › Standalone Morph Target

Get Delta LODs

Retrieve the amount of LODs used by the provided Standalone Morph Target.

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Target

Standalone Morph Target Object Reference

Standalone Morph Target to retrieve the LODs count from.

Outputs

Parameter Description

Return Value

Integer

LODs count.

Classic › Runtime › Standalone Morph Target

Get Delta Num

Retrieves the Delta count for the provided Standalone Morph Target and LOD.

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Target

Standalone Morph Target Object Reference

Standalone Morph Target to retrieve the Delta from.

LOD

Integer

LOD Index to retrieve the Delta from. If the LOD is not available in the Standalone Morph Target then the function will return -1.

Outputs

Parameter Description

Return Value

Integer

Returns -1 if provided LOD is invalid.

Classic › Runtime › Standalone Morph Target

Get Skeletal Mesh

Retrieves the assigned Skeletal Mesh for the provided Standalone Morph Target.

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Target

Standalone Morph Target Object Reference

Standalone Morph Target to retrieve the Skeletal Mesh from.

Outputs

Parameter Description

Return Value

Skeletal Mesh Object Reference

Skeletal Mesh Object

Classic › Runtime › Standalone Morph Target

Get Morph Target Name

Retrieves the assigned Name for the provided Standalone Morph Target.

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Target

Standalone Morph Target Object Reference

Standalone Morph Target to retrieve the Name from.

Outputs

Parameter Description

Return Value

Name

Morph Target Name

Classic › Runtime › Standalone Morph Target

Set Morph Target Name

Assigns a new Morph Target Name for the provided Standalone Morph Target.

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Target

Standalone Morph Target Object Reference

Standalone Morph Target to assign the Name to.

New Name

Name

The new Morph Target Name

Classic › Runtime › Standalone Morph Target

Get Weight

Retrieves the current Weight for the provided Standalone Morph Target.

Retrieves the current Weight for the provided Standalone Morph Target.
Weight represents the impact this Standalone Morph Target has on its Skeletal Mesh

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Target

Standalone Morph Target Object Reference

Standalone Morph Target to retrieve the Name from.

Outputs

Parameter Description

Return Value

Float (single-precision)

Current Weight

Classic › Runtime › Standalone Morph Target

Set Weight

Bakes the Standalone Morph Target in Skeletal Mesh Render Data by the provided Weight.

Bakes the Standalone Morph Target in Skeletal Mesh Render Data by the provided Weight.
Weight represents the impact this Standalone Morph Target has on its Skeletal Mesh

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Target

Standalone Morph Target Object Reference

Standalone Morph Target to retrieve the Name from.

New Weight

Float (single-precision)

New Weight of the provided Standalone Morph Target

Classic › Runtime › Standalone Morph Target

Duplicate Standalone Morph Target

Duplicate a Standalone Morph Target and assign a new Target Skeletal Mesh

Inputs

Parameter Description

Outer

Object Reference

Outer used for the duplicate Standalone Morph Target

StandaloneMorphTarget

Standalone Morph Target Object Reference

Standalone Morph Target to duplicate

NewTargetSkeletalMesh

Skeletal Mesh Object Reference

New Target Skeletal Mesh to assign to the duplicate. If left empty, the Target Skeletal Mesh will be the same as the input Standalone Morph Target

Outputs

Parameter Description

Return Value

Standalone Morph Target Object Reference

Returns nullptr if duplicating fails.

Classic › Runtime › Project

Project Standalone Morph Targets to Morph Targets

Projects an array of Standalone Morph Targets on a Target Mesh and creates Morph Targets on the Target Skeletal Mesh.

Projects an array of Standalone Morph Targets on a Target Mesh and creates Morph Targets on the Target Skeletal Mesh.
Morph Targets are projected on all Target Mesh LODs.
Projection is multi-threaded but can be very intensive on meshes with big data.

Unreal Engine 5.0.X requires Use GPU for computing morph targets disabled in project settings. This doesn't apply for UE 5.1 and above.

GPU morph targets computing settings

Creating Morph Targets at runtime will invalidate existing Morph Targets available in editor.

Create Morph Targets at runtime from Mesh Files

You can learn more about Standalone Morph Targets here.

Inputs

Parameter Description

Morph Targets

Array of Standalone Morph Target Object References

Standalone Morph Targets to project.

Target Mesh

Skeletal Mesh Object Reference

Target Mesh to project Standalone Morph Targets on.

Max LOD

Integer

Maximum LOD Index on the Target Mesh to project the Morph Targets

Vertex Threshold

Float (double-precision)

Maximum Distance threshold between a vertex in the target mesh and a vertex in source mesh, at which they are considered to be correspondent.

Normal Incompatibility Threshold

Float (double-precision)

Normal threshold at which a triangle is deemed as incompatible. This helps to avoid triangle flipping during Projection.

Smooth Iterations

Integer

Smooth Iterations steps used to Smooth the resulted Projected Deltas.

Smooth Strength

Float (double-precision)

Smooth Strength used to Smooth the resulted Projected Deltas.

Smooth Type

EMeshMorpherSmoothTypes Enum

Smooth Type used to Smooth the resulted Projected Deltas.

Outputs

Parameter Description

Return Value

Boolean

Returns true if at least one Morph Target was successfully created.

Classic › Runtime › Project

Project Standalone Morph Targets

Projects an array of Standalone Morph Targets on a Target Mesh and creates Standalone Morph Targets.

Projects an array of Standalone Morph Targets on a Target Mesh and creates Standalone Morph Targets.
Morph Targets are projected on all Target Mesh LODs.
Projection is multi-threaded but can be very intensive on meshes with big data.

Create Morph Targets at runtime from Mesh Files

You can learn more about Standalone Morph Targets here.

Inputs

Parameter Description

Outer

Object Reference

Outer used for the resulted Standalone Morph Targets created during Projection.

Morph Targets

Array of Standalone Morph Target Object References

Standalone Morph Targets to project.

Target Mesh

Skeletal Mesh Object Reference

Target Mesh to project Standalone Morph Targets on.

Max LOD

Integer

Maximum LOD Index on the Target Mesh to project the Morph Targets

Vertex Threshold

Float (double-precision)

Maximum Distance threshold between a vertex in the target mesh and a vertex in source mesh, at which they are considered to be correspondent.

Normal Incompatibility Threshold

Float (double-precision)

Normal threshold at which a triangle is deemed as incompatible. This helps to avoid triangle flipping during Projection.

Smooth Iterations

Integer

Smooth Iterations steps used to Smooth the resulted Projected Deltas.

Smooth Strength

Float (double-precision)

Smooth Strength used to Smooth the resulted Projected Deltas.

Smooth Type

EMeshMorpherSmoothTypes Enum

Smooth Type used to Smooth the resulted Projected Deltas.

Outputs

Parameter Description

Out Morph Targets

Array of Standalone Morph Target Object References

Resulted Standalone Morph Targets.

Classic › Runtime › Create from Mesh Files

Create Morph Target from Mesh Files

Grabs the deltas between Base and Morph files and projects them on the Target Mesh and creates a Morph Target on the Target Skeletal Mesh.

Grabs the deltas between Base and Morph files and projects them on the Target Mesh and creates a Morph Target on the Target Skeletal Mesh.
This node requires Base and Morphed files to be FBX/OBJ format.
Base and Morphed files are required to have same vertex count and order.
Morph Targets are projected on all Target Mesh LODs.
Projection is multi-threaded but can be very intensive on meshes with big data.

Unreal Engine 5.0.X requires Use GPU for computing morph targets disabled in project settings. This doesn't apply for UE 5.1 and above.

GPU morph targets computing settings

Creating Morph Targets at runtime will invalidate existing Morph Targets available in editor.

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Base File

Mesh Morpher FBXInput Structure (by ref)

FBX File and Import Settings of the Base FBX.

Morphed File

Mesh Morpher FBXInput Structure (by ref)

FBX File and Import Settings of the Morph FBX.

Name

Name

Morph Target Name.

Target Mesh

Skeletal Mesh Object Reference

Target Mesh to project Standalone Morph Targets on.

Max LOD

Integer

Maximum LOD Index on the Target Mesh to project the Morph Targets

Vertex Threshold

Float (double-precision)

Maximum Distance threshold between a vertex in the target mesh and a vertex in source mesh, at which they are considered to be correspondent.

Normal Incompatibility Threshold

Float (double-precision)

Normal threshold at which a triangle is deemed as incompatible. This helps to avoid triangle flipping during Projection.

Smooth Iterations

Integer

Smooth Iterations steps used to Smooth the resulted Projected Deltas.

Smooth Strength

Float (double-precision)

Smooth Strength used to Smooth the resulted Projected Deltas.

Smooth Type

EMeshMorpherSmoothTypes Enum

Smooth Type used to Smooth the resulted Projected Deltas.

Outputs

Parameter Description

Return Value

Boolean

Returns true if the Morph Target was successfully created.

Classic › Runtime › Create from Mesh Files

Create Standalone Morph Target from Mesh Files

Grabs the deltas between Base and Morph files and projects them on the Target Mesh and creates a Standalone Morph Target.

Grabs the deltas between Base and Morph files and projects them on the Target Mesh and creates a Standalone Morph Target.
This node requires Base and Morphed files to be FBX/OBJ format.
Base and Morphed files are required to have same vertex count and order.
Morph Targets are projected on all Target Mesh LODs.
Projection is multi-threaded but can be very intensive on meshes with big data.

Create Morph Targets at runtime from Mesh Files

You can learn more about Standalone Morph Targets here.

Inputs

Parameter Description

Outer

Object Reference

Outer used for the resulted Standalone Morph Targets created during Projection.

Base File

Mesh Morpher FBXInput Structure (by ref)

FBX File and Import Settings of the Base FBX.

Morphed File

Mesh Morpher FBXInput Structure (by ref)

FBX File and Import Settings of the Morph FBX.

Name

Name

Assigned Morph Target Name.

Target Mesh

Skeletal Mesh Object Reference

Target Mesh to project Standalone Morph Targets on.

Max LOD

Integer

Maximum LOD Index on the Target Mesh to project the Morph Targets

Vertex Threshold

Float (double-precision)

Maximum Distance threshold between a vertex in the target mesh and a vertex in source mesh, at which they are considered to be correspondent.

Normal Incompatibility Threshold

Float (double-precision)

Normal threshold at which a triangle is deemed as incompatible. This helps to avoid triangle flipping during Projection.

Smooth Iterations

Integer

Smooth Iterations steps used to Smooth the resulted Projected Deltas.

Smooth Strength

Float (double-precision)

Smooth Strength used to Smooth the resulted Projected Deltas.

Smooth Type

EMeshMorpherSmoothTypes Enum

Smooth Type used to Smooth the resulted Projected Deltas.

Outputs

Parameter Description

Morph Target

Standalone Morph Target Object Reference

Resulted Standalone Morph Target.

Classic › Runtime › Utilities

Export Skeletal Mesh To OBJ

Exports a Skeletal Mesh Render Data to an OBJ File.

Exports a Skeletal Mesh Render Data to an OBJ File.
Export is done using X as Forward Axis and Y as Up Axis.
This node exports the Skeletal Mesh Render Data and it will reflect any baked Standalone Morph Targets.

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Skeletal Mesh

Skeletal Mesh Object Reference

Skeletal Mesh to Export.

File Path

String

Destination File Path.

LOD

Integer

The LOD to export. This is automatically clamped to match the skeletal mesh.

Export Welded

Boolean

Whether to export a welded mesh.

Show Progress in PIE

Boolean

Whether to display the progress bar in PIE.

Outputs

Parameter Description

Return Value

Boolean

Returns true if exported successfully.

Classic › Runtime › Utilities

Get Morph Targets Names

Retrieve all Morph Targets Names from a Skeletal Mesh.

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Skeletal Mesh

Skeletal Mesh Object Reference

Skeletal Mesh to retrieve Morph Targets names from.

Outputs

Parameter Description

Names

Array of Names

The array of Morph Target Names retrieved from the Skeletal Mesh

Classic › Runtime › Utilities

Find Morph Target

Attempts to find a Morph Target with the given Name

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Skeletal Mesh

Skeletal Mesh Object Reference

Skeletal Mesh to search on.

Name

Name

The Name to search for

Outputs

Parameter Description

Return Value

Morph Target Object Reference

Returns a valid Morph Target Object if the search was successful.

Classic › Runtime › Utilities

Remove Morph Target

Removes a Morph Target with the given name from the Skeletal Mesh.

Create Morph Targets at runtime from Mesh Files

Inputs

Parameter Description

Skeletal Mesh

Skeletal Mesh Object Reference

Skeletal Mesh to remove from.

Name

Name

The Name of the Morph Target to be removed

Outputs

Parameter Description

Return Value

Boolean

Returns true if the Morph Target was successfully removed.

Classic › Runtime › Utilities

Duplicate Skeletal Mesh

Duplicate a Skeletal Mesh. It duplicates, cloth, physics and LOD data. Morph Targets are not transferred to the duplicate.

This functionality is available only for UE 5.2 and above

Useful to instance skeletal mesh before applying Standalone Morph Targets.

Inputs

Parameter Description

Outer

Object Reference

Outer used for the duplicate Skeletal Mesh

SkeletalMesh

Skeletal Mesh Object Reference

Skeletal Mesh to duplicate

bNeedsCPUAccess

boolean

Whether to enable CPU Access for the duplicate mesh

Outputs

Parameter Description

Return Value

Skeletal Mesh Object Reference

Returns nullptr if duplicating fails.

Classic › Runtime › Utilities

Load Bonesnapshot

Load a Bonesnapshot through Animation Blueprints. 

Classic › Runtime › Utilities

RigLogicNoBones

This Animation Blueprint node allows users to select which bones are updated by Meta Human Rig Logic functionality.

Ignore Type Description
Ignore Selected Bones that are listed will not be updated by rig logic
Ignore Unselected Bones that are listed will be updated by rig logic

Right clicking the nodes brings up its own menu:

Add Bones adds one item to Bones array

Add Bones from Clipboard pastes bones array from clipboard into the Bones array

Clear Bones clears the entire Bones array. Requires selecting Refresh Nodes afterwards so all node Pins get also removed.

To have a fully functional Meta Human head that correctly attaches to the body. You need to make sure the following bones are not ignored:
root
pelvis
spine_01
spine_02
spine_03
spine_04
spine_05
clavicle_pec_l
clavicle_pec_r
spine_04_latissimus_l
spine_04_latissimus_r
clavicle_l
clavicle_out_l
clavicle_scap_l
upperarm_l
upperarm_correctiveRoot_l
upperarm_out_l
upperarm_fwd_l
upperarm_in_l
upperarm_bck_l
clavicle_r
clavicle_out_r
clavicle_scap_r
upperarm_r
upperarm_correctiveRoot_r
upperarm_out_r
upperarm_fwd_r
upperarm_in_r
upperarm_bck_r
neck_01
neck_02
head
FACIAL_C_FacialRoot

Studio and Graph

398 pages in this section.

Studio and Graph

Introduction

Mesh Morpher builds and reshapes meshes with a node graph. You place nodes, wire them together, and each one does a single job: load a file, decimate, unwrap, sculpt, bake, write an FBX. The graph ...

Mesh Morpher builds and reshapes meshes with a node graph. You place nodes, wire them together, and each one does a single job: load a file, decimate, unwrap, sculpt, bake, write an FBX. The graph is the recipe, so the same sequence runs again tomorrow on a different asset without you repeating a single click.

This section documents the node library, node by node. There are over 300 of them across 41 categories, and every page here describes the pins, the settings and what the node actually does with them.

Two products, one node library

Mesh Morpher StudioA standalone Windows application. No engine, no editor, no project - just the graph, a viewport and your files.https://meshmorpher.com/studio
Mesh Morpher GraphThe same graph as an in-editor plugin for Unreal Engine, reading and writing the assets already in your project.https://meshmorpher.com/graph

They are the same tool wearing two coats. The node library, the graph editor, the sculpt brushes, the Python stage and the .mmgraph file format are shared, so a graph built in one opens in the other. That is why one reference covers both.

Fifteen nodes are the exception. They read or write Unreal Engine assets - a Static Mesh, a Skeletal Mesh, a Texture asset, a MetaHuman DNA asset - so they only exist inside the editor. Their pages carry an Editor-only node banner at the top. Everything else runs in both.

Mesh Morpher Classic is a separate product: the original morph-target toolkit for Unreal Engine, with its own runtime module. It is not a node graph and it is not documented in this section.

What a graph is, and what it is not

A node is one operation. It has input pins on the left, output pins on the right, and a settings list you edit in the Details panel. Wires carry meshes, weight maps, textures, transforms, landmarks, deltas and plain numbers between them.

What surprises people coming from other node editors is that a graph is not a timeline and nothing runs continuously. There are two kinds of node and it is worth knowing which you are looking at:

How it runs Examples
Reactive Recomputes by itself whenever its input changes. There is nothing to press. Recompute Normals, Mesh Health, Weld, Compact
Action Waits for you. It has a button in the Details panel under Actions, and it does nothing until you click it. Simplify, Generate UVs, Bake Maps, Write FBX, Wrangle

A stale output is kept, never thrown away. Change the input of a node that has already produced a result and the old result stays on the pin, marked out of date, until you re-run the node. Nothing downstream silently empties out while you are in the middle of editing.

Three more habits are worth forming early:

  • Select a node to look at it. The viewport shows the output of whatever node is selected, so clicking your way down the chain is how you find the step that went wrong.
  • Every node carries its own documentation. The book icon on a node opens View node documentation without leaving the app. These pages are the same material, indexed and cross-linked.
  • Undo covers the whole graph. Wiring, node settings, sculpt strokes and paint are all one transactional history.

Finding your way around

The sidebar lists every category. If you know what you want to do but not which node does it, start here.

To do this Look in
Get geometry in and out Importers, Exporters, Stream, Geometry Cache
Build and reshape Geometry, Voxel, Sculpt, Paint, Deltas
Repair, measure and select Repair, Selection, Weight Map
UVs, textures and materials UV, Texture, Materials
Rig, skin and pose characters Skeleton, Morph Targets, MetaHuman DNA, Animation
Fit one mesh onto another Wrapper, Cage Deformer, RBF Deformer
Compute, script and automate Wrangle, Math, Utility, AI

When no node does the thing you want, Wrangle does. Write a short expression and it runs once per vertex, per triangle, per corner, per texel, or once for the whole mesh - with loops, neighbour lookups, noise, donor-mesh reads and a full Python stage. It has a reference of its own under this section.

What you need to run it

Mesh Morpher Studio Mesh Morpher Graph
Platform Windows 10 or 11, 64-bit Windows 64-bit
Host None - it is a standalone application Unreal Engine 5.6 to 5.8
Graphics DirectX 12 or DirectX 11, Shader Model 5 or newer Whatever the editor is running
Memory A discrete card with 6 GB or more is recommended 6 GB or more recommended for sculpting
Python Bundled, version 3.11 Bundled, version 3.11

Mesh Morpher checks your graphics device on startup and tells you plainly if something will hold it back - an integrated card sharing system memory, a driver on the known-problem list, or a driver old enough to have shader-compilation bugs. Sculpting and the GPU deformers need real graphics hardware; the rest of the library does not.

Next

Getting StartedInstall, activate, learn the window, and build your first graph in about ten minutes./pages/L6mwCPm75lshJDYjwkON
WrangleThe expression and Python node, with its own full language reference./pages/ijo3Z7vYLbtvQ02CJtaW
Patch NotesWhat changed, release by release./pages/DNdweavnSwtlhRJCE5XY

Studio and Graph

Getting Started

Studio is a standalone Windows application. Nothing else has to be installed first.

Install and activate

Studio is a standalone Windows application. Nothing else has to be installed first.

  1. 1

    Download and run the installer

    Sign in at meshmorpher.com and download the current Studio build from your account.

  2. 2

    Launch it

    The first launch opens the Mesh Morpher - Activation window: paste in your licence key and the machine is activated. A valid licence is required before the application opens.

  3. 3

    Read the startup check

    Mesh Morpher inspects your graphics device and says plainly if something will hold it back - an integrated card sharing system memory, an old driver, or less than 6 GB of graphics memory. Sculpting and the GPU deformers need DirectX 12 or DirectX 11 with Shader Model 5 or newer.

Graph is an in-editor plugin for Unreal Engine 5.6 to 5.8, Windows 64-bit.

  1. 1

    Install the plugin

    Install it for your engine version from your account or from the Fab listing, then enable MeshMorpherGraph in the project's plugin list and restart the editor.

  2. 2

    Open the graph

    Click the Mesh Morpher button on the Level Editor toolbar, or go to Window > Mesh Morpher > Mesh Morpher. It opens a tab called Mesh Morpher Graph.

  3. 3

    Activate

    The same licence window appears on first use. Paste in your key and the machine is activated.

Inside the editor you also get the fifteen editor-only nodes that read and write Unreal assets - Static Meshes, Skeletal Meshes, Texture assets and MetaHuman DNA. Every other node behaves identically in both products.

The window

Five panels, arranged however you like. Window switches them; drag a tab to redock it.

Panel What it is for
Graph The canvas. Nodes, wires, comment boxes, the minimap and the search box.
Viewport A 3D preview of whichever node is currently selected.
Target Viewport A second preview, for comparing a result against a reference side by side.
Details The selected node's Properties, and its Actions - the buttons that make an action node run.
Scene The outliner: everything currently in the preview scene.
Agentic The in-app AI assistant, which can read and edit the graph through the same actions you use by hand.

Above them sit four menus - File, Edit, Window and Help - and the toolbar's New, Open, Save and Settings buttons.

Build your first graph

This one needs no files at all: Primitive arrives already carrying a mesh, so there is something to look at from the first click.

  1. 1

    Start a new graph

    File > New Graph, or pick New empty graph in the welcome dialog.

  2. 2

    Add a Primitive node

    Right-click anywhere on the canvas. The Add Node menu opens with the search box already focused - type primitive, then click Primitive.

    Select it and pick a shape in Details. The viewport fills in immediately, because Primitive is a reactive node: there is no button to press.

  3. 3

    Wire a Sculpt Mesh node onto it

    Drag from Primitive's Mesh output pin and let go over empty canvas. The same menu opens, now filtered to Compatible with Mesh - so only nodes that can actually accept a mesh are offered. Choose Sculpt Mesh and it is placed and wired in one gesture.

  4. 4

    Sculpt

    Select the Sculpt Mesh node, pick a brush from the tool column, and pull the geometry around in the viewport. Press Accept when you are happy - that is what commits the strokes to the node's output.

  5. 5

    Write it out

    Drag from Sculpt Mesh's output, add Write FBX, then press its action button in Details and choose a destination. Export nodes never fire on their own - a graph should not write files while you are still editing it.

Three things that save an afternoon

Selecting a node is how you inspect it. The viewport always shows the output of the selected node, so clicking back along the chain is how you find the step that broke - not a debug mode, just selection.

Some nodes run themselves, others wait for you. Reactive nodes (Recompute Normals, Weld, Mesh Health) recompute whenever their input changes. Action nodes (Simplify, Generate UVs, Bake Maps, every exporter, Wrangle) do nothing at all until you click their button under Actions. If a node seems to be ignoring you, check the Details panel for a button.

An out-of-date output is kept, not cleared. Change the input of a node that has already produced a result and the old result stays on the pin, flagged as stale, until you re-run the node. In the app's own words: this node's output was computed from earlier input and is now out of date; it has been kept rather than overwritten. Nothing downstream empties out mid-edit - but do not mistake a stale preview for a fresh one.

Start from an example instead

The welcome dialog's Start from an example opens a set of complete, wired graphs that each solve one real job. Every one carries a note across the canvas telling you which button to press next, in order.

Example What it shows
Open a mesh file The smallest useful graph. Point Load File Mesh at an FBX or OBJ and it appears in the preview; Recompute Normals then cleans up its shading on its own.
Sculpt a primitive Needs no files. Create Primitive already carries a mesh, so select the Sculpt node, pick a brush from the tool column and start pulling geometry around.
Simplify and export FBX Bring a dense scan or sculpt down to a triangle budget with UV islands and material sections intact, then write it out as FBX.
Generate UVs and bake maps Give a low-poly a fresh UV atlas, project a high-poly's detail into it, and write the tangent-space normal map to disk. Tick more map types on the Bake node for AO, curvature or height.
Clean up a scan and export OBJ The usual repair order for imported scan data: weld coincident vertices, fill the boundary holes that exposes, pack the index range, write an OBJ.
Symmetrize a scan Wrap a scan onto its own mirror, blend half way, then last-mile Fix Symmetry. For raw photogrammetry whose two halves do not share vertices.
Fill a missing half Align a scan onto X, then replace the missing half by mirroring the half that is there.
MetaHuman DNA to mesh Read a .dna file straight off disk, build the neutral head mesh with its skeleton and skin weights at the LOD you pick, and export it.
Generate a LOD chain Turn one dense mesh into a whole LOD chain in a single step. Every level is decimated from the original with UV islands and material sections intact, and the achieved triangle count of each level is reported so a budget that could not be met is visible.
Pack UVs and set texel density Give a mesh a fresh UV atlas, repack its islands with a real gutter at the resolution you will bake at, then rescale them to your studio's texel density so this asset matches everything else in the set.
Inspect and repair a mesh Measure a mesh's open edges, holes, floating islands, degenerate triangles and bowties, fill the holes, then measure again. Mesh Health passes the mesh straight through, so the second node reports exactly what the repair changed.
Retopologize a scan Rebuild a scan's triangle soup as a clean quad-dominant mesh whose edges follow the surface flow, then give the result a fresh UV atlas and export it. Retopology replaces the topology, so the UVs are generated afterwards.
Project texture from a scan Bake a scan's colour into a retopologised mesh's UV layout. The Coverage output shows which texels came from real scan data and which the fill invented, so you know exactly what still needs painting.
Retarget morph targets to another character Move a whole morph target set (blendshapes) from one character's neutral onto another's, mapping every delta through a per-vertex local frame so it rotates and scales with the surface. The two neutrals must share topology - MetaHuman and DNA variants of one base do.
Cloth Drape The smallest complete cloth setup: a flat plane draped over a sphere collider. Select the Simulation node and press Play to watch it fall and settle.
Garment: Two Panels Two flat pattern pieces arranged facing each other over a sphere, ready to sew. Select the Sewing node and click matching boundary edges on both panels to sew the sides shut, then press Play on the Simulation node.
Flesh Jiggle A soft-body sphere with no rig and no collider - the smallest possible flesh setup. Press Play on the Simulation node, then wire an Attachment Map or an Animation onto the Flesh Object once you want it held in place instead of falling freely.
Cloth Over Flesh A plane of cloth draped over a soft-body sphere in one world. Press Play - cloth rides the flesh. The body falls until you attach it.
Animated Head A flesh body ready to jiggle on an animated head. Wire your head mesh and an Animation into the Flesh Object; leave Attachment Map empty so the deep interior pins to the nearest bone.
Drape On Character Cloth over a character collider. Wire your character into the Collider's Mesh, then an Animated Source (cache, frames, animation, or mesh) for a deforming body. End Frame raises itself to match the source the first time the sim configures.

Saving and reopening

Graphs are .mmgraph files. File > Save writes one, File > Open reads one back, and File > Recent Files reopens the last few. The welcome dialog lists the same recents, so the graph you were working on yesterday is one click from launch.

Opening a graph is pure deserialization. No node runs, no script executes and no file is written just because you opened a document - the same rule that governs pasting a node or importing a preset.

Where to go next

IntroductionHow the two products relate, what a graph is, and a map of the node categories by task./pages/J2WQJY4yi9cL2yBikO2b
WrangleWhen no node does what you want: expressions, loops, donor meshes and a Python stage./pages/ijo3Z7vYLbtvQ02CJtaW
Wrangle examplesReady-made recipes you can paste straight into the Code field./pages/YDkk3xP0r9z12iLrZELz

Studio and Graph

Animation

  • Delta Mush Animation (Experimental): Runs Delta Mush over every frame of an animation and bakes what it cleaned up into corrective morph targets the animation itself drives.
  • Apply Animation Frame: Poses a skinned mesh at one moment in an animation and hands back that pose as a mesh.
  • Load Animation (FBX): Imports an animation take out of an FBX file. The keys are stored in the graph itself, so the FBX can move or disappear afterwards and the graph still plays.
  • Pose Animation Sequence: Scrub to a frame, pose the skeleton with the gizmo, and the edit is blended over neighbouring frames and cached on the Animation output until Save Animation Sequence writes it into an asset.
  • Retarget Animation: Moves a whole animation take onto a different rig's bones, chain by chain, one retarget per frame of the take.

Studio and Graph › Animation

Delta Mush Animation (Experimental)

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Delta Mush Animation (Experimental) node

The Delta Mush Animation (Experimental) node

When to use it

Editor only. Runs Delta Mush on every frame of an animation and bakes the corrections into morph targets driven by that animation, so the skinning fix ships with the asset instead of costing a deformer at runtime.

How to use it

  1. 1

    Connect a rest-pose mesh and an Animation input (from a Load Animation node)

  2. 2

    Configure Delta Mush settings

  3. 3

    Click "Apply" to process the animation and create corrective morph targets

Pins

Pin Type Description
Animation Animation The animation to correct. It has to come from one of the Load Animation nodes - those carry the live sequence this node writes the shapes back into.
Mesh Mesh The mesh at rest, from a skeletal mesh import. Every frame is measured against this.

Settings

Setting Type Description
Capture Baseline From GPU True/False Take each frame's starting shape from what the mesh actually renders, so post-process Anim Blueprints, deformer graphs and morph curves all count. Turn it off to pose on the CPU from the raw keyframes instead: faster and exact, but blind to anything an Anim Blueprint does.
Smoothing: Iterations Whole number How many smoothing passes run over the mesh. More passes clean up worse collapsing, at the cost of time, and thin shapes start to shrink unless Edge Preservation is up.
Weight Type Choice How a vertex is weighted against its neighbours while smoothing. Inverse Distance: safest around fingers, joints and anything thin. Avoids the pinching Cotangent can cause. Cotangent: the usual pick for smooth organic surfaces with tidy triangles. Mean Value: holds together on meshes with badly shaped triangles. Uniform: every neighbour counts the same. Fast, but blind to the shape of the surface.
Amount Number How much of the original surface detail comes back once the smoothing is done. At 0 you keep the smoothed blob. At 1 the pores, folds and seams return in full.
Frame Smoothing Whole number Smoothing passes over the local frame each detail offset rides on. Raise it when the restored detail shimmers or jitters as the pose moves. 0 turns it off.
Inward Number How far vertices may move inward, toward the middle of the mesh. Pull it down when armpits and the backs of knees cave in on themselves. 0 blocks inward motion outright.
Outward Number How far vertices may move outward, away from the middle of the mesh. Pull it down when the smoothing starts inflating shoulders and knuckles. 0 blocks outward motion outright.
Edge Preservation Number Limits how far a vertex can slide in toward the middle of its neighbours, which is what stops fingers, horns and antennae shrivelling into sticks. At 0 edges are free to shorten; at 1 they keep their length. Once you run past 100 iterations, 0.3 to 0.7 is the useful range.
Skin Sliding: Iterations Whole number Passes that stop the restored detail creeping across the surface as the pose changes, which reads on screen as the texture sliding over the skin. 0 turns it off.
Stiffness Number Trades detail against sliding correction. 0 corrects the most and softens fine detail. 1 keeps every last detail and corrects nothing.
Strain Falloff: Iterations Whole number Spreads the effect outward from the parts that actually deformed, so it fades away instead of stopping at a visible line across the limb. 0 leaves that line.
Decay Number How fast that spread runs out. Low values keep the effect tight around the joint, high values carry it further down the limb.
Angle Threshold Number Surfaces twisted further than this from their rest orientation get an extra round of smoothing. Aimed at the hard cases, like a wrist rolled almost the whole way over.
Extreme Rotation: Iterations Whole number Extra smoothing passes, applied only to those heavily twisted areas.
Preserve Boundaries True/False Ease off the smoothing along open edges so the mesh does not creep back from its border. Worth turning on for a cut-out piece like a shirt or a face patch.
Weight Number How firmly those open edges are held. 0 smooths them like anywhere else, 1 pins them in place.
Name Text What the morph targets get called. They come out numbered from this, one per processed frame, so keep it short and recognisable in the asset.
Apply To LODs True/False Push the shapes down onto the lower LODs too, so they do not pop away as the character gets further from camera.
LOD Vertex Threshold Number Same distance rule as above, but for landing the shape on the lower LODs.
LOD Smooth Type Choice How the shape gets smoothed on the lower LODs.
LOD Smooth Strength Number How hard each LOD smoothing pass pulls. Does nothing while LOD Smooth Iterations is 0.
LOD Smooth Iterations Whole number How many smoothing passes to run on the lower LODs. Coarse LODs usually need a pass or two where LOD0 needs none.
Use Dual Quaternion Skinning True/False Dual quaternion skinning instead of linear blend. Keeps volume on a twisted forearm or wrist, where linear blend pinches the mesh into a candy wrapper.
Use Linear Interpolation True/False Ramp each morph target's weight in and out with linear keys instead of switching it on and off at full strength. Off, the correction pops the frame it starts on.
Transition Frames Whole number How many frames that ramp takes at each end. 1 fades in over a single frame; raise it for a softer hand-off on a slow take. Only read when Use Linear Interpolation is on.
Start Frame Whole number First frame to process. -1 starts at the beginning.
End Frame Whole number Last frame to process, and it is included. -1 runs to the end. Set it below Start Frame and the two are swapped rather than refused.

Learn more

Delta Mush in Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/delta-mush-in-mesh-morpher-graph
ML Deformer and MetaHuman facial expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/ml-deformer-and-meta-human-facial-expressions

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Animation

Apply Animation Frame

Samples an animation at one moment, in seconds, and hands you the mesh deformed into that pose. From there it is an ordinary mesh: measure it, sculpt on it, bake it, compare it against another pose.

Apply Animation Frame node

The Apply Animation Frame node

When to use it

Samples an animation at one moment, in seconds, and hands you the mesh deformed into that pose. From there it is an ordinary mesh: measure it, sculpt on it, bake it, compare it against another pose.

Pins

Pin Type Description
Mesh Mesh The mesh to pose. It needs bones and skin weights on it already - a skeletal import, an auto-rig, or Transfer Weights.
Animation Animation The animation to sample. Its bone names have to match the mesh's, or nothing moves.
Pin Type Description
Mesh Mesh The mesh, posed at Time.

Settings

Setting Type Description
Time Number Where in the animation to sample, in seconds. Past the end it holds on the last frame, unless Looping is on.
Looping True/False Wrap Time back round to the start once it runs past the end, instead of sticking on the last frame.
Use Dual Quaternion Skinning True/False Dual quaternion skinning instead of linear blend. Keeps volume on a twisted forearm or wrist, where linear blend pinches the mesh into a candy wrapper.
Recompute Normals True/False Rebuild the normals after posing. Turn it off and the shading stays keyed to the rest pose, so the lighting slides around over the deformed surface.

Learn more

Delta Mush in Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/delta-mush-in-mesh-morpher-graph
ML Deformer and MetaHuman facial expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/ml-deformer-and-meta-human-facial-expressions

Studio and Graph › Animation

Load Animation (FBX)

Imports an FBX animation take via the runtime-safe FBX wrapper.

Load Animation (FBX) node

The Load Animation (FBX) node

Imports an FBX animation take via the runtime-safe FBX wrapper.

Additionally, in the editor, the node builds a transient Animation Sequence (+ its skeleton asset) from the keyframes and carries its path inside the same "Animation" struct for Delta Mush Animation Corrective.

How to use it

  1. 1

    Set the FBX file path + axis/coordinate options on the details panel

  2. 2

    The node imports + bakes the animation into the output pin

  3. 3

    Wire "Animation" into an "Apply Animation Frame" node or a Delta Mush Animation Corrective node

Pins

Pin Type Description
Animation Animation The imported animation, ready for Apply Animation Frame or Delta Mush Animation Corrective.

Settings

Setting Type Description
File File path Path to the FBX File.
Use T0 Pose True/False T0 Pose
Coordinate System Choice
Front Axis Choice
Up Axis Choice

Learn more

Delta Mush in Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/delta-mush-in-mesh-morpher-graph
ML Deformer and MetaHuman facial expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/ml-deformer-and-meta-human-facial-expressions

Studio and Graph › Animation

Pose Animation Sequence

Poses the skeleton at a chosen frame of an animation and writes the edit back into the bone keys, blended over Falloff Frames on each side of the posed frame and fading with distance. The selected ...

Pose Animation Sequence node

The Pose Animation Sequence node

When to use it

Poses the skeleton at a chosen frame of an animation and writes the edit back into the bone keys, blended over Falloff Frames on each side of the posed frame and fading with distance. The selected range is a hard boundary the edit never crosses - narrow it to protect a section of the take regardless of how large the falloff is.

How to use it

  1. 1

    Connect an Animation input (from a Load Animation node) and the rest rigged mesh the animation plays on

  2. 2

    Select the node, scrub to a frame, pose the skeleton with the gizmo, Accept

  3. 3

    Wire the Animation output into Save Animation Sequence to write it back into an asset

Pins

Pin Type Description
Animation Animation The animation whose bones you want to edit, from a Load Animation node.
Mesh Mesh The rest-pose rigged mesh the animation plays on. It is the bind reference the posing skins from, so it must be at rest, not already posed.
Pin Type Description
Animation Animation The same animation with your bone edits written into its keyframes.

Settings

Setting Type Description
Use Dual Quaternion Skinning True/False Skin with dual quaternions instead of linear blend when posing the frame baseline.
Include Root Bone True/False Include the root bone in the blended edit. Root edits shift the whole take - that is a root motion edit, not a pose fix, so it is off by default.
Falloff Frames Whole number How many frames on each side of the current frame the edit blends into, fading out with distance. 0 keys only the frame you posed. The selected range is a hard boundary - frames outside it are never touched no matter how large the falloff.

Learn more

Delta Mush in Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/delta-mush-in-mesh-morpher-graph
ML Deformer and MetaHuman facial expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/ml-deformer-and-meta-human-facial-expressions

Studio and Graph › Animation

Retarget Animation

Moves a whole animation take onto a different rig's bones, chain by chain - one retarget per frame of the source take.

Retarget Animation node

The Retarget Animation node

When to use it

Moves a whole animation take onto a different rig's bones, chain by chain - one retarget per frame of the source take.

Pins

Pin Type Description
Animation Animation The animation to retarget, from a Load Animation node. Its own skeleton is the source rig.
Mesh Mesh The rigged mesh whose skeleton the animation is moved onto. It is read at its rest pose - that is the bind reference every frame is measured against.
Pin Type Description
Animation Animation The same take on the target rig's bones.

Settings

Setting Type Description
Rotation Mode Choice How a target chain takes its rotation from the source chain when the two have different bone counts. Interpolated copes with most rigs.
Apply Root Rotation True/False Carry the source's body facing and torso lean across. Turn it off to keep the target pointing the way it was authored.
Apply Root Translation True/False Move the target's pelvis by the source's root motion, scaled to the target's height.
Enable IK True/False A second pass over the arm and leg chains that pins hands and feet onto a goal worked out from the source. The plain bone transfer already gives you a correct pose; this tightens up where the hands and feet land when the two characters are built very differently. It only fires on chains the source marks as limbs, which today means a SAM 3D Body source. On anything else it changes nothing either way.
IK Alpha Number 0 leaves the pose where the bone transfer put it, 1 puts the hand or foot right on the goal.
Allow Stretch True/False Let a limb stretch past its rest length to reach a goal it cannot otherwise get to, instead of stopping at full extension. Watch for rubbery forearms.
Retarget IK Bones True/False Keep the rig's marker bones (ik_foot_l, ik_hand_r, ik_hand_gun and the rest) following their real bones after the transfer, so foot planting and weapon setups still work on the new pose. Leave it on for UE5 Mannequin and MetaHuman skeletons.

Learn more

Delta Mush in Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/delta-mush-in-mesh-morpher-graph
ML Deformer and MetaHuman facial expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/ml-deformer-and-meta-human-facial-expressions

Studio and Graph

Deltas

  • Apply Deltas: Copies a shape change from one mesh onto another, even when the two meshes are built differently.
  • Apply Deltas (Topo Match): Adds a stored set of vertex movements straight onto a mesh that has the same vertices in the same order.
  • Get Deltas: Measures how far every vertex moved between two versions of the same mesh.
  • Transfer Pose: Makes one character take another's pose from point and curve landmarks. Splines are limbs; points are joints. Rotation only - the source keeps its own lengths.

Studio and Graph › Deltas

Apply Deltas

You sculpted a change into one mesh and want that same change on a second mesh built from different geometry. Feed the second mesh into Mesh, the unsculpted reference into Target, and the sculpted ...

Apply Deltas node

The Apply Deltas node

When to use it

You sculpted a change into one mesh and want that same change on a second mesh built from different geometry. Feed the second mesh into Mesh, the unsculpted reference into Target, and the sculpted one into Morphed Target.

Pins

Pin Type Description
Mesh Mesh The mesh you want the change to land on.
Target Mesh The reference mesh before it was sculpted.
MorphedTarget Mesh The same reference mesh after sculpting. Whatever moved between these two is what gets copied.
Pin Type Description
Mesh Mesh The input mesh with the change applied.

Settings

Setting Type Description
Vertex Threshold Number How far the node will look for a matching point on the other mesh. Too low and patches of surface never move at all; too high and the change jumps a gap onto the wrong side of a fold, so lips pull into teeth.
Normal Incompatibility Threshold Number How far a surface can face away from a vertex and still count as a match. 0.5 allows anything up to 90 degrees apart; lower is stricter, and 0 skips the check. Lower it when the change keeps landing on the back of a thin part.
Match Material IDs True/False Only pair up parts of the two meshes that use the same material. Handy where separate pieces sit close together, like eyeballs inside lids.
Subdivision Whole number Splits Target and Morphed Target finer before the change is measured, which gives the transfer more points to hit. Each step roughly quadruples the triangle count, so 1 or 2 is usually as far as you want to go.
Match By UV True/False Experimental. Pairs Target and Morphed Target through their UVs instead of vertex order, so those two can have different vertex counts. Skip it on welded meshes - welding is what breaks the UVs this relies on.
Smooth Iterations Whole number How many smoothing passes run over the transferred change. Leave it at 0 for a straight transfer; raise it when the result comes out lumpy where the two meshes disagree.
Smooth Strength Number How far each smoothing pass moves things. A few gentle passes keep more of the shape than one strong one.
Smooth Type Choice Which kind of smoothing to use. Preserve UV Flow weights by triangle shape and holds detail best, Uniform treats every neighbour the same and evens out faster, Delta smooths the movement rather than the surface.
Transfer Bone Transforms True/False Also copy bone poses from Morphed Target onto the result, matched by bone name. Bones with no match keep the pose they already had.

Studio and Graph › Deltas

Apply Deltas (Topo Match)

Adds a delta set straight onto a mesh, vertex for vertex. When the delta source and the target share vertex count and order, this is the one to use. It is exact, it costs nothing, and there is no c...

Apply Deltas (Topo Match) node

The Apply Deltas (Topo Match) node

When to use it

Adds a delta set straight onto a mesh, vertex for vertex. When the delta source and the target share vertex count and order, this is the one to use. It is exact, it costs nothing, and there is no correspondence search to get wrong.

The moment the two differ, index-for-index quietly maps offsets onto unrelated vertices and you get a scrambled mesh instead of an error you can see. Hand it a mesh that has been remeshed or decimated since and the movement lands on whatever vertex happens to hold that number. Apply Deltas exists for that case.

Pins

Pin Type Description
Mesh Mesh The mesh to move. Same vertices, same order as the mesh the movements came from.
Delta Deltas The stored per-vertex movements to add.
Pin Type Description
Mesh Mesh The mesh with the movements added.

Studio and Graph › Deltas

Get Deltas

Subtracts a base mesh from a sculpted one and hands you the per-vertex offsets. Apply Deltas (Topo Match) is the other half of the pair: this lifts a shape change off one mesh, that replays it on a...

Get Deltas node

The Get Deltas node

When to use it

Subtracts a base mesh from a sculpted one and hands you the per-vertex offsets. Apply Deltas (Topo Match) is the other half of the pair: this lifts a shape change off one mesh, that replays it on another.

Wire the untouched mesh into Mesh and the sculpted one into Target. Both inputs need the same vertex count and the same vertex order.

If the result looks like noise rather than a shape, the two meshes went through different remesh or weld steps and no longer index the same vertices. Re-derive both from a common ancestor. Trying to correct the output is wasted time.

Pins

Pin Type Description
Mesh Mesh The mesh before it was changed.
Target Mesh The same mesh after it was changed. Same vertex count, or the node stops with an error.
Pin Type Description
Delta Deltas How far each vertex moved, on its own.

Studio and Graph › Deltas

Transfer Pose

Makes one character take another's pose from point and curve landmarks. Mesh is the source that gets posed, and its vertex count and layout survive. Target is the character whose pose you are match...

Transfer Pose node

The Transfer Pose node

When to use it

Makes one character take another's pose from point and curve landmarks. Mesh is the source that gets posed, and its vertex count and layout survive. Target is the character whose pose you are matching; different topology is the whole point. Landmarks carry the correspondence: point pairs for joints, spline pairs for limbs, drawn on each mesh as it currently sits.

Pins

Pin Type Description
Mesh Mesh The mesh that receives the pose. Vertex count and layout survive.
Target Mesh The character whose pose to match. Draw matching landmarks on this mesh.
Landmarks Landmarks Point pairs (pelvis, head, joints) and spline pairs, where one spline is one limb. Draw matching limbs on both characters.
Pin Type Description
Mesh Mesh The input mesh, posed. Same vertex count and layout.

Settings

Setting Type Description
Transfer Mode Choice Rotation Only copies the turn of each limb and keeps this character's own lengths. Polar + Uniform Scale also copies the limb length ratio. Full Affine copies the local linear map and falls back to Polar + Uniform Scale on a collinear neighbourhood.
Handle Strength Number How hard the posed handles pull. Higher sticks closer to the transferred pose; lower lets ARAP smooth more.
Arap Iterations Whole number How many ARAP stitch passes run. More settles the surface between limbs.
Influence Radius Number How far a landmark's pose reaches, in the same units as the mesh. 0 uses 15 percent of the mesh diagonal. Vertices farther than this follow ARAP only, so an undrawn tail stays put.
Height Scale Root True/False Currently unused. Pose match is rotation only and does not move the root.

Studio and Graph

Importers

  • Load File Mesh: Reads a mesh off disk: FBX, OBJ, GLB, glTF, STL or PLY. Textures the file points at come in with it.
  • Load Skeletal Mesh: Brings a Skeletal Mesh asset from your project into the graph, bones and skin weights included.
  • Load Static Mesh: A Static Mesh asset out of your project, ready to edit. No bones come with it, so a rigged character wants Load Skeletal Mesh instead.
  • Load Animation Sequence: Pick an Animation Sequence out of the project and its keyframes land on the Animation output, copied into the graph so the graph keeps working without the asset around.
  • Load Geometry Cache: Pulls a Geometry Cache asset out of the project so the graph can read its frames.
  • Load Alembic File: Opens an Alembic (.abc) cache from disk. Frames are read as you ask for them, so a long cache never has to sit in memory all at once.
  • Load USD File: Opens a USD file (.usd, .usda or .usdc) and streams its frames in. You can point it at one branch of a big scene instead of pulling in the lot.

Studio and Graph › Importers

Load File Mesh

Available in Mesh Morpher Graph and Mesh Morpher Studio.

Load File Mesh node

The Load File Mesh node

How to use it

  1. 1

    Set the file path and import settings on the node's details panel

  2. 2

    Downstream consumers (sculpt / repair / exporter) read that struct

Pins

Pin Type Description
Mesh Mesh The mesh read out of the file, triangulated, with its material slots and textures attached.

Settings

Setting Type Description
File File path Path to the FBX File.
Use T0 Pose True/False T0 Pose
Coordinate System Choice
Front Axis Choice
Up Axis Choice
OBJ Sections From Choice OBJ only. Which statements split the file into material sections. OBJ marks materials with usemtl, so parts that reuse one material — or name none — would otherwise arrive merged into a single section; the o and g statements are what carry the real structure. Pick Groups for ZBrush polygroups, Material Only for strict OBJ behaviour.

Studio and Graph › Importers

Load Skeletal Mesh

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Load Skeletal Mesh node

The Load Skeletal Mesh node

When to use it

The skeletal half of Load Static Mesh, editor only for the same reason. It brings a project Skeletal Mesh in with its bones and skin weights attached, which is what Pose Mesh, Paint Skin Weights and every skeleton node need before they will do anything at all.

How to use it

  1. 1

    Pick a skeletal mesh asset

  2. 2

    Set LOD index / import-vs-render data

  3. 3

    Output is the mesh with skeleton data

Pins

Pin Type Description
Mesh Mesh The asset's mesh, with its bones and skin weights, and a note of where it came from so Bake Mesh can write back.

Settings

Setting Type Description
Skeletal Mesh Asset The skeletal mesh to load. Its asset path travels with the mesh, so Bake Mesh can write your edits back into this same asset later.
Use Import Data True/False Reads the geometry the asset was imported with instead of the built render mesh. Leave it on: the render mesh has been split apart at every UV and hard-normal seam, so it carries more vertices than the source, and it only reads at all if the asset has Allow CPU Access ticked.
LOD Index Whole number Which LOD to read. Ask for one the asset does not have and the node stops with an error and sends nothing on.

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Importers

Load Static Mesh

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Load Static Mesh node

The Load Static Mesh node

When to use it

Editor only. Pulls a Static Mesh that is already in your project into the graph as an ordinary mesh wire. Nothing gets decoded again, and the asset path travels along with the mesh, so Bake Mesh can write your edits back into that same asset later.

Use Import Data decides how the round trip ends. On, you get the original imported geometry, which is what a bake needs. Off, you get the built render data for the LOD you picked, already welded and optimised, which is what the engine actually draws.

Pick the wrong one and a later Bake Mesh either fails to line up or quietly stamps render-time geometry into your source asset.

How to use it

  1. 1

    Pick a static mesh asset

  2. 2

    Set LOD index / import-vs-render data

  3. 3

    Output is the mesh data

Pins

Pin Type Description
Mesh Mesh The asset's mesh, with a note of where it came from so Bake Mesh can write back.

Settings

Setting Type Description
Static Mesh Asset The static mesh to load. Its asset path travels with the mesh, so Bake Mesh can write your edits back into this same asset later.
Use Import Data True/False Reads the geometry the asset was imported with instead of the built render mesh. Leave it on: the render mesh has been split apart at every UV and hard-normal seam, so it carries more vertices than the source, and it only reads at all if the asset has Allow CPU Access ticked.
LOD Index Whole number Which LOD to read. Ask for one the asset does not have and the node stops with an error and sends nothing on.

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Importers

Load Animation Sequence

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Load Animation Sequence node

The Load Animation Sequence node

Editor-only authoring node that picks a project Animation Sequence asset.

Additive sequences are not supported.

  1. 1

    Pick an animation sequence asset in the details panel

  2. 2

    Wire the Animation output into Apply Animation Frame or Delta Mush Animation Corrective

Pins

Pin Type Description
Animation Animation The keyframes, plus a reference back to the asset for Delta Mush Animation Corrective.

Settings

Setting Type Description
Anim Sequence Asset The Animation Sequence to read. Pick an additive one and the node tells you it cannot use it.

Learn more

Delta Mush in Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/delta-mush-in-mesh-morpher-graph
ML Deformer and MetaHuman facial expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/ml-deformer-and-meta-human-facial-expressions

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Importers

Load Geometry Cache

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Load Geometry Cache node

The Load Geometry Cache node

When to use it

Reads a Geometry Cache asset already in your project as a streaming pin. This is the project-asset counterpart to Load Alembic File and Load USD File, and its frames arrive already oriented for MeshMorpher, so there is nothing to convert.

How to use it

  1. 1

    Pick a geometry cache asset

  2. 2

    Wire the StreamingCache output onward

    Into Geometry Cache Sculpt, Get Streaming Geometry Cache Frame, or an export node.

Pins

Pin Type Description
StreamingCache Streaming Geometry Cache The asset's frames, ready for the sculpt, frame and export nodes.

Settings

Setting Type Description
Geometry Cache Asset The Geometry Cache asset to read. Frames come in already oriented for MeshMorpher, so there is nothing to convert.

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Importers

Load Alembic File

The way an animated cache from Maya, Houdini or 3ds Max gets into a graph. It streams: frames come off disk as something downstream asks for them, so a thousand-frame cache costs about what one fra...

Load Alembic File node

The Load Alembic File node

When to use it

The way an animated cache from Maya, Houdini or 3ds Max gets into a graph. It streams: frames come off disk as something downstream asks for them, so a thousand-frame cache costs about what one frame costs.

There is no Load button. Pick a file and it reads, and it reads again the moment you change any setting below, so getting the orientation right is a matter of nudging Preset or Rotation and looking at the result.

The conversion settings stay on show whether or not a file is picked, so you can set the package preset up front and then browse.

Pins

Pin Type Description
StreamingCache Streaming Geometry Cache The animated cache read from the .abc file, one frame at a time.

Settings

Setting Type Description
Source File File path The .abc file to read. Pick one and the load runs straight away, and it runs again every time you change a setting below.
Preset Choice Which package wrote the cache. Maya and 3ds Max fill in the Scale and Rotation those apps need. Touch either of those by hand and this flips to Custom.
Scale Vector Scale applied to every vertex as the cache is read. The default (1, -1, 1) only flips handedness, it does not resize anything.
Rotation Vector Rotation in degrees applied to every vertex as the cache is read. The 90 on X is what stands a Y-up Maya cache upright. Get it wrong and the character arrives lying on its face.
Flip U True/False Mirrors the U coordinate. Turn it on if textures arrive reversed left to right.
Flip V True/False Mirrors the V coordinate. On by default, which is what Maya and most Alembic caches expect. Switch it off and textures land upside down.

Studio and Graph › Importers

Load USD File

The USD counterpart to Load Alembic File. It streams a stage's frames in as something downstream asks for them, so scene length costs you nothing up front.

Load USD File node

The Load USD File node

When to use it

The USD counterpart to Load Alembic File. It streams a stage's frames in as something downstream asks for them, so scene length costs you nothing up front.

What it adds over the Alembic loader is Prim Filter Path and the purpose switches. A production stage carries far more than the one character you want, in several detail levels at once, and those settings are how you take the branch you need and leave the rest on disk.

There is no Load button. Pick a file and it reads, and it reads again the moment you change any setting below.

The stage's own up-axis and metersPerUnit are both ignored. Rotation is the only thing standing a Y-up scene upright, and a scene authored in metres arrives a hundred times too small until you scale it here.

Pins

Pin Type Description
StreamingCache Streaming Geometry Cache The animated cache read from the USD stage, one frame at a time.

Settings

Setting Type Description
Source File File path The USD file to read. Pick one and the load runs straight away, and it runs again every time you change a setting below.
Preset Choice Which package wrote the file. Maya and 3ds Max fill in the Scale and Rotation those apps need. Touch either of those by hand and this flips to Custom.
Scale Vector Scale applied to every vertex as the stage is read. The default (1, -1, 1) only flips handedness, it does not resize anything. The stage's own metersPerUnit is ignored, so a scene authored in metres arrives a hundred times too small until you scale it here.
Rotation Vector Rotation in degrees applied to every vertex as the stage is read. The stage's own up-axis is ignored, so this is the only thing standing a Y-up scene upright.
Flip U True/False Mirrors the U coordinate. Turn it on if textures arrive reversed left to right.
Flip V True/False Mirrors the V coordinate. On by default. Switch it off and textures land upside down.
Prim Filter Path Text Read only one branch of the stage, by prim path (something like /Root/Characters/Hero). Leave it empty for the whole stage. On a big scene this is the difference between opening in a second and waiting on the whole thing.
Include Default Purpose True/False Include geometry that carries no purpose tag. This is where most hand-authored meshes live, so leaving it off usually gets you nothing.
Include Render Purpose True/False Include geometry tagged as render. That is the high-detail version meant for final frames.
Include Proxy Purpose True/False Include geometry tagged as proxy: the cheap stand-in a scene uses for fast playback. Turning this on alongside render usually gets you two copies of the same character sitting inside each other.
Include Guide Purpose True/False Include geometry tagged as guide: rig visualisers, motion paths and other things nobody wants in a sculpt.

Studio and Graph

Exporters

  • Write OBJ: Writes the mesh out as an OBJ with a matching .mtl beside it. It can pair the triangles back into quads on the way out.
  • Write DNA: Saves the incoming MetaHuman DNA out to a .dna file, for backup or for handing to another character.
  • Export To Skeletal Mesh: Makes a new Skeletal Mesh asset in your project from the incoming mesh. Hand it no skeleton and it builds one from the mesh's own bones.
  • Export DNA To Skeletal Mesh: Turns MetaHuman DNA into a Skeletal Mesh asset with its joints, skin weights, morph targets and physics set up. Needs the MetaHuman Character plugin enabled in the project.
  • Bake Mesh: Writes your edits back into the asset the mesh came from, along with its skeleton, DNA, other LODs and bound grooms. The mesh has to have come in through Load Skeletal Mesh or Load Static Mesh.
  • Write FBX: Saves the incoming mesh as an FBX. Its textures land in a folder next to the file and get wired into the materials, so move the FBX and you have to take that folder with it.
  • Write GLB: Packs the mesh, its bones and its base colour textures into one .glb you can hand straight to a web or realtime viewer. Normal and roughness maps do not make the trip.
  • Export Geometry Cache to Alembic: Writes an animated cache out to an .abc file one frame at a time, so a long cache costs no more memory than a short one.
  • Export Geometry Cache to USD: Sends an animated cache to a USD file, a frame at a time. Save as .usdc for the compact binary, .usda if you want to be able to open it in a text editor.
  • Export to Geometry Cache: Bakes an animated cache, sculpt included, into a Geometry Cache asset in your project. The vertex count has to hold steady across every frame.
  • Export to Texture Asset: Saves the texture on its input pin into a real project asset, so a map you baked here survives after you close the app.
  • Write Alembic: Writes one still shape to an .abc with every UV set, which is what a modelling handoff to Maya, Houdini or ZBrush wants. For a moving sequence use Export Geometry Cache to Alembic instead.
  • Write IMG: Writes the connected texture out as an image file. You pick the location and the format each time.
  • Write PLY: Binary PLY carrying positions, normals and vertex colours. This is the format scanning and point-cloud tools trade in.
  • Write STL: Shape only, in the binary STL that 3D printers and CAD tools read. UVs, colours, materials and skeleton all get dropped on the way out.
  • Write USD: Writes one still shape to a USD file with every UV set, its vertex colours and shaded materials. For a moving sequence use Export Geometry Cache to USD instead.
  • Save Animation Sequence: Writes the Animation pin's bone keys into a live Animation Sequence asset - the pin only ever caches edits, this is what materializes them. Editor only.
  • Write Animation FBX: Saves the incoming animation's skeleton and its bone keyframes as an FBX - including any in-graph pose edits already baked into the wire.

Studio and Graph › Exporters

Write OBJ

OBJ out, optionally with a sibling MTL, and with quads preserved if the mesh has them.

Write OBJ node

The Write OBJ node

When to use it

OBJ out, optionally with a sibling MTL, and with quads preserved if the mesh has them.

Pins

Pin Type Description
Mesh Mesh The mesh to save. An OBJ has no room for a skeleton, so bones and skin weights get dropped.

Settings

Setting Type Description
Scale Number Multiplies every vertex position on the way out. OBJ records no units at all, so these numbers are the only thing the receiving app has to go on.
Colored Materials True/False Writes a matching .mtl next to the OBJ, one entry per material slot, each with its own flat colour so the sections are easy to tell apart. No textures go in it. Turn it off and the OBJ arrives with no material references at all.
Vertex Colors Choice What goes into the per-vertex colour columns: the mesh's own colours, one flat colour per material section (the same colours the sculpt viewport shows in Section Colors), or nothing. Alpha is dropped either way, since OBJ has nowhere to put it.
Setting Type Description
Quad Export True/False Pairs triangles back up into quads before writing, so the file opens in Maya or Blender as a quad mesh instead of a triangle soup. Adds time on a dense mesh.
Respect UV Seams True/False Stops a quad being formed across a UV seam, so islands are not stitched shut by the quad pass.
Respect Hard Normals True/False Stops a quad being formed across a hard edge, so creases stay crisp.
Quad Metric Clamp Number How far off square a pair of triangles can be and still be merged, 0 to 1. At 1 almost every pair qualifies. Pull it down and only clean, flat, near-square pairs turn into quads, leaving everything else as triangles.
Quad Adjacency Weight Number How much a candidate quad is favoured for sitting next to quads already made. Raise it to get long continuous runs of quads; drop it to 0 and the finder picks the best pairs wherever they are, so quads end up scattered through leftover triangles.
Quad Search Rounds Whole number How many passes the quad finder makes. Each extra pass sweeps up triangles the one before it left behind, and costs time.

Studio and Graph › Exporters

Write DNA

Saves the upstream DNA payload to a .dna file on disk. Snapshot a DNA partway through a chain, hand one to another tool, or keep a backup before a Bake DNA Geometry.

Write DNA node

The Write DNA node

When to use it

Saves the upstream DNA payload to a .dna file on disk. Snapshot a DNA partway through a chain, hand one to another tool, or keep a backup before a Bake DNA Geometry.

It writes what is on the wire and nothing else. If the DNA needed fixing, that had to happen upstream; this node has no opinion about the contents.

Put a Validate DNA just before it when the file is going to someone else.

How to use it

  1. 1

    Connect the DNA input

  2. 2

    Click Write DNA and choose a destination

Pins

Pin Type Description
DNA DNA The DNA to write out.

Studio and Graph › Exporters

Export To Skeletal Mesh

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Export To Skeletal Mesh node

The Export To Skeletal Mesh node

When to use it

A new Skeletal Mesh asset out of a mesh that carries bone attributes, plus a skeleton asset too if you do not supply one.

For a rig built inside the graph by Auto-Rig, Skeleton Edit or Auto-Skin, with no source asset to bake back into, this is the way out. When there is a source asset, use Bake Mesh.

The input has to actually have bones and weights. A static mesh gets refused rather than given a default skeleton.

How to use it

  1. 1

    Connect a mesh with bone data

  2. 2

    Optionally set a skeleton in the settings

  3. 3

    Click Export and choose the asset path

Pins

Pin Type Description
Mesh Mesh The mesh to turn into an asset. It has to carry bones already, or the export refuses it.

Settings

Setting Type Description
Skeleton Asset The skeleton the new asset binds to. Leave it empty and one gets built from the mesh's own bones and saved alongside. Pick one and its bones have to line up with the mesh exactly, same count, same names, same parents, or the export stops and tells you which bone disagreed.
Screen Size Per Platform Float How much of the screen the mesh has to fill before this LOD is used. Only one LOD gets made here, so this rarely matters.
LOD Hysteresis Number Slack around the LOD switch so the mesh does not flicker between levels when the camera sits right on the boundary.
Build Settings Settings The usual skeletal-mesh build options: normals, tangents, UV handling and the rest. Same set you would find on the asset itself.

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Exporters

Export DNA To Skeletal Mesh

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Export DNA To Skeletal Mesh node

The Export DNA To Skeletal Mesh node

When to use it

Turns a DNA into a fully set-up MetaHuman Skeletal Mesh asset: joints, base mesh, skin weights, morph targets, plus the archetype's physics, LOD settings and post-process anim blueprint. This is what makes a DNA usable in a level. Editor only.

How to use it

  1. 1

    Connect DNA data

  2. 2

    Select export type (Face/Body/Combined)

  3. 3

    Click Export and choose the asset path

Pins

Pin Type Description
DNA DNA The DNA to build the asset from.

Settings

Setting Type Description
Type Choice Whether this DNA is a face, a body, or a Merge DNA node output. Get it wrong and the export reaches for the wrong archetype skeleton (or the wrong skeleton source) and the result is unusable.

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Exporters

Bake Mesh

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Bake Mesh node

The Bake Mesh node

When to use it

Editor only. Writes the edited geometry back into the project asset it came from, closing a Load Skeletal Mesh or Load Static Mesh round trip. It can take the reference skeleton, the skeleton asset, an attached DNA, re-projected morph targets, higher LODs and bound grooms along with it.

The Mesh input has to originate from one of those loader nodes, because that is where the asset path comes from. A mesh that came from a file import has nowhere to bake to, and the node will say so.

For a new asset instead of overwriting the source, Export Dynamic Mesh To Skeletal Mesh.

Press Bake Mesh. This modifies content on disk, which is why no wire change will ever trigger it.

How to use it

  1. 1

    Connect the modified mesh, tracing back to an asset loader

  2. 2

    Choose what the bake should write

  3. 3

    Click Bake Mesh

Pins

Pin Type Description
Mesh Mesh The edited mesh. It must trace back to Load Skeletal Mesh or Load Static Mesh, or the bake has no asset to write to.

Settings

Setting Type Description
Bake Reference Skeleton True/False Writes the mesh's bone hierarchy and rest pose back onto the asset. Turn it off to keep the asset's existing skeleton and change only geometry.
Bake To Skeleton Asset True/False Pushes the bone changes into the shared Skeleton asset as well, not just this mesh. Every other mesh on that skeleton feels it, so leave it off unless you meant to change them all.
Bake Mesh Data True/False Writes the geometry itself: positions, triangles, UVs, materials. Off means only the skeleton side of the bake happens.
Bake Vertex Colors True/False Carries your painted vertex colours into the asset. Off and the build drops the colour channel, so the asset comes back white.
Bake Skin Weights True/False Carries your painted skin weights into the asset. Skeletal meshes only.
Bake To DNA Asset (if available) True/False Updates the MetaHuman DNA riding along on the asset so the rig keeps up with the new shape. Skipped if you changed the vertex count, since the DNA can no longer be matched up.
Bake Groom Assets (Experimental) True/False Also updates grooms bound to this mesh, so hair follows the new surface instead of floating off it. Experimental, and slow on a full head.
Remove Scaling True/False Strips scale off every bone, keeping position and rotation. Bones end up at a scale of 1. Reach for it when a rig arrived with baked-in scale that fights animation.
Reapply Morph Targets True/False Rebuilds the asset's morph targets against the new shape. Only does anything when you changed the vertex count; if the count still matches, the morphs already line up and are left alone.
Projection Quality Whole number How finely the old mesh is subdivided before the morphs are re-read off it. Two or three steps is plenty. Push it higher and the bake slows to a crawl for no visible gain.
Normal Threshold Number How far apart two surfaces can face and still be matched during the morph rebuild, as a fraction of half a turn. The 0.5 default allows anything up to a right angle. Lower it when a morph latches onto the wrong side of something thin like an eyelid or a lip. Set it to 0 and the check is off entirely, which is the opposite of strict.
Skip Material Matching True/False Lets the morph rebuild match vertices across different material slots. Turn it on when the new mesh has its materials split up differently from the old one.
Apply To LODs True/False Pushes your edit down onto the asset's other LODs too. Only runs when the vertex count still matches the original; change the count and every LOD below the one you edited stays on the old shape.
Transfer UVs To LODs True/False Copies the base mesh's UVs onto the other LODs as well. It overwrites whatever UV layout each LOD had, and it welds their UV seams shut, so leave it off if the lower LODs were unwrapped on purpose.
Vertex Threshold Number How far the LOD projection will search for a matching point on the edited mesh. Too low and parts of the LOD never move. Too high and the change jumps a gap onto the wrong side of a fold, so lips pull into teeth and eyelids stick shut.
Normal Incompatibility Threshold Number How different two surfaces can face before the projection treats them as unrelated. It is what stops triangles turning inside out where two surfaces nearly touch.
Smooth Type Choice How the projected result gets smoothed. Preserve UV Flow keeps the smoothing from dragging UVs around, which is usually what you want on a textured character.
Smooth Strength Number How hard each smoothing pass pulls. Small values here; large ones melt the detail you just projected.
Smooth Iterations Whole number How many smoothing passes to run. Zero means none at all, which is the default, so nothing above has any effect until you raise this.

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Exporters

Write FBX

For a handoff to a DCC package where the rig has to survive, FBX is the format and this is the node. It goes out through the bundled FBX SDK.

Write FBX node

The Write FBX node

When to use it

For a handoff to a DCC package where the rig has to survive, FBX is the format and this is the node. It goes out through the bundled FBX SDK.

How to use it

  1. 1

    Connect a mesh to the Mesh input pin

  2. 2

    Tweak axis / scale / ASCII settings on the details panel

  3. 3

    Click Write FBX — choose a destination, file is written

Pins

Pin Type Description
Mesh Mesh The mesh to save. Bones, skin weights, UVs and materials all come through.

Settings

Setting Type Description
Coordinate System Choice Handedness written into the file's header, so the app opening it knows which way round the mesh is meant to be.
Front Axis Choice Which axis the file should call forward.
Up Axis Choice Which axis the file should call up. Set it to Y for Maya, leave it on Z for anything coming back into Unreal.
Scale Number Multiplies every vertex position on the way out. Leave it at 1 to keep the mesh at the size it is here.
Export As ASCII True/False Writes readable text instead of binary. Handy when you need to look inside the file, but it runs about five times bigger.
Vertex Colors Choice What goes into the vertex-colour layer: the mesh's own colours, one flat colour per material section (the same colours the sculpt viewport shows in Section Colors), or nothing.

Studio and Graph › Exporters

Write GLB

One self-contained .glb: geometry, materials and textures all embedded. That is what a web viewer or a runtime asset pipeline wants.

Write GLB node

The Write GLB node

When to use it

One self-contained .glb: geometry, materials and textures all embedded. That is what a web viewer or a runtime asset pipeline wants.

Against FBX, glTF wins when the destination is an engine or a browser and loses when it is a DCC package.

The writer is hand-rolled and runtime-safe, so this works in the packaged app where editor exporters do not. Press Write Glb.

Pins

Pin Type Description
Mesh Mesh The mesh to save. Bones, skin weights and the base colour texture ride along with it.

Settings

Setting Type Description
Scale Number Multiplies every vertex position on the way out. glTF works in metres and MeshMorpher works in centimetres, so the 0.01 default is what makes the mesh open at the right size in a glTF viewer. Set it to 1 and your character shows up a hundred times too big.
Write Material Colours True/False Writes one material per slot. A slot that has a base colour texture gets it packed into the .glb. A slot without one gets a flat colour instead, so the sections stay easy to tell apart. Turn this off and the file arrives with no materials at all.
Vertex Colors Choice What goes into the vertex-colour channel: the mesh's own colours, one flat colour per material section (the same colours the sculpt viewport shows in Section Colors), or nothing.

Studio and Graph › Exporters

Export Geometry Cache to Alembic

Streams a whole geometry cache out to an .abc file, one frame at a time, so peak memory equals a single frame no matter how long the cache runs.

Export Geometry Cache to Alembic node

The Export Geometry Cache to Alembic node

When to use it

Streams a whole geometry cache out to an .abc file, one frame at a time, so peak memory equals a single frame no matter how long the cache runs.

Pins

Pin Type Description
StreamingCache Streaming Geometry Cache The animated cache to write out, sculpt and all.

Settings

Setting Type Description
Mesh Name Text Meant to name the mesh inside the .abc. The cache writer never reads it, so typing here changes nothing about the file you get.
Flatten True/False Writes the whole cache as one mesh, with a face set marking out each material slot. That is the smaller, faster-reading file. Turn it off and you get a separate mesh per material section instead, which some older pipelines still want.
Start Frame Whole number First frame to write. Clamped to what the source actually has.
End Frame Whole number Last frame to write, counted in. Leave it at -1 to run through to the end of the source.
Rotation Vector Turns every frame as it is written, in degrees. The default quarter-turn is what takes MeshMorpher's Z-up over to the Y-up that Maya and Houdini expect. Zero it out and the cache opens lying on its back.
Scale Vector Scale applied along with the rotation. One negative component flips handedness, which is what the -1 on Y is there for.
Flip Mesh True/False Reverses triangle winding on the way out. Keep it on whenever Scale flips handedness, or the cache opens inside out with every surface facing away from you.
Invert Normals True/False Flips the normals as they are written. Reach for this only if the surface still shades inside out once winding and scale are sorted.
Use Custom Frame Rate True/False Sets the playback rate yourself instead of taking the one the source reports.
Custom Frame Rate Number Frames per second stamped on the file. Every frame in the range still gets written, so a lower number here plays the same animation slower rather than dropping anything.
Write Velocities True/False Writes how far each vertex moves between frames, which is what a renderer needs to produce motion blur.

Studio and Graph › Exporters

Export Geometry Cache to USD

The USD side of Export Geometry Cache to Alembic. A deforming cache streamed out to a USD file, one frame at a time.

Export Geometry Cache to USD node

The Export Geometry Cache to USD node

When to use it

The USD side of Export Geometry Cache to Alembic. A deforming cache streamed out to a USD file, one frame at a time.

Prim Path is now written exactly as you type it, defaulting to /mesh. Older exports from this node ignored the setting and always wrote /sculpted_cache. A pipeline still looking for that old path needs pointing at /mesh, or set Prim Path back to /sculpted_cache.

Pins

Pin Type Description
StreamingCache Streaming Geometry Cache The animated cache to write out, sculpt and all.

Settings

Setting Type Description
Prim Path Text Where the mesh sits inside the file, as a path.
Flatten True/False Writes the whole cache as one mesh, with each material slot marked out as a subset. That is the smaller, faster-reading file. Turn it off and you get a separate mesh per material section instead.
Start Frame Whole number First frame to write. Clamped to what the source actually has.
End Frame Whole number Last frame to write, counted in. Leave it at -1 to run through to the end of the source.
Rotation Vector Turns every frame as it is written, in degrees. The default quarter-turn takes MeshMorpher's Z-up over to Y-up, which is what the file declares itself to be. Zero it out and the cache opens lying on its back.
Scale Vector Scale applied along with the rotation. One negative component flips handedness, which is what the -1 on Y is there for.
Flip Mesh True/False Reverses triangle winding on the way out. Off by default here, unlike the Alembic export, because USD reads the corner normals differently.
Invert Normals True/False Flips the normals as they are written. The stock combination of Y-up, the -1 scale and the winding setting already comes out right, so leave this off unless you have changed those and the surface shades inside out.
Use Custom Frame Rate True/False Sets the playback rate yourself instead of taking the one the source reports.
Custom Frame Rate Number Frames per second stamped on the file. Every frame in the range still gets written, so a lower number here plays the same animation slower rather than dropping anything.
Write Velocities True/False Writes how far each vertex moves between frames, which is what a renderer needs to produce motion blur.

Studio and Graph › Exporters

Export to Geometry Cache

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Export to Geometry Cache node

The Export to Geometry Cache node

When to use it

Editor only. Bakes a streaming cache, with whatever sculpt or morph deltas are already riding on the pin, into a Geometry Cache asset in your project. Point it at an existing asset to replace its tracks in place, or leave the target empty and it asks where to put a new one.

This is the in-project counterpart to the Alembic and USD exports: those write a loose file for another application, this one leaves you an asset you can drop straight into a level or a sequence.

Constant topology only. Every frame has to carry the same vertex count, because that is what the engine's geometry-cache format stores. A cache whose topology changes between frames has to go out through Export to Alembic or Export to USD instead.

Pins

Pin Type Description
StreamingCache Streaming Geometry Cache The animated cache to bake, sculpt and all.

Settings

Setting Type Description
Target Cache Asset The asset to overwrite. Leave it empty and you get asked where to put a new one.
Start Frame Whole number First frame to bake. Clamped to what the source actually has.
End Frame Whole number Last frame to bake, counted in. Leave it at -1 to run through to the end of the source.
Use Custom Frame Rate True/False Sets the playback rate yourself instead of taking the one the source reports.
Custom Frame Rate Number Frames per second the baked asset plays at. Every frame in the range still gets written, so a lower number plays the same animation slower rather than dropping anything.
Position Precision Number How finely vertex positions are stored, in centimetres. Smaller keeps more detail and makes a bigger asset. Push it up on a face and small motion like an eyelid or a lip corner starts to stair-step.
Texture Coordinates Number Of Bits Whole number How finely UVs are stored. Fewer bits shrinks the asset and makes textures creep as the cache plays.

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Exporters

Export to Texture Asset

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Export to Texture Asset node

The Export to Texture Asset node

When to use it

Saves the incoming texture into a project texture asset, either a new one at a path you pick or an existing one overwritten in place.

Every texture made inside the graph is transient and dies with the session: Load Texture, Transfer Texture, Tension Map. This is how one becomes real content that works outside the graph. For a loose file on disk instead, use Write Image.

Overwriting in place keeps every material reference to the asset intact, which is why it exists as an option rather than always creating something new.

Pins

Pin Type Description
Texture Asset The texture to save. Anything a texture pin carries works, including maps baked in this graph.

Settings

Setting Type Description
Target Texture Asset Asset to overwrite. Leave it empty and you get asked where to put a new one.

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Exporters

Write Alembic

A single-sample poly mesh in an .abc archive, with every UV set. Alembic is at its best as a modelling handoff to Maya, Houdini or ZBrush.

Write Alembic node

The Write Alembic node

When to use it

A single-sample poly mesh in an .abc archive, with every UV set. Alembic is at its best as a modelling handoff to Maya, Houdini or ZBrush.

This is the static-asset counterpart to Export Geometry Cache to Alembic: that node bakes a deforming sequence, this one writes one shape.

There is no skeleton in an Alembic file, so a rigged character has to go out as FBX.

How to use it

  1. 1

    Connect a mesh to the Mesh input pin

  2. 2

    Tweak the axis and scale settings

  3. 3

    Click Write Alembic and choose a destination

Pins

Pin Type Description
Mesh Mesh The mesh to save. Alembic keeps the shape, normals and UVs, but has nowhere to put vertex colours or materials.

Settings

Setting Type Description
Scale Number Multiplies every vertex position on the way out. Alembic records no units anywhere in the file, so these numbers are the whole story: the 0.01 default turns MeshMorpher's centimetres into the metres Houdini and Blender expect. Leave it at 1 and the mesh lands a hundred times too big in those - though Maya itself works in centimetres, so a Maya-only round trip may want 1. Set it to 1 for a file you intend to load back into MeshMorpher, which reads the numbers as they are.
Y Up True/False Stands the mesh up Y-up, the way most other packages want it, instead of the Z-up MeshMorpher works in. Either way the shape is preserved, not mirrored, and Load Alembic File brings it back exactly as it left.
Flip Winding True/False Reverses triangle winding, which is what keeps the surface facing outward once the axes have been converted. Leave it on: switch it off and the mesh opens inside out, and Alembic has nowhere to record that you meant it.
Flip V True/False Flips V so UVs sit the way Maya reads them. Get it wrong and textures come out upside down.
Write All UV Sets True/False Writes every UV set, not just the first. The extras come through named uv1, uv2 and so on.
Mesh Name Text What the mesh is called once it is inside the file.

Studio and Graph › Exporters

Write IMG

Pops a save dialog and writes the connected texture to disk. The format follows the extension you type: PNG, JPEG, BMP, EXR.

Write IMG node

The Write IMG node

When to use it

Pops a save dialog and writes the connected texture to disk. The format follows the extension you type: PNG, JPEG, BMP, EXR.

Getting a generated map out of the app as a file is what it is for: a bake, a projection, a tension map, a UV layout. If the image should become persistent project content instead, use Export to Texture Asset.

Nothing is remembered between runs. Every press asks for the destination again, which is deliberate: it can never quietly overwrite the file you picked last week.

Pins

Pin Type Description
Texture Asset The texture to write out.

Studio and Graph › Exporters

Write PLY

Binary little-endian PLY, the scan pipeline's interchange format. Positions, per-vertex normals, and per-vertex colours when the mesh has them.

Write PLY node

The Write PLY node

When to use it

Binary little-endian PLY, the scan pipeline's interchange format. Positions, per-vertex normals, and per-vertex colours when the mesh has them.

Colour is the reason to pick PLY over OBJ or STL. It is the simplest format that round-trips vertex colour, which is how photogrammetry albedo travels before it becomes a texture.

No UVs, no materials, no skeleton.

Pins

Pin Type Description
Mesh Mesh The mesh to save. Positions, normals and vertex colours go out; UVs and materials do not.

Settings

Setting Type Description
Vertex Colors Choice What goes into the per-vertex colour block: the mesh's own colours, one flat colour per material section (the same colours the sculpt viewport shows in Section Colors), or nothing.

Studio and Graph › Exporters

Write STL

Binary STL, for 3D printing and CAD.

Write STL node

The Write STL node

When to use it

Binary STL, for 3D printing and CAD.

Geometry only. No UVs, colours, materials or skeleton, and no vertex sharing either, so the file comes out large and the mesh arrives as loose triangles. If the destination is not a printer or a CAD tool, Write OBJ, Write PLY or Write GLB will serve you better.

Make the mesh watertight first: Weld, Fill Holes, and a look at Mesh Health. A printer will reject the boundary edges this format cannot even describe.

Pins

Pin Type Description
Mesh Mesh The mesh to save. Only its shape survives the trip.

Settings

Setting Type Description
Vertex Colors Choice What goes into the per-vertex colour block: the mesh's own colours, one flat colour per material section (the same colours the sculpt viewport shows in Section Colors), or nothing.

Studio and Graph › Exporters

Write USD

A static USD layer with every UV set, vertex colours and UsdPreviewSurface materials, which is what a USD-native pipeline expects to receive for a prop or a character.

Write USD node

The Write USD node

When to use it

A static USD layer with every UV set, vertex colours and UsdPreviewSurface materials, which is what a USD-native pipeline expects to receive for a prop or a character.

One shape is all this writes. A deforming sequence out of a streaming cache goes through Export Geometry Cache to USD instead.

Pick the extension deliberately. .usdc is compact binary, .usda is readable text and enormous, .usd lets the toolchain decide.

How to use it

  1. 1

    Connect a mesh to the Mesh input pin

  2. 2

    Tweak the axis, scale and material settings

  3. 3

    Click Write USD and choose a destination

Pins

Pin Type Description
Mesh Mesh The mesh to save. UVs, vertex colours and materials come through, but not bones.

Settings

Setting Type Description
Scale Number Multiplies every vertex position on the way out. It does not change what unit the file says it is in, which is what Unit Scale below is for.
Unit Scale (Meters Per Unit) Number What one unit in the file means, in metres. The 0.01 default means the positions leave as centimetres and the file says so, which is exact and needs no arithmetic. For a metres-based file set this to 1.0 and Scale to 0.01: change one without the other and the mesh lands a hundred times off.
Flip V True/False Flips V so UVs sit the way USD and Maya read them. Get it wrong and textures come out upside down.
Write All UV Sets True/False Writes every UV set, not just the first. The extras come through named st1, st2 and so on.
Write Normals True/False Writes normals per face corner, so hard edges stay hard. Turn it off and the receiving app smooths everything and your creases go soft.
Vertex Colors Choice What goes into the display-colour channel: the mesh's own colours, one flat colour per material section (the same colours the sculpt viewport shows in Section Colors), or nothing.
Prim Path Text Where the mesh sits inside the file, as a path. The first part of it becomes the root that other apps open the file at.
Setting Type Description
Y Up True/False Stands the mesh up Y-up, the way most other packages want it, instead of the Z-up MeshMorpher works in. Either way the shape is preserved, not mirrored, and Load USD File brings it back exactly as it left.
Flip Winding True/False Reverses triangle winding, which is what keeps the surface facing outward once the axes have been converted. Leave it on. Switch it off and the file records that choice honestly, so the mesh still shades the right way out, but nothing is gained by it.
Setting Type Description
Write Materials True/False Writes a material per section and binds it to the right faces. Turn it off and the mesh arrives with no shading at all.
Write Textures True/False Writes the mesh's images into a folder next to the file and points the materials at them. Nothing is packed inside the file itself, so move the file on its own and every material comes up untextured.

Studio and Graph › Exporters

Save Animation Sequence

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Save Animation Sequence node

The Save Animation Sequence node

When to use it

Writes the bone keys on an Animation pin into a live Animation Sequence asset. Editor only. This is the materialize step for Pose Animation Sequence, whose Accept only ever caches the edit on the wire.

How to use it

  1. 1

    Wire the Animation pin

  2. 2

    Leave Target Sequence empty to write back into the sequence the animation came from (or create one), or pick a specific asset

  3. 3

    Click Save Animation Sequence

Pins

Pin Type Description
Animation Animation The animation to write. Its bone keys are what gets saved - float curves are not part of this pin, so a brand-new asset never gets any.

Settings

Setting Type Description
Target Sequence Asset The Animation Sequence asset to write into. Leave empty to write back into the sequence the animation came from, or into a new asset when there is none.
Skeleton For New Asset Asset Skeleton asset a new sequence is created against. Only needed when the animation did not come from a project asset (an FBX import, say) - otherwise the source sequence's own skeleton is used.

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Exporters

Write Animation FBX

Write FBX exports a mesh. This exports the animation instead - the skeleton plus its bone keyframes, read straight off the Animation wire, so whatever a Pose Animation Sequence node baked into thos...

Write Animation FBX node

The Write Animation FBX node

When to use it

Write FBX exports a mesh. This exports the animation instead - the skeleton plus its bone keyframes, read straight off the Animation wire, so whatever a Pose Animation Sequence node baked into those keyframes upstream comes along with it. Use this when the take itself is the deliverable; use Write FBX when you need geometry.

There is no file-path pin - the Write FBX button pops the save dialog itself, same as the mesh exporter.

An empty or invalid Animation input fails with a node error before any dialog appears. Float curves - morph target weights and the like - are not part of the animation wire, so they never reach this file; only bone transforms do.

How to use it

  1. 1

    Connect an animation to the Animation input pin

  2. 2

    Tweak axis / scale / ASCII settings on the details panel

  3. 3

    Click Write FBX — choose a destination, file is written

Pins

Pin Type Description
Animation Animation The animation to save. Its skeleton and bone keyframes come through, including any in-graph pose edits.

Settings

Setting Type Description
Coordinate System Choice Handedness written into the file's header, so the app opening it knows which way round the skeleton is meant to be.
Front Axis Choice Which axis the file should call forward.
Up Axis Choice Which axis the file should call up. Set it to Y for Maya, leave it on Z for anything coming back into Unreal.
Scale Number Multiplies every bone translation on the way out. Leave it at 1 to keep the skeleton at the size it is here.
Export As ASCII True/False Writes readable text instead of binary. Handy when you need to look inside the file, but it runs about five times bigger.

Studio and Graph

Cage Deformer

  • Generate Cage: Builds a coarse cage that wraps the input mesh, ready to hand to the Cage Deformer.
  • Cage Deformer: Reshapes a dense mesh by dragging the points of a coarse cage that surrounds it.

Studio and Graph › Cage Deformer

Generate Cage

Press Generate Cage, then feed the result into the Cage Deformer's Cage input. Density and the two smoothing settings are what you tune. It runs on the GPU and needs one that supports compute shaders.

Generate Cage node

The Generate Cage node

Press Generate Cage, then feed the result into the Cage Deformer's Cage input. Density and the two smoothing settings are what you tune. It runs on the GPU and needs one that supports compute shaders.

Pins

Pin Type Description
Mesh Mesh The mesh to wrap.
Pin Type Description
Mesh Mesh The finished cage. Wire it into the Cage Deformer's Cage input.

Settings

Setting Type Description
Cage Settings Settings How the cage is built.

Studio and Graph › Cage Deformer

Cage Deformer

Reshapes a dense mesh by dragging the points of a coarse cage around it.

Cage Deformer node

The Cage Deformer node

Reshapes a dense mesh by dragging the points of a coarse cage around it.

Select the node and the cage appears in the viewport with the mesh inside it. Move a cage point and the mesh follows smoothly. This is the tool for broad proportion work like head size or limb length, the kind of change that turns into lumps when you push a high-resolution surface around by hand.

Pins

Pin Type Description
Mesh Mesh The mesh the cage reshapes.
Cage Mesh The coarse cage you drag. Generate Cage builds one, or wire your own.
MorphedCage Mesh The cage after it has been moved. How far it moved is what pushes the mesh.
Pin Type Description
Mesh Mesh The mesh after the cage moved it.

Studio and Graph

MetaHuman DNA

  • Load DNA File: Reads a .dna file off disk so the other DNA nodes can work on it.
  • Load DNA: Pulls the MetaHuman DNA out of a skeletal mesh so the other DNA nodes can read it.
  • DNA To Mesh: Builds the mesh a DNA file describes, with its skeleton and skin weights, at the LOD you pick.
  • Get DNA Blendshape: Applies one of the DNA's blendshape targets to a mesh so you can see the shape it makes.
  • Get DNA Expression: Poses the DNA's mesh at one named expression and tells you which bones that expression moves.
  • Set DNA Expression: Records a mesh you re-posed by hand back into the DNA as one of its expressions.
  • Set DNA Blendshape: Writes a sculpted shape back into the DNA as one of its blendshape targets, and optionally onto the coarser LODs too.
  • Bake DNA Geometry: Makes your sculpted mesh the DNA's new neutral shape, so every expression in the file then runs on top of your sculpt.
  • Get DNA RBF Pose: Isolates a single pose from one of the DNA's RBF solvers, so you can see what that corrective does and which joints it drives.
  • Set DNA On Skeletal Mesh: Attaches a DNA onto a Skeletal Mesh asset. Works with the legacy DNA storage below engine 5.8 and the new DNA asset format on 5.8 and above. Editor only.
  • Set DNA RBF Pose: Records a corrective back into one of the DNA's RBF poses: the trigger rotations, the solver's RBF parameters and the corrected joint pose.
  • Validate DNA: Checks a MetaHuman DNA for the damage that makes a rig deform wrongly without ever throwing an error. The DNA passes through untouched and the verdict comes out on pins.
  • Create DNA: Builds a new MetaHuman-shaped DNA from a mesh - create, author a rig from scratch for a head, face or body.
  • Create DNA From Skeletal Mesh: Builds a new MetaHuman-shaped DNA directly from a Skeletal Mesh asset - create, author a rig from scratch for a head, face or body.
  • Edit DNA Animated Map: Adds, renames, sets LOD membership on, appends a driving row to, or removes an animated map - RigLogic's own conditional-table shape, authoring side.
  • Edit DNA Blendshape Channel: Adds, renames, edits LOD membership, wires or removes a blend shape channel, or drops one target row - the identity/wiring authoring counterpart to Set DNA Blendshape.
  • Edit DNA Expression: Adds, renames, wires or removes raw controls (expressions) - the DNA entities joint groups, blend shape channels, animated maps and RBF solvers drive from.
  • Edit DNA GUI Control: Adds, edits, renames or removes a GUI control's raw-control mapping rows - RigLogic's own conditional table, authoring side only.
  • Edit DNA LODs: Drops a DNA down to a subset of its LODs, or appends new LODs cloned from an existing one - edit, keep, add, remove, drop LOD.
  • Edit DNA ML: Adds or removes ML controls and removes neural networks - a network's own weights/layers are authored only by the Python verb add_neural_network.
  • Edit DNA PSD: Adds, replaces or removes PSD correctives - controls computed as the weighted product of their own factor controls.
  • Edit DNA RBF Pose: Adds or removes RBF poses and RBF pose controls on a DNA's corrective layer - the trigger/output structure, not the corrected joint pose itself.
  • Edit DNA RBF Solver: Adds or removes whole RBF solvers on a DNA - drivers, settings and LOD membership; pads stay hidden and are managed automatically.
  • Edit DNA Twist Swing: Adds, edits or removes twist/swing parameter-group setups - the quaternion-driven joint corrective tables RigLogic evaluates, authoring side only.
  • Get DNA GUI Controls: Lists a DNA's GUI controls and evaluates one control's effect on the rig controls it drives, the same way RigLogic computes it.
  • Merge DNA: Combines a body DNA and a head/face DNA into one DNA - merge, combine body and head/face into a single rig.
  • Pose DNA Controls: Poses a DNA's mesh from a sparse set of GUI control values, evaluated through the DNA's own RigLogic rig - the same slider values a MetaHuman face/body board would drive.
  • Transfer DNA Rig: Transfers a rig - face expressions, RBF, twist/swing, joint behavior - from a template DNA onto a target DNA that already has its own geometry and skeleton, via a hand-editable bone mapping.

Studio and Graph › MetaHuman DNA

Load DNA File

This is how you get at a DNA that is not sitting inside a skeletal mesh yet.

Load DNA File node

The Load DNA File node

When to use it

This is how you get at a DNA that is not sitting inside a skeletal mesh yet.

How to use it

  1. 1

    Browse to a .dna file

  2. 2

    Wire the DNA output onward

    Into DNA To Mesh, Get DNA Expression, Bake DNA Geometry, or any other DNA node.

Pins

Pin Type Description
DNA DNA The DNA read from the file. Empty if the path does not exist.

Settings

Setting Type Description
File File path The .dna file to read. Expect a pause on a full MetaHuman: these files run to tens of megabytes. A path that does not exist leaves the output empty.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Load DNA

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Load DNA node

The Load DNA node

When to use it

Pulls the MetaHuman DNA out of a skeletal mesh so the rest of the DNA nodes can read it. Handles both the newer MetaHuman Character storage and the older one, so you do not have to know which your character was made with.

How to use it

  1. 1

    Pick a skeletal mesh that carries DNA

  2. 2

    Wire the DNA output onward

    Into DNA To Mesh, Get DNA Expression, Bake DNA Geometry, or any other DNA node.

Pins

Pin Type Description
DNA DNA The DNA read out of the mesh. Empty if the mesh had none.

Settings

Setting Type Description
Skeletal Mesh Asset The skeletal mesh to read DNA out of. Picking one reads it immediately. A mesh with no DNA in it leaves the output empty.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › MetaHuman DNA

DNA To Mesh

Builds the mesh a DNA file describes, in its neutral shape, with the DNA's own skeleton and skin weights on it. This is the mesh you sculpt on before baking anything back.

DNA To Mesh node

The DNA To Mesh node

When to use it

Builds the mesh a DNA file describes, in its neutral shape, with the DNA's own skeleton and skin weights on it. This is the mesh you sculpt on before baking anything back.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Pick the LOD you want

    0 is the densest.

  3. 3

    The Mesh output is the mesh, ready to edit

Pins

Pin Type Description
DNA DNA The DNA to build a mesh from.
Pin Type Description
Mesh Mesh The mesh in its neutral shape, carrying the DNA's skeleton and skin weights.

Settings

Setting Type Description
LOD Index Whole number Which LOD to build. 0 is the densest. Ask for an LOD the file does not have and you get an empty mesh, not an error.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Get DNA Blendshape

One named blendshape target out of a DNA, as a mesh, optionally filtered to the expression that uses it. Good for inspecting or re-sculpting a single shape. For the combined result an animator woul...

Get DNA Blendshape node

The Get DNA Blendshape node

When to use it

One named blendshape target out of a DNA, as a mesh, optionally filtered to the expression that uses it. Good for inspecting or re-sculpting a single shape. For the combined result an animator would actually see, Get DNA Expression.

Use the expression filter. A DNA carries hundreds of blendshapes, and without it the dropdown is a wall of names you have to read end to end.

Dual quaternion skinning changes the posed result, so keep it consistent with whatever you will use when writing the shape back. Otherwise the delta you author gets measured against a different baseline.

How to use it

  1. 1

    Wire a DNA in, and the mesh from DNA To Mesh into Mesh

  2. 2

    Pick a blendshape

    Filter by expression first if the list is unwieldy.

  3. 3

    The Mesh output is the same mesh with that shape on it

    The mesh you feed in has to be the same mesh at the same LOD, with the same vertex count. Anything else and the node stops with a count mismatch.

Pins

Pin Type Description
DNA DNA The DNA to read the blendshape out of.
Mesh Mesh The mesh to put the shape on. Same vertex count and order as the DNA's own mesh, so use DNA To Mesh at the same LOD.
Pin Type Description
Mesh Mesh The same mesh with the shape applied on top of whatever pose it was already in.

Settings

Setting Type Description
Blendshape Name Text Which blendshape target to apply. Nothing shows up in the dropdown until a DNA is wired into the input pin.
Filter By Expression Name Text Cuts the blendshape list down to the ones a single expression drives. Leave it empty to see every target in the file.
Use Dual Quaternion Skinning True/False Skins the blendshape offsets with dual quaternions rather than linear blending, which holds volume where a joint twists. Set it to match how the character itself is skinned.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Get DNA Expression

One named expression, evaluated out of a DNA with all its blendshapes combined and the skeleton deformation applied, handed back to you as a mesh. Turned all the way on, so you can see what a contr...

Get DNA Expression node

The Get DNA Expression node

When to use it

One named expression, evaluated out of a DNA with all its blendshapes combined and the skeleton deformation applied, handed back to you as a mesh. Turned all the way on, so you can see what a control actually does before you change it.

Seeing, sculpting on or comparing an expression is what it is for. For one shape in isolation rather than the combined result, use Get DNA Blendshape.

LOD Index picks which resolution of the mesh you get, and the meshes at different LODs have different vertex counts. A shape captured at one LOD cannot be written back at another.

Set DNA Expression closes the loop.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Pick an expression and an LOD

  3. 3

    Mesh is the posed mesh

    Bones tells you which joints that expression drives.

Pins

Pin Type Description
DNA DNA The DNA to read the expression out of.
Pin Type Description
Mesh Mesh The mesh posed at that expression, skinned to the bones the expression moves.
Bones Bone Selection The joints this expression actually moves. Handy for narrowing a bone selection to just the ones in play.

Settings

Setting Type Description
Expression Name Text Which expression to pose. The list is read from the DNA on the input pin, so connect that first or the dropdown is empty.
LOD Index Whole number Which LOD to build the posed mesh from. 0 is the densest.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Set DNA Expression

Bakes a modified expression mesh back into the DNA by solving what per-joint deltas would produce it. The write half of Get DNA Expression.

Set DNA Expression node

The Set DNA Expression node

When to use it

Bakes a modified expression mesh back into the DNA by solving what per-joint deltas would produce it. The write half of Get DNA Expression.

The pairing is strict. Edit the mesh that Get DNA Expression produced, at the same LOD, without changing its vertex count or order, or the solve has nothing to correspond against.

When you meant to change one named shape rather than a whole expression, Set DNA Blendshape.

Press Set Expression, then validate. A DNA that accepts an update can still be structurally wrong in ways only Validate DNA will name.

How to use it

  1. 1

    Pose the expression with Get DNA Expression, then move its bones

  2. 2

    Wire that mesh into Mesh and the same DNA into DNA

  3. 3

    Pick the expression to overwrite and press Set Expression

    The mesh must still carry the DNA's own bone names. If the skeletons do not line up, nothing is written.

Pins

Pin Type Description
DNA DNA The DNA to write the expression into.
Mesh Mesh The mesh with its bones where you want the expression to sit. Start from Get DNA Expression and move joints from there.
Pin Type Description
DNA DNA The DNA with that expression re-recorded from the bones on Mesh.

Settings

Setting Type Description
Expression Name Text Which expression to overwrite. An empty dropdown means no DNA is wired into the input pin yet.
Insert Missing Attributes True/False Lets a bone you rolled record rotation on axes this expression was not already turning. It only helps joints the expression rotates somehow already; with it off, any axis that was not already in play is dropped and part of your pose quietly goes missing.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Set DNA Blendshape

Replaces or adds one blendshape target in a DNA from a mesh you supply, and can propagate it down the LOD chain. Pair it with Get DNA Blendshape, keeping vertex layout and LOD identical between the...

Set DNA Blendshape node

The Set DNA Blendshape node

When to use it

Replaces or adds one blendshape target in a DNA from a mesh you supply, and can propagate it down the LOD chain. Pair it with Get DNA Blendshape, keeping vertex layout and LOD identical between the two, or the deltas come out against the wrong base.

How to use it

  1. 1

    Wire the DNA in

    Put the unsculpted mesh on Mesh and your sculpted copy on Target.

  2. 2

    Pick the blendshape to overwrite

  3. 3

    Press Set Blendshape

    The DNA output carries the new deltas. Mesh and Target must have the same vertex count and order, and both must match the DNA's own mesh at that LOD. Sculpt on a copy of DNA To Mesh, do not retopologise it.

Pins

Pin Type Description
DNA DNA The DNA to write the blendshape into.
Mesh Mesh The mesh before you sculpted it. Same vertex count and order as the DNA's own mesh at that LOD.
Target Mesh The same mesh after sculpting. Whatever moved between these two becomes the blendshape.
Pin Type Description
DNA DNA The DNA with that blendshape rewritten.

Settings

Setting Type Description
Blendshape Name Text Which blendshape target to overwrite. The dropdown fills in from the DNA on the input pin, so wire that up first.
Filter By Expression Name Text Narrows the blendshape dropdown to the targets one expression drives. Empty means the whole file.
Use Dual Quaternion Skinning True/False Unskin your sculpt with dual quaternions instead of linear blending on the way back into the DNA. Set it the same way you set it on Get DNA Blendshape, or the shape you get back will not be the shape you sculpted.
Add Missing Channel Indices True/False Let the write create the blendshape channel on parts of the mesh that do not carry one yet. Turn it off and those parts are skipped: only meshes that already had that channel pick up the new shape.
Create Missing Channel True/False When Blendshape Name does not match any channel the DNA already has, add the channel itself rather than doing nothing. The new channel gets your sculpted shape but no expression driving it yet - it sits inert until you wire one in with Set DNA Expression or mm.dna's wire_expression_to_blendshape_channel. Off (the default) leaves an unknown name a no-op, same as today, but now with a card badge saying so instead of silence.
New Channel LODs List of Whole number Which LODs the newly created channel belongs to. Empty means just the LOD you are sculpting on (Mesh's own LOD Index). Only read when Create Missing Channel is on and the name did not already exist.
Apply To LODs True/False Also push the shape onto every coarser LOD, by projecting it from the LOD you sculpted on. Leave it off and only that one LOD carries the change.
Vertex Threshold Number How far the projection may reach to find the matching vertex on each coarser LOD. Too low and stretches of the LOD get no shape at all. Too high and the shape jumps a gap onto the wrong side of a fold.
Normal Incompatibility Threshold Number How far a triangle may face away from the one it matched before the projection refuses it. This is what stops LOD triangles turning inside out.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Bake DNA Geometry

Writes edited mesh and skeleton data back into a DNA, optionally propagating the change to higher LODs and carrying morph targets along. This ends the round trip that DNA To Mesh starts, the way Ba...

Bake DNA Geometry node

The Bake DNA Geometry node

When to use it

Writes edited mesh and skeleton data back into a DNA, optionally propagating the change to higher LODs and carrying morph targets along. This ends the round trip that DNA To Mesh starts, the way Bake Mesh ends a mesh round trip.

How to use it

  1. 1

    Build the mesh with DNA To Mesh, sculpt it, wire it into Mesh

  2. 2

    Set LOD Index to the LOD you built from and pick what to write

  3. 3

    Press Bake DNA

    Keep the vertex count the same and the bake is exact. Change it and the DNA meshes are rebuilt from scratch, which is when Transfer Morph Targets and Quad Export start to matter and LOD propagation stops working. Rename or add bones and the bake refuses outright: the joint names on your mesh have to be the ones the DNA already knows.

Pins

Pin Type Description
DNA DNA The DNA to write into.
Mesh Mesh The sculpted mesh. Its positions, normals and bone poses become the DNA's new neutral shape. Bone names must still match the DNA's own.
Pin Type Description
DNA DNA The DNA with your mesh baked in.

Settings

Setting Type Description
LOD Index Whole number Which LOD of the DNA your mesh replaces. Has to be an LOD the file actually has, and it has to be the one you built the mesh from.
Bake Skeleton True/False Write the mesh's bone positions back as the DNA's rest skeleton. Only bones the DNA already names are touched; new bones on your mesh are ignored.
Bake Mesh Data True/False Write the vertex positions and normals. Turn it off to bake nothing but the skeleton.
Bake UVs True/False Write your edited UVs too. Only bites while the vertex count is unchanged; a rebuilt mesh brings its UVs across whatever you set here. Vertex colours are lost either way, since DNA has nowhere to keep them.
Bake Skin Weights True/False Write your edited skin weights too. Turn it off to keep the weights the DNA already had: with the vertex count unchanged they are kept exactly, and on a rebuilt mesh each new vertex takes weights blended from the closest point on the old surface. The same carry-over runs when this is on but your mesh has no weights at all, and the node warns about any vertex it found nothing to copy from.
Remove Scaling True/False Strip scale off every bone before writing, keeping only where it sits and how it is turned. Reach for this when a scaled rig writes a mesh that comes back the wrong size.
Remove Meshes Missing From Input True/False What happens to a DNA mesh of the baked LOD that the input mesh does not carry (no section with its name and no section at its position). Off (default): the mesh is kept in the LOD exactly as it was - bake only what you wired, e.g. a head-only mesh leaves teeth, eyes and eyelashes untouched. On: the mesh is removed from the baked LOD's mesh list, for the case where you deliberately deleted that section from the mesh. Removal only unlinks the mesh from this LOD; its data stays in the file and other LODs keep their own copies.
Transfer Morph Targets True/False Only matters when your mesh changed the vertex count. Carries the existing blendshapes over onto the rebuilt geometry, matching each part of the mesh up by name. Turn it off and every blendshape in the file is wiped, which is what you want when the old shapes no longer fit the new mesh.
Apply To LODs True/False Also push the change onto every coarser LOD, by projecting it down from the one you baked. Ignored when your mesh changed the vertex count, since there is then nothing to project from.
Vertex Threshold Number How far the projection may reach to find the matching vertex on each coarser LOD. Too low and stretches of the LOD stay unchanged. Too high and the change jumps a gap onto the wrong side of a fold.
Normal Incompatibility Threshold Number How far a triangle may face away from the one it matched before the projection refuses it. This is what stops LOD triangles turning inside out.
Smooth Type Choice How the projected result is smoothed on each coarser LOD. Preserve UV Flow keeps the smoothing from dragging across UV seams.
Smooth Strength Number How hard each smoothing pass pulls. Push it up and the projected detail flattens out.
Smooth Iterations Whole number How many smoothing passes to run. Zero, the default, means none: raise it only when the projected LOD comes out lumpy.
Quad Export True/False Only matters when your mesh changed the vertex count and the DNA meshes get rebuilt. Pairs triangles back into quads on the way out, so the written mesh reads the way DNA meshes normally do rather than as raw triangles.
Respect UV Seams True/False Never pair two triangles across a UV seam.
Respect Hard Normals True/False Never pair two triangles across a hard edge.
Quad Metric Clamp Number Ceiling on how bad a pairing the quad search will still accept. Lower it and only clean, square pairs survive; the rest go out as triangles.
Quad Adjacency Weight Number How much the quad search cares about lining its quads up with the ones next to them, rather than judging each pair on its own.
Quad Search Rounds Whole number How many passes the quad search makes. More passes tidy up the leftover triangles at the cost of bake time.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Get DNA RBF Pose

One pose of one RBF solver inside a DNA, evaluated on its own, with the mesh and the bones that pose drives.

Get DNA RBF Pose node

The Get DNA RBF Pose node

When to use it

One pose of one RBF solver inside a DNA, evaluated on its own, with the mesh and the bones that pose drives.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Pick a solver

    The pose list refills to match it.

  3. 3

    Read the three outputs

    Mesh is the fire pose plus this pose's joint-group column, the same conversion Get DNA Expression uses. Trigger is the fire pose only, ready to wire into Set DNA RBF Pose's Trigger. Bones tells you which joints the pose's column drives.

Pins

Pin Type Description
DNA DNA The DNA to read the RBF pose out of.
Pin Type Description
Mesh Mesh The mesh when this pose fires: the trigger plus this pose's joint-group column (same conversion as Get DNA Expression).
Trigger Mesh The mesh at just this pose's trigger rotations - the joints turned to where they fire the corrective, with no correction on top. Wire it into Set DNA RBF Pose's Trigger to start from what the DNA already stores.
Bones Bone Selection The joints this pose drives. Feed it into a bone selection so you only work on the ones this corrective touches.

Settings

Setting Type Description
RBF Solver Name Text Which solver to look inside. Pick this first: changing it rebuilds the pose list below. The list comes from the DNA on the input pin.
RBF Pose Name Text Which pose of that solver to apply. Nothing happens until both this and the solver are set.
LOD Index Whole number Which LOD to build the posed mesh from. 0 is the densest.
Log Pose Cells True/False Writes this pose's per-joint rotation cells to the log so a Get - Set - Get round trip can be checked cell by cell. Off for normal work.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
The same fix in Mesh Morpher ClassicRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-dna-rbf-poses-classic

Studio and Graph › MetaHuman DNA

Set DNA On Skeletal Mesh

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Set DNA On Skeletal Mesh node

The Set DNA On Skeletal Mesh node

When to use it

Writes a DNA onto a Skeletal Mesh asset, the same slot Load DNA reads back out. Feed it from Load DNA File, Bake DNA Geometry, or any DNA chain, pick the Skeletal Mesh to write into, and press Set DNA On Skeletal Mesh.

It replaces whatever DNA the mesh had. On newer engines the DNA is stored as the mesh's MetaHuman DNA Data; on older ones it uses the legacy storage, and you do not have to know which. The mesh is marked changed so a save keeps it.

Editor only: it edits a project asset, so it does nothing in a packaged build. Run Validate DNA just before it when the DNA came from somewhere you do not control.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Pick the Skeletal Mesh asset to write into

  3. 3

    Press Set DNA On Skeletal Mesh

Pins

Pin Type Description
DNA DNA The DNA to attach onto the skeletal mesh.

Settings

Setting Type Description
Skeletal Mesh Asset The Skeletal Mesh asset the write button targets. Editor only.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › MetaHuman DNA

Set DNA RBF Pose

Re-records one RBF pose of a DNA: the joint rotations that trigger it, the solver's RBF parameters, the pose's scale and name, and the corrected joint pose it applies. The write half of Get DNA RBF...

Set DNA RBF Pose node

The Set DNA RBF Pose node

When to use it

Re-records one RBF pose of a DNA: the joint rotations that trigger it, the solver's RBF parameters, the pose's scale and name, and the corrected joint pose it applies. The write half of Get DNA RBF Pose.

How to use it

  1. 1

    Isolate the pose with Get DNA RBF Pose, move its joints, wire that mesh into Mesh and the same DNA into DNA

  2. 2

    Optionally wire a second mesh into Trigger to re-record which driver rotations fire the corrective. Unwired reads those drivers from Mesh

  3. 3

    Pick the solver, then the pose

    The solver settings and pose scale load from the DNA when you pick, so what you see is what is stored.

  4. 4

    Adjust anything you want changed and press Set RBF Pose

    This is bone work, not sculpting: it reads where the joints ended up, not where the vertices ended up. The mesh must still carry the DNA's own bone names — joints that do not line up are left untouched.

Pins

Pin Type Description
DNA DNA The DNA holding the RBF pose you want to rewrite.
Mesh Mesh The mesh with its bones at the corrected pose - what the corrective should look like when it fires. Start from Get DNA RBF Pose and move joints from there.
Trigger Mesh Optional: a mesh whose bones stand at the pose that should trigger this corrective. Leave unwired to read driver rotations from Mesh. Get DNA RBF Pose's Trigger output gives you that stored trigger mesh to start from.
Pin Type Description
DNA DNA The DNA with that pose re-recorded.

Settings

Setting Type Description
RBF Solver Name Text Which solver to write inside. Pick this first: changing it rebuilds the pose list below and reloads the solver settings from the DNA.
RBF Pose Name Text Which pose of that solver to overwrite. Nothing happens until both this and the solver are set.
New Pose Name Text Rename the pose on write. Empty keeps the current name.
Pose Scale Number Scale factor stored on the pose. Loaded from the DNA when you pick the pose; written back as-is. Joint cells are authored at pose weight 1.0; this scale multiplies them on top, at runtime.
Insert Missing Attributes True/False Lets the pose drive joint attributes it was not already driving (a joint you translated that the pose only rotated before, a joint the pose never touched at all). With it off, movement on any attribute the pose does not already own is dropped and that part of your pose quietly goes missing. New rows land in the joint's own joint group (never a borrowed one), and the pose's own column is added to that group when it is missing there. A joint whose attribute already has a row there - e.g. because an expression wired it - keeps that single row: this pose's column is added to it rather than a second row being inserted for the same attribute.
Log Pose Cells True/False Writes this pose's per-joint rotation cells to the log so a Get - Set - Get round trip can be checked cell by cell. Off for normal work.
Apply Solver Settings True/False Write the solver settings below into the DNA alongside the pose. They are loaded from the DNA when you pick the solver, so leaving them untouched writes back what was already there. Turn this off to leave the solver's stored settings alone entirely.
Solver Type Choice Additive sums contributions from each pose; Interpolative interpolates between them by distance.
Function Type Choice Falloff curve of a pose's influence over distance.
Distance Method Choice How the distance between the driver rotation and a pose's stored trigger is measured. MetaHuman correctives use SwingAngle / TwistAngle solvers.
Normalize Method Choice When pose weights are normalized after solving.
Twist Axis Choice The twist axis Swing/Twist distance methods measure around.
Automatic Radius Choice On derives the radius from the stored poses; Off uses Solver Radius.
Solver Radius Number Falloff radius, used when Automatic Radius is Off. Angle-based distance methods measure it in degrees.
Solver Weight Threshold Number Pose weights below this are clamped to zero.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
The same fix in Mesh Morpher ClassicRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-dna-rbf-poses-classic

Studio and Graph › MetaHuman DNA

Validate DNA

Inspects a MetaHuman DNA for structural defects, passes the DNA straight through, and publishes the verdict on pins. LOD index tables, joint hierarchy, RigLogic behaviour matrices, skin weights, ve...

Validate DNA node

The Validate DNA node

When to use it

Inspects a MetaHuman DNA for structural defects, passes the DNA straight through, and publishes the verdict on pins. LOD index tables, joint hierarchy, RigLogic behaviour matrices, skin weights, vertex layouts, blendshape targets.

How to use it

  1. 1

    Drop it anywhere in a DNA chain

    DNA in, DNA out, nothing is changed.

  2. 2

    Read the findings in the details panel, worst first

    Each one says what breaks and where.

  3. 3

    Branch on Is Sound to keep a broken DNA out of an export

Pins

Pin Type Description
DNA DNA The DNA to check. It passes straight through to the output, untouched.
Pin Type Description
DNA DNA The same DNA, byte for byte. Nothing is repaired here; the findings tell you what to fix and where.
IsSound True/False True when the DNA read cleanly and nothing came back as an error. Warnings alone leave it true: a duplicated bone name imports wrongly but is still a complete rig. Only written once a check has actually run.
Errors Whole Number How many errors were found. The full count, even when only the first few are listed.
Warnings Whole Number How many warnings were found.
LODCount Whole Number How many LODs the DNA has.
JointCount Whole Number How many bones are in the DNA's skeleton.
MeshCount Whole Number How many separate meshes the DNA carries, across every LOD.

Settings

Setting Type Description
Validate Automatically True/False Re-check every time the DNA on the pin changes. Turn it off on a file so big the geometry pass gets in your way; the node then says nothing at all until you press Validate, rather than showing you a stale answer.
Depth Choice How deep to look. The top two settings are instant; the last one walks every vertex.
Skin Weight Normalization Tolerance Number How far a vertex's skin weights may drift from summing to 1 before they are called wrong. Deliberately loose. MetaHuman DNA is authored in Maya and stores weights at single precision, so a perfectly good vertex routinely sums to 0.9999. Tie this down tight and every vertex of every shipped file gets flagged.
Max Issues Per Defect Whole number How many individual locations to list per kind of problem. The counts stay exact whatever you set; this only caps the "mesh 3, vertex 812" lines, so one systematic corruption cannot bury the report in millions of them.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Create DNA

Builds a brand new MetaHuman-shaped DNA from a mesh: skeleton, skin weights and geometry, plus a structurally complete but functionally identity behavior layer underneath - no controls, no blendsha...

Create DNA node

The Create DNA node

When to use it

Builds a brand new MetaHuman-shaped DNA from a mesh: skeleton, skin weights and geometry, plus a structurally complete but functionally identity behavior layer underneath - no controls, no blendshapes, so RigLogic evaluates it and nothing moves. This is a geometry-and-skeleton round trip, not a rig round trip. To edit an existing DNA and keep its rig, use Bake DNA Geometry instead.

How to use it

  1. 1

    Wire your base mesh (bones + skin weights already on it, e.g. from a DNA To Mesh sculpt or an Auto Rig) into Mesh. It becomes LOD 0

  2. 2

    Optionally wire coarser LODs into Additional LODs, element i becoming LOD i+1

  3. 3

    Pick Body Part - it decides the db-name convention and the default mesh name, nothing geometric

  4. 4

    Press Create DNA

    This is a geometry-and-skeleton round trip, not a rig round trip: the file this produces has no GUI controls and no blendshapes. Chain Create DNA → Set DNA Blendshape to author shapes on top of it.

Pins

Pin Type Description
Mesh Mesh The base mesh. Its bones and skin weights become the new DNA's skeleton and weights. Becomes LOD 0.
AdditionalLODs Mesh List Optional coarser LODs, in order - element 0 becomes LOD 1, element 1 becomes LOD 2, and so on. Leave unwired for a single-LOD DNA.
TemplateDNA DNA Optional. The rig donor when Scaffold Rig is on. Leave unwired to use the engine's own MetaHuman archetype for Body Part when available.
Pin Type Description
DNA DNA The new DNA. Empty until Create DNA succeeds - never a partial file.

Settings

Setting Type Description
Body Part Choice Whether the file describes a head or a body. Head / Face uses the mh.6 db-name convention, head_lod_mesh mesh names and the 8-LOD convention; Body uses mhb.1, body_lod_mesh and 4.
DNA Name Text The descriptor's own Name field - metadata inside the file. No longer overridable from a pin (the DNAName override input pin is gone); edit it here.
Ethnicity Choice The archetype field is an ethnicity field (asian/black/caucasian/hispanic/ alien/other), never head-vs-body - Body Part above is the separate answer to that question.
Gender Choice
Age Whole number
Write UVs True/False Write real UVs. Off writes the same layout structure with placeholder (0,1) UVs, so a later re-topology tool still finds a UV channel.
Write Skin Weights True/False Write the mesh's own skin weights. Off writes no skin weights at all - the mesh will not deform under any pose.
Synthesize Root Joint True/False When the mesh carries no bones at all, add a single "root" joint at the origin and bind every vertex to it 100%, rather than refusing. A DNA needs at least one joint - JointRowCount is JointCount*9, and zero is a defect the validator reports, not a legal empty rig.
Max Influences Per Vertex Whole number Skin weights are truncated to this many influences per vertex (fewest- first dropped, matching the reader's own influence ordering). RigLogic's own MAX_TOTAL_INFLUENCES ceiling is 12.
Scaffold Rig True/False Also donate a rig from a template DNA - generic face expressions for Head, RBF/twist-swing machinery for Body - so the created DNA is immediately drivable instead of geometry+skeleton only. Off by default: the plain geometry+skeleton contract stays what Create DNA promises unless you ask for more. The template is transferred by matching joint names against your mesh's own skeleton - never a hard-coded control list - so a mesh whose bone names do not match the template gets little or nothing scaffolded, honestly reported either way. Geometry, skin weights and your mesh's own neutral pose are never touched by this - only the rig layers are donated. Wire Template DNA to choose the source explicitly; leave it unwired to use the engine's own MetaHuman archetype for the chosen Body Part when available, or a badge naming the fix when it is not.
Bone Mapping List of MMDNA Bone Map Row Which bone in your mesh's own skeleton a template joint donates its rig to, keyed by template joint - Writable by the in-app agent but hidden from the ordinary properties rows; the bone-map panel is its real editor. Reactively prefilled from the resolved scaffold template whenever it changes; explicit Auto-Map/Clear via the widget's buttons force a full re-map / empty it.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Create DNA From Skeletal Mesh

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Create DNA From Skeletal Mesh node

The Create DNA From Skeletal Mesh node

When to use it

Create DNA's asset-picker-sourced sibling: the same build - skeleton, skin weights, geometry, plus a structurally complete but functionally identity behavior layer, and the same optional Scaffold Rig - built directly from a project Skeletal Mesh asset instead of a mesh pin. Editor only, the same reason Load Skeletal Mesh is: it reads the asset's mesh description, which a packaged build strips.

How to use it

  1. 1

    Pick a Skeletal Mesh asset

  2. 2

    Optionally list Keep LODs (empty imports every LOD the asset has; asset LOD i becomes DNA LOD i)

  3. 3

    Pick Body Part - it decides the db-name convention and the default mesh name, nothing geometric

  4. 4

    Optionally turn on Scaffold Rig to donate generic expressions/RBF/twist- swing from a template DNA - see the property's own tooltip

Pins

Pin Type Description
TemplateDNA DNA Optional. The rig donor when Scaffold Rig is on. Leave unwired to use the engine's own MetaHuman archetype for Body Part when available.
Pin Type Description
DNA DNA The new DNA. Empty until the asset and options resolve to a valid build - never a partial file.

Settings

Setting Type Description
Skeletal Mesh Asset The asset to build a DNA from.
Use Import Data True/False Reads the geometry the asset was imported with instead of the built render mesh - see Load Skeletal Mesh's own property of the same name for why leaving it on is usually right.
Keep LODs List of Whole number Which of the asset's LODs to import, in order - asset LOD i becomes DNA LOD i. Empty (the default) imports every LOD the asset has. Writable by the in-app agent but hidden from the ordinary properties rows.
Body Part Choice
DNA Name Text The descriptor's own Name field.
Ethnicity Choice
Gender Choice
Age Whole number
Write UVs True/False Write real UVs. Off writes the same layout structure with placeholder (0,1) UVs.
Write Skin Weights True/False Write the asset's own skin weights. Off writes no skin weights at all - the mesh will not deform under any pose.
Max Influences Per Vertex Whole number Skin weights are truncated to this many influences per vertex (fewest- first dropped). RigLogic's own ceiling is 12.
Scaffold Rig True/False See Create DNA's own Scaffold Rig property - identical behaviour.
Bone Mapping List of MMDNA Bone Map Row See Create DNA's own Bone Mapping property - identical behaviour and identical editor.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › MetaHuman DNA

Edit DNA Animated Map

Adds, renames, sets LOD membership on, appends a driving row to, replaces the rows of, or removes animated maps on a DNA - MetaHuman's eyeBlink / eyeLidTightener-style values, each driven by a raw ...

Edit DNA Animated Map node

The Edit DNA Animated Map node

When to use it

Adds, renames, sets LOD membership on, appends a driving row to, replaces the rows of, or removes animated maps on a DNA - MetaHuman's eyeBlink / eyeLidTightener-style values, each driven by a raw control through the same [From, To] interval and Slope*x+Cut line a GUI control's own rows use - as an ordered list of operations applied atomically.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Build an ordered list of operations in the Operations panel below the properties

    Each entry picks Add / Rename / Set LODs / Add Row / Set Rows / Remove, a target/new name, and whichever of the LOD checkbox row / raw-control picker + From-To-Slope-Cut fields / rows table its own Op uses. Picking a map shows that map's own current rows (read-only) so Add Row's own "appends after this" is never a guess, and on a Set Rows entry also loads those rows into the rows table to edit (Load Rows From DNA does the same at any time). Untick an entry to keep it staged without running it.

  3. 3

    Press Apply Animated Map

    Every enabled entry runs in order against the result of every earlier one - rename a map then Add Row on it in the very next entry and the row lands on the map under its new name. The whole batch is atomic: the first refusal publishes nothing at all, not even the operations before it.

Pins

Pin Type Description
DNA DNA The DNA to edit animated maps on.
Pin Type Description
DNA DNA The DNA with every operation applied. Empty until Apply Animated Map succeeds - never a partial file.

Settings

Setting Type Description
Operations List of MMDNA Animated Map Operation The ordered batch Apply Animated Map runs, one entry at a time, top to bottom. Edited in its own panel on the node, not in the plain properties list.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Edit DNA Blendshape Channel

Adds, renames, edits LOD membership, wires an expression to, removes outright, or drops one target row of a blend shape channel, as an ordered list of operations applied atomically - the identity/w...

Edit DNA Blendshape Channel node

The Edit DNA Blendshape Channel node

When to use it

Adds, renames, edits LOD membership, wires an expression to, removes outright, or drops one target row of a blend shape channel, as an ordered list of operations applied atomically - the identity/wiring/removal authoring counterpart to Set DNA Blendshape, which only ever creates the inert channel from a sculpted mesh and writes its targets.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Build an ordered list of operations in the Operations panel below the properties

    Each entry picks Add / Rename / Set Lods / Wire Expression / Remove Channel / Remove Target, a target (Channel Name, or Mesh Name + Target Index for Remove Target), and whichever of New Name / the LOD checkboxes / Control Name apply to it. Untick an entry to keep it staged without running it.

  3. 3

    Press Apply Blendshape Channel

    Every enabled entry runs in order against the result of every earlier one - rename a channel then wire it in the very next entry and the wire finds it under the new name. The whole batch is atomic: the first refusal publishes nothing at all, not even the operations before it.

Pins

Pin Type Description
DNA DNA The DNA to edit blend shape channels on.
Pin Type Description
DNA DNA The DNA with every operation applied. Empty until Apply Blendshape Channel succeeds - never a partial file.

Settings

Setting Type Description
Operations List of MMDNA Blendshape Channel Operation The ordered batch Apply Blendshape Channel runs, one entry at a time, top to bottom. Edited in its own panel on the node, not in the plain properties list.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Edit DNA Expression

Adds, renames, wires or removes raw controls (expressions) on a DNA, as an ordered list of operations applied atomically - the authoring counterpart to whatever reads them (PSDs, joint groups, blen...

Edit DNA Expression node

The Edit DNA Expression node

When to use it

Adds, renames, wires or removes raw controls (expressions) on a DNA, as an ordered list of operations applied atomically - the authoring counterpart to whatever reads them (PSDs, joint groups, blend shape channels, animated maps, RBF solvers, and Get DNA GUI Controls' own raw-control table).

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Build an ordered list of operations in the Operations panel below the properties

    Each entry picks Add / Rename / Wire / Remove / Set Wiring / Unwire, a target, and whatever fields that op needs. Untick an entry to keep it staged without running it.

  3. 3

    Press Apply Expressions

    Every enabled entry runs in order against the result of every earlier one - add a raw control then wire it in the very next entry and the wire finds it under its new name. The whole batch is atomic: the first refusal publishes nothing at all, not even the operations before it.

Pins

Pin Type Description
DNA DNA The DNA to edit raw controls (expressions) on.
Pin Type Description
DNA DNA The DNA with every operation applied. Empty until Apply Expressions succeeds - never a partial file.

Settings

Setting Type Description
Operations List of MMDNA Expression Operation The ordered batch Apply Expressions runs, one entry at a time, top to bottom. Edited in its own panel on the node, not in the plain properties list.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Edit DNA GUI Control

Adds, edits, renames or removes GUI controls (MetaHuman face-board sliders) on a DNA, as an ordered list of operations applied atomically - the authoring counterpart to Get DNA GUI Controls, which ...

Edit DNA GUI Control node

The Edit DNA GUI Control node

When to use it

Adds, edits, renames or removes GUI controls (MetaHuman face-board sliders) on a DNA, as an ordered list of operations applied atomically - the authoring counterpart to Get DNA GUI Controls, which only reads and evaluates.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Build an ordered list of operations in the Operations panel below the properties

    Each entry picks Add / Edit Rows / Rename / Remove, a target/new name, and (for Add / Edit Rows) a Mapping Rows table, the same [From, To] interval / Slope*x+Cut line RigLogic evaluates inside it. Picking a control on an Edit Rows entry replaces that entry's rows with what is currently on the DNA; Load Rows From DNA does the same at any time. Untick an entry to keep it staged without running it.

  3. 3

    Press Apply GUI Control

    Every enabled entry runs in order against the result of every earlier one - rename a control then edit its rows in the very next entry and the edit finds it under the new name. The whole batch is atomic: the first refusal publishes nothing at all, not even the operations before it.

Pins

Pin Type Description
DNA DNA The DNA to edit GUI controls on.
Pin Type Description
DNA DNA The DNA with every operation applied. Empty until Apply GUI Control succeeds - never a partial file.

Settings

Setting Type Description
Operations List of MMDNA Gui Control Operation The ordered batch Apply GUI Control runs, one entry at a time, top to bottom. Edited in its own panel on the node, not in the plain properties list.
Operation Choice Legacy - pre-Operations single-edit shape, kept only so a graph saved before this batch redesign still opens correctly (an older graph's values are folded into the first operation when it opens). Nothing in the app writes them anymore.
Control Name Text Legacy - see Operation. Never rendered; kept only so a graph saved before the redesign still opens.
New Name Text Legacy - see Operation.
Rows List of MMDNA Gui Control Row Setting Legacy - see Operation.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Edit DNA LODs

Drops a DNA down to a subset of its own LODs, appends new LODs cloned from an existing one, or both in the same pass.

Edit DNA LODs node

The Edit DNA LODs node

When to use it

Drops a DNA down to a subset of its own LODs, appends new LODs cloned from an existing one, or both in the same pass.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Keep LODs: list the LODs to keep, ascending, e.g. [0, 2] to keep only LOD 0 and LOD 2 (renumbered 0 and 1). Leave empty to keep every LOD

  3. 3

    Add Cloned LODs: how many new LODs to append, each a byte-identical copy of Clone From LOD - "immediately valid, evaluates identically". Clone From LOD indexes the mesh after the keep-filter above, so -1 (the default) always means "the last LOD that survived the filter"

  4. 4

    Press Apply LODs

    A dropped LOD's own meshes, blendshape targets and LOD-only behavior rows are gone - re-adding it later starts from whatever the DNA looks like then, not from what was dropped.

Pins

Pin Type Description
DNA DNA The DNA to edit the LODs of.
Pin Type Description
DNA DNA The DNA with its LODs edited. Empty until Apply LODs succeeds - never a partial file.

Settings

Setting Type Description
Keep LODs List of Whole number LODs to keep, ascending, no duplicates. Empty (the default) keeps every LOD - Apply LODs then only appends clones, if any. Writable by the in-app agent but hidden from the ordinary properties rows.
Add Cloned LODs Whole number How many new LODs to append, each a clone of Clone From LOD. 0 skips the additive half entirely.
Clone From LOD Whole number Which LOD the appended clones copy, indexed after Keep LODs has already run. -1 means the last LOD that survived the keep-filter.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Edit DNA ML

Adds or removes ML controls, and removes neural networks, on a DNA, as an ordered list of operations applied atomically - the wave-3 authoring counterpart to whatever a Get/Create DNA node can only...

Edit DNA ML node

The Edit DNA ML node

When to use it

Adds or removes ML controls, and removes neural networks, on a DNA, as an ordered list of operations applied atomically - the wave-3 authoring counterpart to whatever a Get/Create DNA node can only read. A network's own weights and layers are authored only by the Python verb add_neural_network (a real layer needs its full weight/bias matrices, not a handful of Slate fields), so this node never adds one - do not go looking for that option here.

Operations is a list edited in the Operations panel below the properties: Add Operation appends an entry, and each entry has an enabled tick, an Op (Add ML Control / Remove ML Control / Remove Neural Network), a New Name box (Add ML Control), an ML control target (Remove ML Control, picked from a plain-name list), a Network target (Remove Neural Network, picked from a list labelled "net <i>: <in> in → <out> out, <layers> layer(s), LODs <list>" - a read-only info line under the card repeats it) and a Force Cascade tick (Remove ML Control), Up/Down/Remove. An unticked entry is skipped entirely (never validated) and reported as "skipped".

Apply ML runs every enabled entry in order, each resolved against the result of every earlier one - an ML control is targeted by its name, which stays correct across the batch even after an earlier entry adds or removes other controls (unlike a PSD's positional index); a network is targeted by its plain index, renumbered down by an earlier Remove Neural Network in the same batch exactly like a PSD's own Remove. This is atomic: the first entry that refuses publishes nothing at all, not even the operations before it, and Summary names exactly which entry and why. A pin change only updates Summary (ML control/network counts and one preview block per operation, including a live reference-cascade preview for Remove ML Control) without touching the DNA, the same pattern as Edit DNA PSD.

An ML control no neural network writes stays 0 at evaluation time - harmless, exactly like an unused raw control. Removing a referenced ML control (a PSD factor, a neural network's own input or output) refuses without Force Cascade; Summary lists every kind found before you press anything. Removing a neural network renumbers every later network's own index, its per-LOD membership lists and every mesh-region row that named it; Summary surfaces that renumbering plus, when this DNA carries the plugin's own mlbe op-graph section, whatever the cascade dropped from it.

Mid-band insertion is unsupported: Add ML Control always appends at the end of the ML band.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Build an ordered list of operations in the Operations panel below the properties

    Each entry picks Add ML Control / Remove ML Control / Remove Neural Network, a New Name box (Add ML Control), an ML control picker (Remove ML Control), a Network picker (Remove Neural Network) and a Force Cascade tick (Remove ML Control). Untick an entry to keep it staged without running it.

  3. 3

    Press Apply ML

    Every enabled entry runs in order against the result of every earlier one. The whole batch is atomic: the first refusal publishes nothing at all, not even the operations before it.

Pins

Pin Type Description
DNA DNA The DNA to edit ML controls / neural networks on.
Pin Type Description
DNA DNA The DNA with every operation applied. Empty until Apply ML succeeds - never a partial file.

Settings

Setting Type Description
Operations List of MMDNAML Node Operation The ordered batch Apply ML runs, one entry at a time, top to bottom. Edited in its own panel on the node, not in the plain properties list.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Edit DNA PSD

Adds, replaces or removes PSD correctives on a DNA, as an ordered list of operations applied atomically - a PSD is a control computed as the weighted product of its own factor controls, the missing...

Edit DNA PSD node

The Edit DNA PSD node

When to use it

Adds, replaces or removes PSD correctives on a DNA, as an ordered list of operations applied atomically - a PSD is a control computed as the weighted product of its own factor controls, the missing authoring counterpart to every PSD a Get/Create DNA node can only read.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Build an ordered list of operations in the Operations panel below the properties

    Each entry picks Add / Replace Factors / Remove, a Factors table (control + weight rows, Add / Replace) and, for Replace / Remove, a PSD target and a Force Cascade tick. Untick an entry to keep it staged without running it.

  3. 3

    Press Apply PSD

    Every enabled entry runs in order against the result of every earlier one. The whole batch is atomic: the first refusal publishes nothing at all, not even the operations before it.

Pins

Pin Type Description
DNA DNA The DNA to edit PSDs on.
Pin Type Description
DNA DNA The DNA with every operation applied. Empty until Apply PSD succeeds - never a partial file.

Settings

Setting Type Description
Operations List of MMDNAPSD Operation The ordered batch Apply PSD runs, one entry at a time, top to bottom. Edited in its own panel on the node, not in the plain properties list.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Edit DNA RBF Pose

Adds or removes RBF poses and RBF pose controls on a DNA's corrective layer - the structural authoring counterpart to Get DNA RBF Pose, as an ordered list of operations applied atomically.

Edit DNA RBF Pose node

The Edit DNA RBF Pose node

When to use it

Adds or removes RBF poses and RBF pose controls on a DNA's corrective layer - the structural authoring counterpart to Get DNA RBF Pose, as an ordered list of operations applied atomically.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Build an ordered list of operations in the Operations panel below the properties

    Each entry picks Add Pose / Remove Pose / Add Pose Control / Remove Pose Control. Add Pose needs a solver, a new name, a driver value per that solver's own driver control (sized automatically once you pick the solver) and, usually, at least one output. Untick an entry to keep it staged without running it.

  3. 3

    Press Apply RBF Pose

    Every enabled entry runs in order against the result of every earlier one - add a pose control then wire a new pose's own Outputs at it in the very next entry and it resolves under the name that entry just created. The whole batch is atomic: the first refusal publishes nothing at all, not even the operations before it.

Pins

Pin Type Description
DNA DNA The DNA to edit RBF poses / pose controls on.
Pin Type Description
DNA DNA The DNA with every operation applied. Empty until Apply RBF Pose succeeds - never a partial file.

Settings

Setting Type Description
Operations List of MMDNARBF Pose Operation The ordered batch Apply RBF Pose runs, one entry at a time, top to bottom. Edited in its own panel on the node, not in the plain properties list.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Edit DNA RBF Solver

Adds or removes whole RBF solvers on a DNA, as an ordered list of operations applied atomically - drivers, the wire-format settings and LOD membership for Add; a poses policy (remove/keep) plus an ...

Edit DNA RBF Solver node

The Edit DNA RBF Solver node

When to use it

Adds or removes whole RBF solvers on a DNA, as an ordered list of operations applied atomically - drivers, the wire-format settings and LOD membership for Add; a poses policy (remove/keep) plus an optional force cascade for Remove. Editing an existing solver's own 12 fields stays on Set DNA RBF Pose; this node only adds whole solvers or removes them.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Build an ordered list of operations in the Operations panel below the properties

    Each entry picks Add / Remove. Add needs a New Name, a Driver Controls table (raw controls, in order - the panel shows a live quartet badge next to it) and the solver settings; Remove needs a Solver picker (pads are hidden - they are never a valid target) plus Keep Poses / Force Cascade. Untick an entry to keep it staged without running it.

  3. 3

    Press Apply RBF Solver

    Every enabled entry runs in order against the result of every earlier one - adding a solver then removing it again in the very next entry works. The whole batch is atomic: the first refusal publishes nothing at all, not even the operations before it.

Pins

Pin Type Description
DNA DNA The DNA to edit RBF solvers on.
Pin Type Description
DNA DNA The DNA with every operation applied. Empty until Apply RBF Solver succeeds - never a partial file.

Settings

Setting Type Description
Operations List of MMDNARBF Solver Operation The ordered batch Apply RBF Solver runs, one entry at a time, top to bottom. Edited in its own panel on the node, not in the plain properties list.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Edit DNA Twist Swing

Adds, edits (Set) or removes twist/swing parameter-group setups - the quaternion-driven joint corrective tables RigLogic evaluates - as an ordered list of operations applied atomically.

Edit DNA Twist Swing node

The Edit DNA Twist Swing node

When to use it

Adds, edits (Set) or removes twist/swing parameter-group setups - the quaternion-driven joint corrective tables RigLogic evaluates - as an ordered list of operations applied atomically.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Build an ordered list of operations in the Operations panel below the properties

    Each entry picks Add / Set / Remove, Twist or Swing, and (Set / Remove) a Setup picked from the per-kind cache below it. Add and a flagged Set need the driver quaternion (exactly 4 raw controls, x/y/z/w), an Axis, and at least one output joint with a blend weight. Set only writes the fields ticked Set Axis / Set Inputs / Set Outputs - an untouched field keeps the setup's current value. Untick an entry to keep it staged without running it.

  3. 3

    Press Apply Twist Swing

    Every enabled entry runs in order against the result of every earlier one. The whole batch is atomic: the first refusal publishes nothing at all, not even the operations before it - Summary names the failing entry.

Pins

Pin Type Description
DNA DNA The DNA to edit twist/swing setups on.
Pin Type Description
DNA DNA The DNA with every operation applied. Empty until Apply Twist Swing succeeds - never a partial file.

Settings

Setting Type Description
Operations List of MMDNA Twist Swing Operation The ordered batch Apply Twist Swing runs, one entry at a time, top to bottom. Edited in its own panel on the node, not in the plain properties list.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Get DNA GUI Controls

Lists every GUI control (slider) a DNA exposes and, for the one you pick, evaluates exactly what a chosen value on it drives - which raw controls, and at what values - computed the same way RigLogi...

Get DNA GUI Controls node

The Get DNA GUI Controls node

When to use it

Lists every GUI control (slider) a DNA exposes and, for the one you pick, evaluates exactly what a chosen value on it drives - which raw controls, and at what values - computed the same way RigLogic's own conditional table would compute it.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Pick a control from the dropdown (lists every one, in DNA order, regardless of the pick)

  3. 3

    Set Control Value and read Inspection (in the details panel) to see exactly what that control drives and how far

Pins

Pin Type Description
DNA DNA The DNA to read. Passes straight through to the output, untouched.
Pin Type Description
DNA DNA The same DNA, byte for byte. Never written by this node.

Settings

Setting Type Description
Control Name Text Which GUI control to evaluate. The list comes from the DNA on the input pin - wire that first or the dropdown is empty.
Control Value Number The value to drive ControlName at, in that control's own units - a slider's own from/to domain, which RigLogic never normalizes to a fixed range. A value outside the control's legal range matches nothing and evaluates to 0 - that is RigLogic's own behavior, not a bug here, so this deliberately carries no ClampMin/ClampMax.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Merge DNA

Combines a body DNA and a head/face DNA into one DNA: every joint, control, mesh and behavior table renumbered into a single index space, with the shared-by-name joints (head, neck01, neck02 and th...

Merge DNA node

The Merge DNA node

When to use it

Combines a body DNA and a head/face DNA into one DNA: every joint, control, mesh and behavior table renumbered into a single index space, with the shared-by-name joints (head, neck_01, neck_02 and the rest of the chain they hang off) collapsed to one entry each. This is index-space concatenation, not a geometric re-fit - a MetaHuman-family pair is already authored pre-aligned in one world space, so nothing needs to move.

How to use it

  1. 1

    Wire a body DNA into Body DNA and a head/face DNA into Head DNA

  2. 2

    Read Report and Shared Joints in the details panel - they update on every pin change without running the merge itself

  3. 3

    Press Merge Now

    A precondition refusal leaves DNA empty; Report says exactly why.

Pins

Pin Type Description
BodyDNA DNA The body DNA - its skeleton root, world placement and shared-joint neutrals win. Side A: keeps its own joint numbering unchanged in the merged file.
HeadDNA DNA The head/face DNA - its face rig is appended. Side B: its joints are renumbered, shared-by-name ones folded onto the body's.
Pin Type Description
DNA DNA The merged DNA. Empty until Merge Now succeeds - never a partial merge.

Settings

Setting Type Description
Descriptor Source Choice Which input DNA's descriptor the merged file inherits. Head by default, because the head/face DNA is the identity carrier.
LOD Mapping List of Merge DNALOD Pair One entry per output LOD - merged LOD k unions Body LOD BodyLOD with Head LOD HeadLOD. Auto-filled proportionally the moment both DNAs are wired - edit a row to override it; the auto-fill never overwrites a row you have changed, tracked against LastAutoLODMapping below. Reset LOD Mapping re-applies the proportional table unconditionally, discarding any edits. Writable by the in-app agent but hidden from the ordinary properties rows.
Shared Joint Tolerance Number How far a shared-by-name joint's world position may drift, in cm, before Anchor Mismatch Policy engages.
Shared Joint Policy Choice
Anchor Mismatch Policy Choice
Allow Unknown Layer Loss True/False A merge renumbers every index; a DNA container section this build does not model (5.8's mlbe/dsce, or newer) would keep pointing at the old index space if carried through unchanged - refused by default. Turn this on to proceed anyway and drop it (named in Report either way).
Solver Name Suffix Text Appended to a Head DNA RBF solver's name when it collides with a Body DNA solver name after concatenation.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Pose DNA Controls

Poses a DNA's mesh from a sparse set of GUI control values - only the ones you have moved off zero - evaluated through the DNA's own RigLogic rig: GUI-to-raw mapping, corrective and machine-learned...

Pose DNA Controls node

The Pose DNA Controls node

When to use it

Poses a DNA's mesh from a sparse set of GUI control values - only the ones you have moved off zero - evaluated through the DNA's own RigLogic rig: GUI-to-raw mapping, corrective and machine-learned behaviour, joints, blendshapes and animated maps, exactly as the rig would compute them, then publishes the posed mesh.

How to use it

  1. 1

    Wire a DNA in

  2. 2

    Open the details panel and move sliders

    Releasing one (or pressing Enter) reposes; dragging does not, so a fast pose stays fast.

  3. 3

    Mesh is the result; Bones and Pose Summary (in the details panel) say what actually moved

Pins

Pin Type Description
DNA DNA The DNA to pose. Passes through untouched - the values here are a preview, never written back to the DNA itself.
Pin Type Description
Mesh Mesh The DNA's mesh at this LOD with the stored control values applied: blendshapes summed then skinned by the evaluated joints. Vertex-identical to DNA To Mesh at the same LOD.
Bones Bone Selection The joints these control values actually move.

Settings

Setting Type Description
Control Values List of MMDNAGUI Control Value Sparse: only controls the user has moved off zero. Writable by the in-app agent but hidden from the ordinary properties rows; the board above is its real editor. Stays in undo and in presets - the values are the pose.
LOD Index Whole number Which LOD to pose. 0 is the densest. Also the rig's own LOD argument, so a lower LOD both simplifies the mesh and mutes any correctives that do not exist below their authored LOD.
Apply Blendshapes True/False
Apply Joints True/False

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph › MetaHuman DNA

Transfer DNA Rig

Donates a rig - generic face expressions, RBF, twist/swing, joint behavior - from a template DNA onto a target DNA that already has its own geometry, skeleton and identity behavior, without rebuild...

Transfer DNA Rig node

The Transfer DNA Rig node

When to use it

Donates a rig - generic face expressions, RBF, twist/swing, joint behavior - from a template DNA onto a target DNA that already has its own geometry, skeleton and identity behavior, without rebuilding it from a mesh. The same transfer Create DNA's own Scaffold Rig option runs, as its own node - use this to (re-)donate a rig onto a DNA you already have.

How to use it

  1. 1

    Wire the DNA that should receive the rig into Target DNA (it keeps its own geometry/skeleton/neutrals - only rig layers are donated onto it)

  2. 2

    Wire the rig donor into Template DNA

  3. 3

    Optionally turn on Retarget Values to also convert the donated values so a target joint sitting in a different local frame than its template counterpart still gets a correct rig - off is the existence-only transfer, byte-identical to what Create DNA's own Scaffold Rig has always shipped

  4. 4

    Edit Bone Mapping if the target's bone names do not match the template's (prefilled automatically; Auto-Map / Clear force a full re-map / empty it)

  5. 5

    Press Transfer Now

Pins

Pin Type Description
TargetDNA DNA The DNA to receive the rig. Keeps its own geometry, skeleton, skin weights and neutral joint poses unchanged - only rig layers are donated onto it.
TemplateDNA DNA The rig donor.
Pin Type Description
DNA DNA The target DNA with the rig transferred in. Empty until Transfer Now succeeds - never a partial file.

Settings

Setting Type Description
Retarget Values True/False False (the default): the existence-only transfer, byte-identical to what Create DNA's own Scaffold Rig has always shipped. true: also converts a kept row's numbers via per-(joint,control) quaternion conjugation.
Translation Scale Mode Choice
Frame Delta Tolerance Deg Number Both the rotation and translation frame deltas within this many degrees of identity for a joint → that joint's rows copy byte- identical, skipping conversion entirely ("frames identical" in Report).
Axis Snap Tolerance Deg Number A scale conversion's implied axis permutation must land within this many degrees of a signed coordinate axis to snap exactly - also used to snap a twist/swing/RBF-solver TwistAxis.
Linearization Warn Deg Number Per rotation column, a measured error above this many degrees gets a Report line.
Linearization Error Deg Number Above LinearizationErrorDeg, an Info badge names the joint.
Create Missing Rotation Rows True/False When a rotation component's converted value has no existing row to write into and clears Row Create Epsilon, insert a new row for it adjacent to the joint's own sibling row instead of dropping it.
Row Create Epsilon Number A synthesized rotation row's converted magnitude (degrees) must exceed this to be worth creating at all.
Bone Mapping List of MMDNA Bone Map Row Which target bone a template joint donates its rig to, keyed by template joint. Identical contract to both Create DNA nodes' BoneMapping - see Create DNA's own Bone Mapping property.

Learn more

Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses
Modify DNA bone expressionsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-meta-human-dna-bone-expressions-with-mesh-morpher
Custom DNA topologyRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/custom-dna-topology-with-mesh-morpher-graph

Studio and Graph

Geometry

  • Append Geometry: Merges a second mesh into the first and brings its material slots along, with a choice of how the added geometry picks up skin weights.
  • Remove Geometry: Deletes the masked triangles and cleans up after itself, tidying the skin weights.
  • Subdivide: Adds density by splitting triangles, curving the new points to follow the surface. Paint a weight map to only split part of the mesh.
  • OpenSubdiv: Smooths a mesh by subdividing it, the same way a subdivision surface works in a modelling package.
  • Remesh: Rebuilds the surface out of evenly sized triangles at a length you pick. Reach for it when a sculpt or a scan has left stretched, tangled geometry that fights every deformer you put after it.
  • Stitch: Pulls the open border of one mesh onto the open border of another so the two meet with no gap between them. Only the first mesh moves.
  • Blend: Slides a mesh part way toward a second shape, with an optional weight map to limit where it happens. Both meshes need the same vertex count.
  • Weld: Stitches open edges back together wherever two vertices sit almost on top of each other, closing splits and seams left by an import or a cut.
  • Recompute Normals: Rebuilds the normals from the shape the mesh is in now. Drop it in after anything that moved vertices, when the shading has stopped matching the surface.
  • Replace Geometry: Swaps everything on one material slot for a different piece of geometry, then re-weights the new part off the mesh it landed in. Change a head, a hand or a plate of armour without touching the rest.
  • Delta Mush (Experimental): Cleans up the crumpling and volume loss that skinning leaves around joints, then puts the sculpted surface detail back by reading it off the rest pose.
  • Change Attribute Domain (Vertex ↔ Triangle): Moves a stored value between per-vertex and per-triangle, combining values by average, area-weighted average, minimum or maximum.
  • Convert To Static Mesh: Builds a static mesh out of the incoming mesh so nodes that expect one can take it. The result is rebuilt each time the graph loads rather than saved to disk.
  • Fix Intersections: Pushes vertices apart until the mesh stops passing through itself, or through a collision surface you wire in.
  • Generate LODs: Builds a whole LOD chain from one mesh in a single step, keeping UV islands, material sections and polygroups intact at every level.
  • Get Attribute: Pulls a named value stored on the mesh back out as a weight map, so masks, blends and weight-map math can get at it. The dropdown lists whatever the connected mesh is actually carrying.
  • Guided Delta Mush: Relax the noisy parts of a scan and leave everything else bit-for-bit alone.
  • Primitive: Builds a box, sphere, plane, disc, cylinder, cone, capsule or torus from numbers alone, with UVs and normals already set up. Nothing to wire in, and sizes are in world units.
  • Retopologize: Rebuild a dense scan or sculpt as clean quads. Draw strokes on the surface to say which way the edge loops should run, let the field settle, then press Accept.
  • Set Attribute: Stores a named number on every vertex or triangle: one constant, or per-vertex values from the Weights input.
  • Simplify: Cuts a dense mesh down to a triangle or vertex count you pick, leaving its UV islands, material sections and polygroups where they are. Press Simplify to run it.
  • Transfer Attribute: Copies a stored value from the Source mesh onto the Target mesh, matching vertex for vertex when the counts agree and by proximity when they do not. The node tells you which of the two it used.
  • Wrangle: The escape hatch. Write a short program and it runs once per vertex, per triangle, per corner, per texel, or once for the whole mesh. When no node does the thing you want, this does.
  • Language and control flow: Statements, operators, types, loops and your own functions.
  • Channels and attributes: P, N, uv, Cd and the rest, per domain, plus the @attributes you name yourself and the mesh-wide constants.
  • Parameters: The inputs you declare on the node: floats, vectors, weight maps, ramps, transforms and deltas.
  • Scalar and vector functions: Maths on numbers and on vectors, plus the integer and debug helpers.
  • Noise: Deterministic simplex noise: the same input gives the same value on every run and every machine.
  • Neighbours, transforms and distance: Walking the one-ring, moving points and frames around, and geodesic distance across the surface.
  • Donor mesh pins: Reading a second mesh by pin name: positions, normals, attributes, nearest points and ray hits.
  • Textures and landmarks: Sampling a Texture pin, and reading or writing a Landmarks pin.
  • MetaHuman DNA: Reading a MetaHuman DNA by pin name from the expression: joints, meshes, blend shapes, controls and skin weights.
  • Run modes: Texel and Corner: What one run corresponds to in the two per-element modes that are not Vertex or Triangle, and what each one may touch.
  • Run mode: Detail: The mode that runs once for the whole mesh, and the only one that may add or remove geometry.
  • Arrays: Growable lists of floats or vectors, local to one run of the expression.
  • Skin weights and viewport: Reading and writing the mesh's real skin weights, and drawing debug geometry in the viewport.
  • Python stage: The #@python blocks in the code editor: when they run, what they can reach, and how they hand values to the expression.
  • Python API: Everything on the mm object, plus the mm.ui buttons and labels a script can declare.
  • Examples: The ready-made recipes the code editor's own Examples menu inserts, expression and Python side by side.

Studio and Graph › Geometry

Append Geometry

Clothing, a prop, a repaired patch. This merges a second mesh into the first and handles the awkward parts on the way: skin weights, skeleton merging, material slot remapping.

Append Geometry node

The Append Geometry node

When to use it

Clothing, a prop, a repaired patch. This merges a second mesh into the first and handles the awkward parts on the way: skin weights, skeleton merging, material slot remapping.

How to use it

  1. 1

    Connect the base mesh and the mesh to append

  2. 2

    Pick how the added geometry gets its weights

  3. 3

    The output is the combined mesh

Pins

Pin Type Description
Mesh Mesh The mesh you are adding to. It keeps its own skeleton and weights.
Target Mesh The geometry being added. It gets moved onto the first mesh's skeleton.
Pin Type Description
Mesh Mesh Both meshes as one, carrying the material slots from each.

Settings

Setting Type Description
Append Weights Method Choice How the added geometry gets its skin weights: none at all, rigidly bound to one bone, transferred off the base mesh, or by merging the two skeletons together.
Weight Boundary Vertex Threshold Number Open-edge vertices on the added geometry that land within this distance of a base-mesh vertex copy that vertex's weights exactly, so the seam does not tear open when the rig moves. Set to 0 to skip the pass.
Parent Bone Text Every vertex of the added geometry is bound to this one bone at full weight. Good for props, armour plates, anything that should ride along without deforming.
Use Target Main Skeleton True/False Merge into the added mesh's skeleton instead of the base mesh's, so its bone order and hierarchy win.
Transfer By UV Match True/False Match vertices by UV rather than by distance. Worth turning on when both meshes share a UV layout - it does not get confused in places where two surfaces almost touch.
Radius Percentage Number How far a vertex looks for weights, as a fraction of the added mesh's bounding box diagonal. Anything further away is ignored, and those vertices get filled in by the smoothing pass instead. Set it to -1 to search the whole mesh.
Normal Threshold Number Throw away a match when the two normals point more than this many degrees apart. Keeps the inside of a sleeve from grabbing weights off the arm underneath it. Set it to -1 to ignore normals entirely.
Layered Mesh Support True/False Retry with the normal flipped when a match fails the angle test above. Turn this on for clothing that hugs a body, where the inner and outer surfaces sit close together and face opposite ways.
Smoothing Iterations Whole number Smoothing passes over the vertices that found no match and had their weights filled in. More passes soften the join into the transferred area.
Smoothing Strength Number How far each smoothing pass pulls a filled-in weight toward its neighbours.
Max Bone Influences Whole number Most bones any single vertex may be weighted to. Drop it to whatever limit your engine or exporter expects.

Studio and Graph › Geometry

Remove Geometry

Deletes the triangles the connected selection marks, rebuilding skin weights and material slots so what is left is still a usable asset. Cropping a scan, dropping an unwanted accessory, cutting a r...

Remove Geometry node

The Remove Geometry node

When to use it

Deletes the triangles the connected selection marks, rebuilding skin weights and material slots so what is left is still a usable asset. Cropping a scan, dropping an unwanted accessory, cutting a region out before a replacement gets appended.

Watch Selection Threshold. The selection arrives as per-vertex weights, and this is where a vertex starts counting as selected. Too low and the cut creeps out into the soft edge of your paint. Too high and nothing goes at all.

Holes where you wanted a clean edge are normal. Follow with Fill Holes or Stitch Mesh.

How to use it

  1. 1

    Connect the mesh and a triangle selection

  2. 2

    Click Apply to remove the selected geometry

Pins

Pin Type Description
Mesh Mesh The mesh to cut geometry out of.
Weights Weight Map Marks what to delete. Any triangle touching a vertex above Selection Threshold goes.
Pin Type Description
Mesh Mesh What is left.

Settings

Setting Type Description
Selection Threshold Number The weight a vertex has to beat before the triangles around it get deleted. A painted mask fades off gradually, but a triangle either goes or it stays, so this is where that soft edge turns into a hard yes or no. At 0, any vertex with any paint on it counts, which usually takes more of the surrounding surface than you meant.

Studio and Graph › Geometry

Subdivide

Splits every triangle to raise resolution, with optional smoothing and reprojection back onto the original surface so the detail does not get rounded off. Good when you need more vertices for a def...

Subdivide node

The Subdivide node

When to use it

Splits every triangle to raise resolution, with optional smoothing and reprojection back onto the original surface so the detail does not get rounded off. Good when you need more vertices for a deformation or a bake and want to keep the existing vertex layout, skin weights and morph targets.

For proper Catmull-Clark smoothing of a low-poly cage, that is OpenSubdiv. For even triangle sizes rather than more of the same triangles, Remesh.

Levels multiply. Each one quadruples the triangle count, so level 3 on a 500k mesh is 32 million triangles and no amount of patience will save you.

Press Subdivide Mesh. Nothing subdivides on a wire change.

How to use it

  1. 1

    Connect the source mesh

  2. 2

    Set the subdivision level and the smoothing options

  3. 3

    Click Subdivide Mesh

Pins

Pin Type Description
Mesh Mesh The mesh to add density to.
Weights Weight Map Paint here to split only part of the mesh. Leave it empty and the whole thing gets split.
Pin Type Description
Mesh Mesh The mesh with the extra triangles in it.

Settings

Setting Type Description
Selection Threshold Number The weight a vertex has to beat before the triangles around it get split. A painted mask fades off gradually, but a triangle is either split or it is not, so this is where that soft edge turns into a hard yes or no. At 0, any vertex with any paint on it counts.
Normal Threshold Number How far a triangle's facing may differ from the vertex being snapped back onto the original before it is ruled out as a landing spot. 0.5 works out to 90 degrees, 0 turns the check off. Keeps the inside of a sleeve from landing on the arm underneath it.
Skip Material Matching True/False Let a vertex snap back onto any triangle, whatever material it belongs to. Leave it off and each part stays on its own material, which is what you want where two materials meet along a seam.
Ignore Boundary Vertices True/False Hold open borders still while smoothing, so the outline of the mesh does not creep inward.
Smoothing Type Choice How the new vertices are relaxed once the splitting is done.
Smooth Speed Number How far each vertex slides toward its neighbours after the split. Set it to 0 to skip smoothing entirely.
Enable Reproject True/False Pull the new vertices back onto the shape of the original mesh after smoothing. Turn it off and the surface deflates a little, since smoothing shaves off the form.
Projection Quality Whole number How many times the reference copy of the original is split before the new vertices are snapped onto it. 0 snaps onto the mesh exactly as it came in. 2 or 3 is plenty; past that you are paying memory and time for nothing.
Subdivision Level Whole number How far to split. Level 1 gives you four triangles for every one you had, and each step after that multiplies again, so 3 on an already dense mesh will bring things to a crawl.
Flat True/False Split the triangles flat, leaving the surface exactly where it was. Off, the new points bulge out to follow the curve of the surface, which is what you usually want.
Junction Threshold Number Only matters when you subdivide part of a mesh. Along the border of the painted area, a new vertex this close to one that is already there is left alone instead of splitting the neighbouring edge.
Merge Vertex Tolerance Number How close two vertices have to be for the seam between the subdivided patch and the rest of the mesh to weld shut. Too small and you are left with a crack running around the edge of the painted area.

Studio and Graph › Geometry

OpenSubdiv

Subdivides mesh geometry with Pixar's OpenSubdiv, producing a smoother surface at a higher polygon count. This is the node for proper Catmull-Clark smoothing of a low-poly cage.

OpenSubdiv node

The OpenSubdiv node

When to use it

Subdivides mesh geometry with Pixar's OpenSubdiv, producing a smoother surface at a higher polygon count. This is the node for proper Catmull-Clark smoothing of a low-poly cage.

For more triangles without the smoothing, use Subdivide. For even triangle sizes rather than more of the same triangles, use Remesh.

Each level multiplies the triangle count around fourfold, so 5 or 6 on an already dense mesh will bring things to a crawl.

How to use it

  1. 1

    Connect the input mesh

  2. 2

    Set the subdivision level

    Higher means more polygons.

  3. 3

    Click Apply to subdivide

Pins

Pin Type Description
Mesh Mesh The mesh to subdivide.
Subdivision Level Whole Number Drives the subdivision level from the graph. Leave it empty to use the value in the panel. Held to 1-6 either way.
Pin Type Description
Mesh Mesh The denser, smoother mesh.

Settings

Setting Type Description
Subdivision Level Whole number How many times to subdivide. Each level multiplies the triangle count around fourfold, so 5 or 6 on an already dense mesh will bring things to a crawl.
Scheme Choice Which subdivision rule to use. Catmull-Clark for the usual smooth result, Loop when the mesh is all triangles.

Studio and Graph › Geometry

Remesh

Rebuilds the surface with evenly sized triangles at a target edge length. When a mesh has to deform well under a sculpt, a wrap or delta mush, and its triangles are wildly uneven, this is the fix.

Remesh node

The Remesh node

When to use it

Rebuilds the surface with evenly sized triangles at a target edge length. When a mesh has to deform well under a sculpt, a wrap or delta mush, and its triangles are wildly uneven, this is the fix.

Pins

Pin Type Description
Mesh Mesh The mesh to rebuild.
Weights Weight Map Optional mask limiting where the rebuild happens. Leave it empty and the whole mesh is rebuilt.
Target Edge Length Number Drives the target edge length from the graph. Leave it empty to use the value in the panel.
Pin Type Description
Mesh Mesh The rebuilt mesh, with triangles close to your target edge length.

Settings

Setting Type Description
Selection Threshold Number The weight a vertex has to beat to count as part of the region being rebuilt. A painted mask fades off gradually, but a triangle is either rebuilt or it is not, so this is where that soft edge turns into a hard yes or no. At 0, any vertex with any paint on it counts.
Smoothing Type Choice How the new vertices are relaxed as the mesh rebuilds.
Smooth Speed Number How hard each pass relaxes the new vertices. Set it to 0 to skip smoothing entirely.
Enable Reproject True/False Pull the rebuilt surface back onto the original shape as it goes. Turn this off and the mesh slowly deflates, because every pass of smoothing shaves a little more off the form.
Projection Quality Whole number How many times the reference copy of the original is split before the rebuilt mesh is snapped back onto it. 0 snaps onto the mesh exactly as it came in. 2 or 3 is plenty; past that you are paying memory and time for nothing.
Inline Project True/False Snap vertices back to the original the moment they move, rather than once per pass at the end. Slower, since it cannot run across threads, but it stops the surface wandering on shapes with tight folds.
Remesh Iterations Whole number How many passes to run. More passes even the triangles out further, and each one costs time.
Target Edge Length Number The edge length to aim for, in world units. A sensible starting value is measured off the mesh when you connect it. Halving this roughly quadruples the triangle count.
Constrain To Selection Interior True/False Keep the rebuild strictly inside the masked region and leave its border alone. Turn it off to let the work spill outward and blend into the triangles around it.
Remeshing Exterior Region Width Whole number How many rings of triangles beyond the mask get pulled in when the rebuild is allowed to spill over. Only does anything with the setting above turned off.
Allow Flips True/False Let the remesher swap the shared edge of two triangles. It evens the mesh out, but crisp edge lines get chewed away in the process.
Allow Splits True/False Let the remesher split edges that are longer than the target.
Allow Collapses True/False Let the remesher collapse edges that are shorter than the target.
Preserve Sharp Edges True/False Hold the mesh's seams instead of collapsing or smoothing across them, so hard edges and UV island borders survive the rebuild.
Prevent Normal Flips True/False Refuse any edit that would turn a triangle inside out. Off, you get black patches where a few faces ended up facing backwards.
Prevent Tiny Triangles True/False Refuse edits that would leave needle-thin slivers behind. Those read as speckled shading and give trouble to everything downstream.
Reproject Constraints True/False Snap vertices on locked borders back onto the original border curve, so a boundary keeps its exact shape instead of gradually cutting the corners off.
Boundary Corner Angle Threshold Number How sharp a turn in a border has to be before it counts as a corner. Corners get pinned once Reproject Constraints is on, so lower this when corners are still being rounded away.
Mesh Boundary Choice What may happen to open edges: Fixed leaves them exactly as they are, Refine only splits them, Free lets them move.
Group Boundary Choice What may happen to the edges between polygroups. Ignore drops the border entirely and lets triangles cross it.
Material Boundary Choice What may happen to the edges between material sections. Anything other than Fixed lets a section border drift, which shows up as one material creeping onto the wrong part of the model.

Studio and Graph › Geometry

Stitch

Joins two open boundaries into one continuous surface by matching border vertices, either by weights or by proximity. The step after Append Geometry or Replace Geometry when the pieces have to beco...

Stitch node

The Stitch node

When to use it

Joins two open boundaries into one continuous surface by matching border vertices, either by weights or by proximity. The step after Append Geometry or Replace Geometry when the pieces have to become one skin for sculpting, wrapping or a watertight export.

How to use it

  1. 1

    Connect two meshes with matching boundaries

  2. 2

    Pick the stitching method, weights or proximity

  3. 3

    The output is the stitched mesh

Pins

Pin Type Description
Mesh Mesh The mesh whose open border moves.
Target Mesh The mesh that stays put. The first mesh's border lands on this one's.
Weights Weight Map Paint here to stitch only part of the border. Leave it empty and the whole border is fair game.
Pin Type Description
Mesh Mesh The first mesh with its border sitting on the target's. Nothing is added or deleted, the border vertices just move.

Settings

Setting Type Description
Selection Threshold Number The weight a vertex has to beat before its part of the border gets stitched. A painted mask fades off gradually, but a triangle is either in or out, so this is where that soft edge turns into a hard yes or no. At 0, any vertex with any paint on it counts.
Stitching Type Choice How a border vertex finds its partner on the other mesh: by skin weights, or by distance.
Use Edge Closest Point True/False Land each vertex on the nearest point along the other border's edges instead of right on top of the vertex it matched. Keeps the seam smooth when the two borders have different vertex counts.
Weight Threshold Number How far apart two sets of skin weights may be and still count as a match. Too low and nothing pairs up, so the border sits exactly where it was.
Vertex Threshold Number How far a border vertex may reach to find its partner. Too far and it grabs the border on the other side of the opening, folding the edge back over itself.

Studio and Graph › Geometry

Blend

The cheapest way to dial a shape halfway. It interpolates vertex positions between two meshes that share vertex count and order. Push Alpha past 1, or below 0, and you exaggerate or reverse the cha...

Blend node

The Blend node

When to use it

The cheapest way to dial a shape halfway. It interpolates vertex positions between two meshes that share vertex count and order. Push Alpha past 1, or below 0, and you exaggerate or reverse the change instead.

Connect a WeightMap to make the blend local. Each vertex's effective alpha becomes Alpha * WeightMap[vertex], which is how you take a nose from one head and nothing else.

A vertex count mismatch blends unrelated vertices into a scrambled mesh rather than erroring somewhere you would see it.

If nothing seems to happen, check that the weight map is not all zero. A disconnected or wrongly sized map is the usual cause, not the alpha.

How to use it

  1. 1

    Connect two meshes with matching topology

  2. 2

    Adjust Alpha to control the blend amount

  3. 3

    Optionally connect a WeightMap for per-vertex masking

  4. 4

    The output is the interpolated mesh

Pins

Pin Type Description
Mesh Mesh The shape you start from. Alpha 0 leaves it untouched.
Target Mesh The shape to move toward. Same vertex count and order as Mesh, or the node stops.
WeightMap Weight Map Optional mask. Nothing moves where the weight is 0, full blend where it is 1.
Pin Type Description
Mesh Mesh The blended shape.

Settings

Setting Type Description
Alpha Number How far to travel: 0 leaves the source shape alone, 1 lands exactly on the target. Negative values run the move backwards, pulling away from the target.

Studio and Graph › Geometry

Weld

Hairline gaps between vertices are what make a mesh non-manifold and break every boolean, remesh and watertight export downstream. This merges anything within a tolerance and closes them.

Weld node

The Weld node

When to use it

Hairline gaps between vertices are what make a mesh non-manifold and break every boolean, remesh and watertight export downstream. This merges anything within a tolerance and closes them.

How to use it

  1. 1

    Connect the mesh with the open edges

  2. 2

    Set the merge tolerance

  3. 3

    The output is the welded mesh

Pins

Pin Type Description
Mesh Mesh The mesh with the splits you want closed.
Pin Type Description
Mesh Mesh The welded mesh. Normals come back fully smooth, so any hard edges you had will need setting again.

Settings

Setting Type Description
Weld Per Section True/False Weld inside each material section on its own, so the borders between sections stay split. Off welds straight across the whole mesh.
Merge Vertex Tolerance Number Two edges only merge when both pairs of end vertices sit closer than this. Push it too high and edges that were never meant to meet get pulled together, so a sleeve fuses to the arm it rests on.
Merge Search Tolerance Number How far apart two edge midpoints may be before the node stops treating them as a possible pair. Keep it a little above the vertex tolerance.
Only Unique Pairs True/False Only merge where exactly one candidate matches. Turn it on when three or more surfaces meet along the same line and the weld keeps grabbing the wrong partner.

Studio and Graph › Geometry

Recompute Normals

Recalculates the mesh's normals so lighting matches the geometry again. Drop it after anything that moved vertices without maintaining them: a deltas apply, a wrap, a stream, a hand-written Wrangle.

Recompute Normals node

The Recompute Normals node

When to use it

Recalculates the mesh's normals so lighting matches the geometry again. Drop it after anything that moved vertices without maintaining them: a deltas apply, a wrap, a stream, a hand-written Wrangle.

The sculpt and deformer nodes already do this for you, so an extra one there costs time and fixes nothing.

If a mesh still renders with black or inside-out patches after this node, normals were not the problem. Look for inverted triangle winding from Fix Symmetry or an importer axis flip, or a material with an unset normal parameter.

Pins

Pin Type Description
Mesh Mesh The mesh whose normals need rebuilding. Hard edges and smoothing splits are kept.
Pin Type Description
Mesh Mesh The same mesh with fresh normals.

Studio and Graph › Geometry

Replace Geometry

Swaps the triangles of one material slot for geometry from a second mesh, re-transferring skin weights and remapping materials so the result stays rigged and shaded. A new head on the same body, a ...

Replace Geometry node

The Replace Geometry node

When to use it

Swaps the triangles of one material slot for geometry from a second mesh, re-transferring skin weights and remapping materials so the result stays rigged and shaded. A new head on the same body, a higher-detail hand.

The slot is named rather than selected because a material slot is the stable handle for "this part". When the region is not cleanly one slot, Remove Geometry plus Append Geometry does the same job by hand.

Expect a seam. The replacement's border rarely lands exactly on the original's, so follow with Stitch Mesh or Weld Mesh, and check the weight transfer around the join before you animate anything.

How to use it

  1. 1

    Connect the source mesh and the replacement geometry

  2. 2

    Name the material slot and configure the weight transfer

  3. 3

    Click Apply to replace the geometry

Pins

Pin Type Description
Mesh Mesh The mesh being changed. Pick the slot to swap out in Material Name.
Target Mesh The new geometry going in. Line it up with the part it is replacing before you run this.
Pin Type Description
Mesh Mesh The mesh with that slot swapped out for the new geometry.

Settings

Setting Type Description
Material Name Text Which material slot gets replaced. Every triangle using it is deleted and the incoming geometry takes its place.
Replace Weights Method Choice How the replacement geometry gets its skin weights: none at all, rigidly bound to one bone, or transferred off the mesh it is going into.
Parent Bone Text Every vertex of the replacement is bound to this one bone at full weight. Good for rigid parts like a helmet or a shoulder plate.
Radius Percentage Number How far a vertex looks for weights, as a fraction of the replacement's bounding box diagonal. Anything further away is ignored, and those vertices get filled in by the smoothing pass instead. Set it to -1 to search the whole mesh.
Normal Threshold Number Throw away a match when the two normals point more than this many degrees apart. Keeps the inside of a sleeve from grabbing weights off the arm underneath it. Set it to -1 to ignore normals entirely.
Layered Mesh Support True/False Retry with the normal flipped when a match fails the angle test above. Turn this on for clothing that hugs a body, where the inner and outer surfaces sit close together and face opposite ways.
Smoothing Iterations Whole number Smoothing passes over the vertices that found no match and had their weights filled in. More passes soften the join into the transferred area.
Smoothing Strength Number How far each smoothing pass pulls a filled-in weight toward its neighbours.
Max Bone Influences Whole number Most bones any single vertex may be weighted to. Drop it to whatever limit your engine or exporter expects.

Studio and Graph › Geometry

Delta Mush (Experimental)

Smooths a deformed mesh while keeping its original surface detail. The usual job is fixing the crumpling and volume loss that linear skinning leaves at elbows, shoulders and knees.

Delta Mush (Experimental) node

The Delta Mush (Experimental) node

When to use it

Smooths a deformed mesh while keeping its original surface detail. The usual job is fixing the crumpling and volume loss that linear skinning leaves at elbows, shoulders and knees.

It needs both poses: the deformed mesh on Mesh and the same mesh at rest on RestPose. The smoothing happens on the deformed shape, and the detail is read back off the rest pose, which is why the two must share vertex count and order.

Connect a WeightMap to make the correction local. Each vertex's result is blended between its original deformed position and the Delta Mush result by that weight, so you can keep the fix on the joints and off the face.

For a whole animation rather than one pose, Delta Mush Animation bakes the same correction into morph targets the sequence drives.

How to use it

  1. 1

    Connect the rest pose and the deformed mesh

  2. 2

    Configure the smoothing and detail settings

  3. 3

    Optionally connect a WeightMap for per-vertex masking

  4. 4

    Click Apply to smooth the mesh

Pins

Pin Type Description
Mesh Mesh The posed mesh, with whatever pinching and collapse the skinning left behind.
RestPose Mesh The same mesh in its rest pose. The surface detail is read from here, so the vertex count and order must match.
WeightMap Weight Map Optional mask. Scales the correction, so you can keep it on the elbows and off the face.
Pin Type Description
Mesh Mesh The posed mesh with the smoothing applied.

Settings

Setting Type Description
Iterations Whole number How many smoothing passes run over the mesh. More passes clean up worse collapsing, at the cost of time, and thin shapes start to shrink unless Edge Preservation is up.
Weight Type Choice How a vertex is weighted against its neighbours while smoothing. Inverse Distance: safest around fingers, joints and anything thin. Avoids the pinching Cotangent can cause. Cotangent: the usual pick for smooth organic surfaces with tidy triangles. Mean Value: holds together on meshes with badly shaped triangles. Uniform: every neighbour counts the same. Fast, but blind to the shape of the surface.
Setting Type Description
Amount Number How much of the original surface detail comes back once the smoothing is done. At 0 you keep the smoothed blob. At 1 the pores, folds and seams return in full.
Frame Smoothing Whole number Smoothing passes over the local frame each detail offset rides on. Raise it when the restored detail shimmers or jitters as the pose moves. 0 turns it off.
Setting Type Description
Inward Number How far vertices may move inward, toward the middle of the mesh. Pull it down when armpits and the backs of knees cave in on themselves. 0 blocks inward motion outright.
Outward Number How far vertices may move outward, away from the middle of the mesh. Pull it down when the smoothing starts inflating shoulders and knuckles. 0 blocks outward motion outright.
Setting Type Description
Edge Preservation Number Limits how far a vertex can slide in toward the middle of its neighbours, which is what stops fingers, horns and antennae shrivelling into sticks. At 0 edges are free to shorten; at 1 they keep their length. Once you run past 100 iterations, 0.3 to 0.7 is the useful range.
Setting Type Description
Iterations Whole number Passes that stop the restored detail creeping across the surface as the pose changes, which reads on screen as the texture sliding over the skin. 0 turns it off.
Stiffness Number Trades detail against sliding correction. 0 corrects the most and softens fine detail. 1 keeps every last detail and corrects nothing.
Setting Type Description
Iterations Whole number Spreads the effect outward from the parts that actually deformed, so it fades away instead of stopping at a visible line across the limb. 0 leaves that line.
Decay Number How fast that spread runs out. Low values keep the effect tight around the joint, high values carry it further down the limb.
Setting Type Description
Angle Threshold Number Surfaces twisted further than this from their rest orientation get an extra round of smoothing. Aimed at the hard cases, like a wrist rolled almost the whole way over.
Iterations Whole number Extra smoothing passes, applied only to those heavily twisted areas.
Setting Type Description
Preserve Boundaries True/False Ease off the smoothing along open edges so the mesh does not creep back from its border. Worth turning on for a cut-out piece like a shirt or a face patch.
Weight Number How firmly those open edges are held. 0 smooths them like anywhere else, 1 pins them in place.

Learn more

Delta Mush in Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/delta-mush-in-mesh-morpher-graph

Studio and Graph › Geometry

Change Attribute Domain (Vertex ↔ Triangle)

The fourth verb of the attribute model: the value is already on the mesh, but it is stored on the wrong thing. This node converts a named attribute between per-vertex and per-triangle storage.

Change Attribute Domain node

The Change Attribute Domain node

When to use it

The fourth verb of the attribute model: the value is already on the mesh, but it is stored on the wrong thing. This node converts a named attribute between per-vertex and per-triangle storage.

Reach for it when a Wrangle refuses a cross-domain read (its error names this node), when a per-triangle value has to become a mask, or when a per-vertex mask has to become a per-face classification.

The averaging rule is the whole node. Vertex to triangle: each triangle combines its three corner values. Triangle to vertex: each vertex combines the triangles in its one ring. Same domain: a straight copy, and the rule is not consulted.

Combine Using is the setting people get wrong. Area weighting only does anything for triangle-to-vertex - going the other way all three corners belong to the same triangle and carry the same area, so area-weighted is identical to plain Average. Going triangle-to-vertex it matters a lot: on an irregular mesh a plain average lets a sliver triangle count as much as the large one beside it. And for ids or category indices, averaging is the wrong question entirely - Minimum and Maximum exist for that.

Pins

Pin Type Description
Mesh Mesh The mesh carrying the value you want to convert.
Pin Type Description
Mesh Mesh The same mesh, now carrying the converted value.

Settings

Setting Type Description
Attribute Text Which stored value to convert. The dropdown lists what the incoming mesh carries, and its search box doubles as a text field while nothing is connected.
Write To (empty = same name) Text What the converted values get called. Leave it empty to replace the original in place, which is what you usually want. Give it a different name and you keep both.
Convert To Choice Whether the result ends up per vertex or per triangle.
Combine Using Choice How several values collapse into one. Area weighting only changes the answer going from triangles to vertices; the other way round it gives the same result as plain Average.

Studio and Graph › Geometry

Convert To Static Mesh

Rebuilds the incoming mesh as a real Static Mesh object and publishes its path, for the nodes and previews that want an engine asset rather than a mesh wire.

Convert To Static Mesh node

The Convert To Static Mesh node

When to use it

Rebuilds the incoming mesh as a real Static Mesh object and publishes its path, for the nodes and previews that want an engine asset rather than a mesh wire.

Writing back into the project asset the geometry came from is Bake Mesh. A result that needs a skeleton is Export To Skeletal Mesh.

The object is transient. It does not survive a graph reload on its own, and the node rebuilds it from the saved input instead. Press Convert, since nothing rebuilds on a wire change.

How to use it

  1. 1

    Wire a mesh into the Mesh input

  2. 2

    Click Convert

  3. 3

    Read the StaticMesh output

    Selecting the node previews the built mesh in the viewport.

Pins

Pin Type Description
Mesh Mesh The mesh to convert. Its material slots come across too.
Pin Type Description
StaticMesh Asset The built static mesh. Select the node to see it in the viewport.

Studio and Graph › Geometry

Fix Intersections

Pushes vertices back out of a surface they have gone through. With nothing wired into Target it works on the mesh against itself; with something wired in, it pushes out of that. Scope says which ex...

Fix Intersections node

The Fix Intersections node

When to use it

Pushes vertices back out of a surface they have gone through. With nothing wired into Target it works on the mesh against itself; with something wired in, it pushes out of that. Scope says which explicitly, rather than leaving it to whatever happens to be connected. Press Fix Intersections.

How to use it

  1. 1

    Wire the mesh into Mesh

    For poke-through, wire the body into Target.

  2. 2

    Optionally paint a Weights mask to limit the fix to a region

    0 freezes a vertex completely.

  3. 3

    Press Fix Intersections

    Read Intersections Before / After.

Pins

Pin Type Description
Mesh Mesh The mesh to fix. It passes straight through until you press Fix Intersections.
Target Mesh The surface to stay out of, like the body under a garment. Leave it empty and the mesh is fixed against itself instead.
Weights Weight Map Optional mask scaling how much of each pass a vertex takes. 0 pins it in place; values in between move it more gently rather than capping how far it can end up. Leave it empty and everything moves freely. Intersections that only frozen vertices could have cleared still get counted and reported.
Clearance Number Drives the clearance gap from the graph. Leave it empty to use the value in the panel.
MaxIterations Whole Number Drives the pass limit from the graph. Leave it empty to use the value in the panel.
Relaxation Number Drives the starting step size from the graph. Leave it empty to use the value in the panel.
Pin Type Description
Mesh Mesh The fixed mesh. Only vertex positions change, so UVs, skin weights and material sections all survive. With Require Full Resolution on, a run that could not finish sends the input back untouched.
Unresolved Weight Map Marks every vertex still caught in an intersection on the mesh that went out. Wire it into a mask to see exactly where. Empty after a clean run.
IntersectionsBefore Whole Number How many intersections the input had: triangle pairs passing through each other, plus vertices sitting inside the clearance gap on a Target run.
IntersectionsAfter Whole Number The same count on the mesh that actually went out. Zero after a clean run.

Settings

Setting Type Description
Scope Choice Which intersections to go after: the mesh against itself, against the Target, or both.
Clearance Fraction Number Size of the gap opened between the two surfaces, as a fraction of the mesh bounds diagonal, so the same number behaves the same on a 2 cm ear and a 200 cm body. Never set it to zero. Landing exactly on the other surface leaves the two flat against each other, which still counts as an intersection, and the solve then grinds away forever on something it cannot clear.
Max Iterations Whole number How many push-and-remeasure passes the run may spend. Every pass re-checks the whole mesh, so this sets the cost as much as the patience. Running out is reported as a failure, never dressed up as success.
Relaxation Number How much of each correction goes in per pass. 1.0 pushes the whole way and suits nearly every mesh. Lower it when several sheets are stacked in a deep fold and neighbouring pushes end up fighting each other. This is only the starting step - the solver halves it by itself whenever a pass fails to help.
Max Displacement Fraction Number Hard ceiling on how far any one vertex may end up from where it started, as a fraction of the bounds diagonal. This is what stops a runaway push from inflating the whole surface into a balloon. Vertices that hit the cap get clamped, counted and named in the report, so the run fails honestly instead of handing back a swollen mesh.
Smoothing Iterations Whole number Smoothing passes over the moved region, run only once the mesh is already clear, to take the faceting off the repaired patch. If re-measuring finds the smoothing put an intersection back, the whole polish is thrown away and the clean unsmoothed mesh goes out instead. So this can never be the thing that breaks the result. 0 skips it.
Smoothing Strength Number How far each moved vertex slides toward the average of its neighbours on each polish pass. Capped at 0.5, because past that a pass overshoots the average and amplifies the very ripple it is there to flatten.
Require Full Resolution True/False On, a run that cannot clear every intersection hands back your input untouched and fails with the counts. Off, it hands back the best partial result with a warning saying what is left. Partial is fine when the leftovers are three triangles in a crevice nobody will ever see. Make it your call though: a half-fixed mesh that looks fixed is how a garment ships with the hip poking through it.
Recompute Normals True/False Rebuild the shading normals before the mesh goes out. Vertices moved, and old normals read as a lighting seam running right along the repaired patch. Turn it off only when something further down the graph owns the normals.

Studio and Graph › Geometry

Generate LODs

Builds a whole LOD chain from one mesh and puts it on a mesh-array wire, the type Get Mesh Array Element and the exporters already speak. A row of Simplify nodes does the same job worse: here the b...

Generate LODs node

The Generate LODs node

When to use it

Builds a whole LOD chain from one mesh and puts it on a mesh-array wire, the type Get Mesh Array Element and the exporters already speak. A row of Simplify nodes does the same job worse: here the budgets stay in step, and every level is decimated from the original rather than from the level above it.

How to use it

  1. 1

    Connect the source mesh

  2. 2

    Choose a budget mode and how many levels you want

  3. 3

    Press Generate LODs

    The LODs pin carries the chain, level 0 first.

Pins

Pin Type Description
Mesh Mesh The mesh you want LODs for. It comes back as level 0 untouched, and every reduced level is cut from it rather than from the level above.
Levels Whole Number Drives how many reduced levels get built. Leave it empty to use the value in the panel. Percentage Per Level mode only.
Reduction Number Drives the percentage each level keeps of the one before it. Leave it empty to use the value in the panel. Percentage Per Level mode only.
Pin Type Description
LODs Mesh List The whole chain, full-detail level first. Feed it to Get Mesh Array Element to look at one level.
LevelCount Whole Number How many levels came out, counting the untouched source as one of them.
MissedBudgets Whole Number How many levels came out heavier than you asked for. Anything above 0 means the chain is denser than the numbers you typed.
Report Text What each level actually came out as, next to the budget it was given.

Settings

Setting Type Description
Budget Mode Choice How you want to state the size of each level: as a percentage step down, or as exact triangle counts.
Num Reduction Levels Whole number How many reduced levels to build. The chain that comes out is one longer than this, because your untouched source sits at the front of it.
Reduction Per Level Number Percentage of the level above that each reduced level keeps. 50 halves the triangles every step. Budgets are worked out from the source count, so one level falling short of its number cannot drag the rest of the chain off target.
Triangle Budgets Text Triangle count for each reduced level, in order. Commas, semicolons or new lines all work as separators, so "30000, 12000, 5000" is fine. Each number has to be lower than the one before it, and the first has to be under the source's triangle count. Anything else gets refused with an error naming the entry rather than quietly reordered behind your back.
Quality Choice What the reducer works hardest to hang on to as it collapses edges.
Preserve UVs True/False Lock every UV and normal seam so UV islands cannot be merged or torn open. This is what keeps a textured asset looking textured all the way down the chain.
Preserve Material Borders True/False Lock the edges where one material meets another so sections keep their exact borders. Locked edges never collapse, so this eats into how far each level can reduce, and the deepest levels are the ones that fall short first.
Preserve Group Borders True/False Lock the edges between polygroups. Costs you the same reduction headroom that material borders do.
Preserve Boundary True/False Lock open edges so a cut-out piece keeps the exact shape of its border, and the original vertex density along it. This is the single most common reason a deep level cannot reach its budget, so turn it off when the report points here.

Studio and Graph › Geometry

Get Attribute

The read-it-back half of "store a number on each vertex". Set Attribute, a Wrangle, or an importer put a named value on the mesh; this node pulls one component of it out as an ordinary per-vertex w...

Get Attribute node

The Get Attribute node

When to use it

The read-it-back half of "store a number on each vertex". Set Attribute, a Wrangle, or an importer put a named value on the mesh; this node pulls one component of it out as an ordinary per-vertex weight map.

That is the currency roughly a dozen nodes already accept - masks, blends, weight-map math, brush gates - which is why the output is a weight map rather than some new attribute pin type nothing downstream could eat.

Use it whenever data that arrived with a mesh has to start driving something. Use Transfer Attribute instead when the data has to move to a different mesh, and Change Attribute Domain when it has to move between vertices and triangles.

Attribute is a dropdown listing what the connected mesh actually carries, so there is nothing to remember and nothing to misspell. If a name is not offered, the mesh does not have it - wiring the node to the wrong upstream mesh is by far the most common cause.

Pins

Pin Type Description
Mesh Mesh The mesh that is carrying the stored value.
Pin Type Description
Mesh Mesh The input mesh, unchanged.
Weights Weight Map The chosen component, one number per vertex.

Settings

Setting Type Description
Attribute Text Which stored value to read. The dropdown lists what the incoming mesh carries, and its search box doubles as a text field while nothing is connected. Ask for a name the mesh does not have and the error tells you which names it does have, which is what you want when you have misspelled one.
Component Whole number Which component to read out. 0 is X. Clamped to however many the stored value actually has.
Combine Triangles By Choice How triangle values collapse onto vertices. Only used when the value is stored per triangle; ignored otherwise.

Studio and Graph › Geometry

Guided Delta Mush

Delta Mush with a per-vertex weight map for strength. Painted regions relax to nothing, unpainted regions come out bit for bit untouched. That selectivity is why it sits next to the plain Delta Mus...

Guided Delta Mush node

The Guided Delta Mush node

When to use it

Delta Mush with a per-vertex weight map for strength. Painted regions relax to nothing, unpainted regions come out bit for bit untouched. That selectivity is why it sits next to the plain Delta Mush node.

Local damage on a scan is this node's job, and the map can come from your hand or from Distortion Mask or Mesh Diff. Fixing skinning across a whole character, with a rest pose to work from, is the other node.

Detail Amount is the control that matters. At 0 you get pure Laplacian smoothing and the detail is gone. At 1 the surface is unchanged when there is no rest pose to take detail from. Wire a RestPose of the same vertex count and order to get classic detail-transfer Delta Mush.

Skin Sliding, Strain Falloff and Extreme Rotation are missing on purpose. All three measure how far a posed mesh has rotated or stretched from its rest pose, and the main mode here has no rest pose to measure against. When you have both poses and need them, use Delta Mush.

How to use it

  1. 1

    Wire the scan into Mesh

  2. 2

    Wire a Weights map into Weights - a painted mask, or the output of a Distortion Mask / Mesh Diff node so the relax follows the measurement

  3. 3

    Lower Detail Amount until the noise goes

    0 is plain smoothing; 1 changes nothing at all when no rest pose is wired.

  4. 4

    Press Apply

    Wire a rest pose into Rest Pose to get classic Delta Mush instead: the detail comes off the rest mesh and gets replayed on the smoothed input, which is the fix for skinning collapse at a joint. The two meshes need matching vertex count and order.

Pins

Pin Type Description
Mesh Mesh The mesh to relax. Passes straight through until you press Apply.
RestPose Mesh Optional rest-pose mesh with matching vertex count and order. Wired, you get classic Delta Mush: rest detail replayed on the smoothed input. Unwired, the mesh supplies its own detail and Detail Amount turns into a detail-retention dial.
Weights Weight Map Per-vertex strength, 0 to 1. A vertex at 0 is not moved at all. Leave it unconnected for full strength everywhere.
Iterations Whole Number Smoothing passes. Leave it unconnected to use the value in the details panel.
DetailAmount Number How much detail survives, 0 to 1. Leave it unconnected to use the value in the details panel.
Strength Number Global multiplier on the weights, 0 to 1. Leave it unconnected to use the value in the details panel.
Pin Type Description
Mesh Mesh The relaxed mesh. Only positions moved - vertex count, order and every attribute are untouched.

Settings

Setting Type Description
Iterations Whole number Smoothing passes used to build the relaxed reference. More passes reach further across the surface, so this decides how big a lump gets flattened, not how much of it goes. Detail Amount is the how-much. Stops at 2000. Every pass walks the whole mesh, and this value can be driven from the Iterations pin by any upstream Math node - a stray 1e8 arriving there does not make a slow run, it makes one that never finishes. The surface stops changing long before the cap.
Smooth Step Number How far a vertex slides toward its neighbours' average each pass. Capped at 1 because past that every pass overshoots and the surface blows up on any mesh with irregular vertex fans, which is every scan.
Weight Type Choice Which neighbour weighting the smoothing uses. Defaults to Uniform here, not Cotangent like the Delta Mush node, because a raw scan is made of obtuse triangles and cotangent weights go negative on those - a negative weight shoves a vertex away from its neighbours and amplifies the very noise you came here to remove.
Amount Number How much of the original fine detail goes back on after smoothing. 0 leaves you the smoothed surface with the detail gone. 1 puts all of it back, which with no Rest Pose wired is an exact no-op, because there is no other mesh to take detail from; with a Rest Pose, 1 is classic Delta Mush.
Frame Smoothing Whole number Extra smoothing over the per-vertex frames the detail rides in. Does nothing at all unless a Rest Pose is wired. With one, raising it calms detail jitter where the two smoothed surfaces disagree about which way the surface runs.
Inward Number How far the smoothing may push a vertex inward, against its normal. 0 stops nose tips and knuckles flattening out; 1 is unrestricted.
Outward Number How far the smoothing may push a vertex outward, along its normal. 0 stops eye sockets and nostrils filling in; 1 is unrestricted.
Edge Preservation Number Caps how far a vertex may move straight toward its neighbours' average: 0 is no protection, 1 blocks that direction entirely. Thin things - ear rims, eyelash cards, fingers - collapse in on themselves under hard smoothing because every pass pulls both sides together. This holds that back while sideways smoothing keeps working.
Preserve Boundaries True/False Ease off the smoothing at open borders. On by default: a border has no neighbours on one side, so every pass drags it inward and the mesh shrinks a little more.
Weight Number How hard the border is held. 1 pins it bit-for-bit where it started, 0 smooths it like everything else, and in between each pass pulls it back partway.
Strength Number Global multiplier on the per-vertex weights. With nothing wired into Weights, this is the strength, applied everywhere.

Studio and Graph › Geometry

Primitive

A shape built from numbers, with no input to wire. Box, sphere, plane, disc, cylinder, cone, capsule or torus, each arriving with proper per-face UVs, split normals (hard edges on a box, smooth on ...

Primitive node

The Primitive node

When to use it

A shape built from numbers, with no input to wire. Box, sphere, plane, disc, cylinder, cone, capsule or torus, each arriving with proper per-face UVs, split normals (hard edges on a box, smooth on a sphere) and polygroups, so it is ready for sculpting, CSG or anything else downstream.

This is where a graph starts when there is nothing to load: a blocking-in shape to sculpt on, a cutter for a boolean, a plane to project onto, a stand-in while you build the rest of the chain.

The details panel only shows the settings the shape you picked actually uses, so the long list below is never all on screen at once.

Pins

Pin Type Description
Mesh Mesh The shape you just built, with UVs, normals and named material sections.

Settings

Setting Type Description
Shape Choice Which shape to build. The panel only shows the settings that shape actually uses.
Pivot Choice Where the origin sits: the middle of the shape, or the bottom so it rests on the ground plane.
Location Vector Where the shape sits in the world, applied after the pivot choice. Changing a size or subdivision setting rebuilds the mesh and leaves this alone.
Polygroup Per Quad True/False Give every quad its own polygroup instead of one group for the whole shape. Useful when you want to select or mask single faces further down the graph.
Box Size Vector Box size along X, Y and Z, in world units.
Box Subdivisions Whole number Quads per edge on every axis.
Sphere Radius Number Radius in world units.
Sphere Slices Whole number Segments around the equator. Rows bunch up toward the poles on this sphere; if that pinching bothers you, switch to Sphere (Box).
Sphere Stacks Whole number Rings from pole to pole.
Sphere Box Radius Number Radius in world units.
Sphere Box Subdivisions Whole number Quads along each cube edge before it gets rounded off into a sphere. Quads stay evenly sized and there are no pinched poles, which makes this the better sphere to sculpt on.
Plane Width Number Size along X, in world units.
Plane Length Number Size along Y, in world units.
Plane Subdivisions Whole number Quads per edge in both directions.
Disc Radius Number Radius in world units.
Disc Slices Whole number Segments around the circumference.
Disc Rings Whole number Rings from centre to rim.
Cylinder Radius Number Radius in world units.
Cylinder Height Number Height along Z, in world units.
Cylinder Slices Whole number Segments around the circumference.
Cylinder Height Subdivisions Whole number Extra subdivisions along the height.
Cylinder Capped True/False Close off the two ends. Turn it off for an open tube.
Cone Base Radius Number Radius at the bottom, in world units.
Cone Top Radius Number Leave this at 0 for a pointed tip. Raise it and the tip flattens into a truncated cone.
Cone Height Number Height along Z, in world units.
Cone Slices Whole number Segments around the circumference.
Cone Height Subdivisions Whole number Extra subdivisions along the height.
Cone Capped True/False Close off the base, and the flat top as well once the top radius is above 0.
Capsule Radius Number Radius of the tube and of the two rounded ends, in world units.
Capsule Mid Length Number Length of the straight middle section. Total height comes out as this plus twice the radius.
Capsule Slices Whole number Segments around the circumference.
Capsule Hemisphere Steps Whole number Rings across each rounded end.
Capsule Mid Subdivisions Whole number Extra subdivisions along the straight middle section.
Torus Major Radius Number Distance from the centre of the ring out to the middle of the tube.
Torus Minor Radius Number Thickness of the tube. Push it past the major radius and the tube swallows the hole, leaving a self-intersecting blob.
Torus Major Slices Whole number Segments around the main ring.
Torus Minor Slices Whole number Segments around the tube itself.

Studio and Graph › Geometry

Retopologize

Paint direction strokes on the surface, solve, and extract a quad-dominant mesh whose edge flow follows what you painted. For topology that has to be animation-ready, or readable by another artist.

Retopologize node

The Retopologize node

When to use it

Paint direction strokes on the surface, solve, and extract a quad-dominant mesh whose edge flow follows what you painted. For topology that has to be animation-ready, or readable by another artist.

How to use it

  1. 1

    Wire a mesh into Mesh and select the node

    Setting up takes a few seconds on a heavy scan. A progress dialog shows while it works.

  2. 2

    Set Target Quad Count, or leave it at 0 for one quad per sixteen incoming vertices

  3. 3

    Drag strokes across the surface with the comb to say which way the loops should run

  4. 4

    Press Solve Orientation Field, then Solve Position Field

    Both keep refining until you press them again to stop.

  5. 5

    Press Accept to write the quad mesh out

    The flow lines and the grid stay hidden until you solve. Before that the field is still random and drawing it would only show noise. Your strokes and the solved field are saved with the graph, so reopening the document drops you back where you left off.

Pins

Pin Type Description
Mesh Mesh The mesh to rebuild. Usually a scan, a sculpt or a generated mesh that is far too dense to work with.
Target Quad Count Whole Number Wire a number here to drive the quad budget from the graph, so a whole LOD chain can run off one value. Leave it unconnected to use the details panel. 0 from either source means one quad per sixteen incoming vertices.
Pin Type Description
Mesh Mesh The quad mesh, once you press Accept. Empty until then.

Settings

Setting Type Description
Target Quad Count Whole number Roughly how many quads you want out. On a quad mesh the vertex count comes out about the same, so this doubles as a vertex budget. Expect to land within about 15 percent rather than on the number: the grid has to stay aligned to the flow, and that rules out hitting an exact count. 0 works it out from the input instead: one quad per sixteen incoming vertices. The resolved figure gets written back here so you can see what you got. Changing this rebuilds the field and solves it again.
Align To Boundaries True/False Make the quad grid run along open borders instead of wandering across them. Turn it on for anything with a mouth bag, eye sockets or a cut edge, or the loops drift off the rim and the border comes out ragged.
Sharp Creases True/False Pin quad edges onto the mesh's hard edges, so a jaw line or a bevel stays crisp instead of getting rounded off. It can also punch triangle holes into otherwise clean quad output, so look the result over before you rely on it.
Adaptive Sizing True/False Let quad size follow the shape, so fingers, ear rims and straps get smaller quads and survive. Switch it off and anything thinner than a single quad cell can drop out of the result entirely. Leave it on unless you want evenly sized quads more than you want the thin parts.
Smooth Iterations Whole number Even out the new quads after extraction. Each pass slides every interior vertex toward the average of its neighbours and then drops it back onto the original surface, so the grid gets tidier without the shape drifting or shrinking. Border vertices never move - those are the ones Preserve Boundary is about to snap. 0 leaves the extracted quads exactly as the solver produced them.
Minimum Cost Flow True/False Use a slower, more thorough solver for the step that decides where the quad grid's irregular points go. It generally leaves fewer of them and a cleaner flow. Worth trying when the ordinary solve gives up on a mesh - the error you get in that case names this setting.
Preserve Sections True/False Carry the original mesh's materials, UVs, vertex colours and normals over onto the new quads. Sampled from the nearest bit of the old surface when you press Accept, seams included. Turn it off if you want a bare mesh.
Use Source Correspondence True/False Change how the transfer decides which part of the old surface a new vertex came from. Off, it takes whatever is nearest, which is more accurate on ordinary geometry. Turn it on where two surfaces nearly touch, like a lash card against an eyelid, and the nearest-point search keeps sampling the wrong sheet.
Preserve Boundary True/False Pull the new mesh's open borders back onto the original ones. Without it the quad grid stops a little short of every rim and you get a thin gap all the way round a mouth or an eye socket.
Boundary Snap Distance Number How far a border vertex is allowed to travel when it snaps, counted in multiples of the new mesh's average border edge length. Anything further from the old border than this stays where it is. The cap is what stops two neighbouring vertices snapping to opposite sides of a hole and dragging a folded black shard across it. 2 is generous; drop to 1 for a tighter snap when the original border is dense.
Smooth Strokes True/False Smooth each stroke once you let go of it, so a shaky drag still reads as a clean direction. Off by default: the smoothing pulls a closed stroke in on itself, so a loop drawn round an eye ends up smaller than you drew it.
Weld Before Init True/False Merge vertices sitting on top of each other before anything else runs. An imported mesh is often split at every UV seam, and those splits break the surface into pieces this cannot solve across. Leave it on.
Weld Tolerance Number How close two vertices have to be before they merge, in world units. 0 merges only the ones at exactly the same spot, which is what you want for a plain seam split. Raise it to close up geometry that has drifted apart; raise it too far and real detail collapses. Changing it rebuilds.
Show Flow Lines True/False Draw the coloured lines that show which way the loops will run. They only appear once you have solved the orientation field at least once, and picking a position tool switches them off for you.
Show Grid True/False Draw the grid overlay over the mesh. Needs the position field solved first, and picking a position tool switches it on for you.
Show Exact Quads True/False Show the finished quads in the grid - the same layout Accept will produce, rebuilt in the background a moment after each change (the previous quads stay up while a rebuild runs). Turn it off to use the flow-line grid instead, which updates instantly and follows the field live but only approximates the final quads.
Show Flow Field True/False Put a small cross on sampled vertices showing the two directions the grid follows there. Worth turning on to read the field up close when the flow lines are too far apart to tell.
Show Painted Strokes True/False Draw the strokes you have already painted.
Show In Progress Stroke True/False Draw the white ribbon that trails the cursor while you are dragging.
Flow Line Density Number How many flow lines get drawn. This only touches the coloured lines; the grid overlay draws at the real quad density and ignores it. 0.5 is the normal amount, 0 is a quarter of it, 1 is four times as many.
Field Sample Count Whole number How many vertices get a cross drawn on them. Raise it to read the field in a tight spot, drop it when the crosses start hiding the mesh.
Field Arm Size Scale Number How long the cross arms are drawn. 0.5 is the normal length, 0 is a quarter of it, 1 is four times as long.
Singularity Size Scale Number How big the singularity markers are drawn, on the same scale as the cross arms. Singularities are the points where loops converge instead of running straight through.
Grid Ribbon Width Number How wide the grid lines are drawn. They are real geometry sitting on the surface rather than screen-space lines, so the width scales with the mesh: 0.5 normal, 0 a quarter, 1 four times. Changing it redraws the grid.
Flow Ribbon Width Number How wide the flow lines are drawn, on the same scale as the grid width. Each line is fattest in the middle and tapers away at both ends.
Field Arm Thickness Number Line thickness of the first cross arm, in pixels. 0 hides it.
Field Ortho Thickness Number Line thickness of the second cross arm, in pixels.
Singularity Thickness Number Line thickness of the singularity markers, in pixels.
Painted Stroke Thickness Number Line thickness of the strokes you have painted, in pixels.
In Progress Stroke Thickness Number Line thickness of the white stroke that follows the cursor, in pixels.

Studio and Graph › Geometry

Set Attribute

Start with the mental model, because the word "attribute" is the only hard part: you are storing a number on each vertex so you can read it back later, or move it to another mesh.

Set Attribute node

The Set Attribute node

When to use it

Start with the mental model, because the word "attribute" is the only hard part: you are storing a number on each vertex so you can read it back later, or move it to another mesh.

  • This node is the store step.
  • Get Attribute is the read-it-back step.
  • Transfer Attribute is the move-it step.
  • A Wrangle can read and write the same number as @name.

The number rides inside the mesh itself, so it survives every wire, every save and every node that passes the mesh along - it is not a side channel you have to keep re-connecting. That is what makes it worth using instead of just wiring a weight map around.

Store Per is the choice that matters. One value per vertex is what you want almost always - masks, heights, heat, anything a weight map could hold. One value per triangle is for facts about faces: material class, an area band, a flag. Pick the wrong one and everything downstream still works but has to average, which blurs the data.

Pins

Pin Type Description
Mesh Mesh The mesh to store the value on.
Weights Weight Map Per-vertex values. Only read when Value Source is set to Weights input.
Value Number Drives the X component of Constant Value from the graph. Leave it empty to use the panel value.
Pin Type Description
Mesh Mesh The same mesh, now carrying the value under that name.

Settings

Setting Type Description
Name Text The name you will look this up by later. Case-sensitive, so Mask and mask are two different things. Leave it empty and the node does nothing.
Store Per Choice One value per vertex, or one per triangle. Changing this rebuilds the stored value from scratch.
Type Choice How many numbers each vertex or triangle holds. Changing this rebuilds the stored value from scratch; nothing is reinterpreted in place.
Value Source Choice One value everywhere, or per-vertex values from the Weights input.
Constant Value Vector The value every vertex or triangle gets. Components past the chosen Type are ignored, and Float and Int only read X. X can also be driven by the Value pin, so the graph can work the number out for you.
Constant W Number The fourth number. Only read when Type is Vector 4.
Driven Component Whole number Which component the Weights input writes into. 0 is X. Clamped to however many the chosen Type has.

Studio and Graph › Geometry

Simplify

Brings a dense mesh down to a triangle or vertex budget by collapsing edges, and keeps its UV islands, material sections and polygroups intact while doing it.

Simplify node

The Simplify node

When to use it

Brings a dense mesh down to a triangle or vertex budget by collapsing edges, and keeps its UV islands, material sections and polygroups intact while doing it.

Scans and AI-generated meshes arrive far denser than anything downstream needs. This is the way to cut them down without losing the work already on them: unlike Remesh, which rebuilds the surface and throws the original topology and UVs away, everything a texture or a rig depends on survives.

The reverse direction is Subdivide, and even triangle sizes rather than fewer of them is Remesh.

How to use it

  1. 1

    Connect the dense mesh

  2. 2

    Pick a target mode and budget, and leave the Preserve toggles on

  3. 3

    Click Simplify

    The Result category reports the before and after counts.

Pins

Pin Type Description
Mesh Mesh The mesh you want fewer triangles in.
Target Triangles Whole Number Drives the triangle count from the graph. Leave it empty to use the value in the panel. Triangle Count mode only.
Target Percentage Number Drives the percentage from the graph. Leave it empty to use the value in the panel. Percentage mode only.
Target Vertices Whole Number Drives the vertex count from the graph. Leave it empty to use the value in the panel. Vertex Count mode only.
Max Deviation Number Drives the allowed drift in cm from the graph. Leave it empty to use the value in the panel. Geometric Deviation mode only.
Pin Type Description
Mesh Mesh The reduced mesh. It only updates when you press Simplify.

Settings

Setting Type Description
Target Mode Choice Which of the numbers below the reduction aims at.
Target Triangle Count Whole number How many triangles you want left. Each collapse takes two triangles away, so the result can land one under your number. Asking for more than the mesh already has passes it through untouched rather than failing, and anything under four is treated as four - below that there is nothing left to collapse and the result stops being a surface.
Target Percentage Number How much of the incoming triangle count to keep. 100 leaves the mesh alone.
Target Vertex Count Whole number How many vertices you want left. Same rule as the triangle count: ask for more than the mesh has and nothing happens to it.
Max Deviation Number How far, in centimetres, the reduced surface may drift from the original. It keeps collapsing until the next collapse would break that limit, so you get however many triangles the shape needs rather than a number you picked. Slower than the count modes, because it measures against the original the whole way.
Quality Choice What the reducer works hardest to hang on to as it collapses edges.
Preserve UVs True/False Lock every UV and normal seam so islands cannot be merged or torn open. This is what keeps a textured asset looking textured. Turn it off and the seams collapse, which smears the texture across the surface.
Preserve Material Borders True/False Lock the edges where one material meets another so sections keep their exact borders. Locked edges never collapse, so a mesh cut into many small sections may not get anywhere near a low target.
Preserve Group Borders True/False Lock the edges between polygroups. Costs you the same room to reduce that material borders do.
Preserve Boundary True/False Lock open edges so a cut-out piece keeps the exact shape of its border, and the original vertex density along it. That density is usually why a scan or a patch will not reduce far enough, so turn it off when the target stays out of reach.

Studio and Graph › Geometry

Transfer Attribute

The move-it-between-meshes step of the attribute model: a named value that lives on the source mesh is copied onto the mesh flowing through. The Attribute dropdown reads the source, because the sou...

Transfer Attribute node

The Transfer Attribute node

When to use it

The move-it-between-meshes step of the attribute model: a named value that lives on the source mesh is copied onto the mesh flowing through. The Attribute dropdown reads the source, because the source is where the value has to exist.

There are two completely different correspondences here, they produce different numbers, and the node tells you which one it used every time.

  • By index - element i of the source becomes element i of the target. Exact, free, and correct only when the two meshes share topology. It requires equal element counts and refuses outright when they differ, rather than transferring the overlapping prefix, because a partial transfer reads as a successful one.
  • Nearest point - each target element samples the spatially closest source element. Works across any two meshes and is approximate by construction.

Mode is the setting people get wrong. Auto picks index when the counts match and nearest point otherwise, and that is a convenience, not a correctness claim - two unrelated 5000-vertex heads also have matching counts and will be copied index-for-index into nonsense. Force the mode whenever the answer matters.

Pins

Pin Type Description
Mesh Mesh The mesh that already carries the value.
Target Mesh The mesh that receives it. It can be built completely differently.
Pin Type Description
Target Mesh The receiving mesh, now carrying the copied value.

Settings

Setting Type Description
Attribute Text Which stored value to copy. It is created on the target with the same shape it had on the source. The dropdown lists what the source carries, and its search box doubles as a text field while nothing is connected.
Mode Choice How the two meshes get matched up. Auto guesses from the vertex counts, which is convenient rather than reliable: two unrelated 5000-vertex heads also have matching counts. Set it yourself when the answer matters.
Sampling Choice How a nearest-point sample turns the source surface into one value: the closest value unchanged, or a blend across the triangle it landed on. By index copies element to element and ignores this, and so do whole-number and per-triangle attributes, where a blend has no meaning - the node says so when that happens.
Max Distance (0 = no limit) Number How far a target vertex or triangle may reach for a value, in mesh units. 0 means no limit. Anything with no source surface in range keeps zero, and the node message says how many those were.

Studio and Graph › Geometry

Wrangle

Write a line of maths and it runs on every vertex, or every triangle. Move points with P, tilt normals with N, push colour into Cd, read and write your own named attributes, and send a weight map o...

Wrangle node

The Wrangle node

When to use it

Write a line of maths and it runs on every vertex, or every triangle. Move points with P, tilt normals with N, push colour into Cd, read and write your own named attributes, and send a weight map out through wmap("Name") = .... There are loops, neighbour lookups, noise, vector maths and a Python stage.

Taper a limb by height. Build a mask from a UV band. Jitter a colour by a hashed vertex id. Drive a named attribute from arithmetic on the others. Anything the rest of the library has no node for.

// a falloff from a second mesh, out as a weight map
wmap("Weights") = 1 - saturate(neardist("Reference", P) / 25);

It runs on the CPU. A short expression over a two-million-vertex mesh costs tens of milliseconds, not the fraction of a millisecond a compute shader would. It is a graph operation, not an interactive brush - and that is structural: a cooked build carries no shader source tree and no shader compiler to give it one.

The first five minutes

  1. 1

    Place the node

    A fresh Wrangle has no pins and no required inputs. Pressing Run at this point is a successful no-op.

  2. 2

    Press Add Classic Mesh Setup

    One click gives you the usual layout: a Mesh input, a Mask weight map, a Reference mesh and a Weights output. The button lives on the node's right-click menu and in the pin editor, and it only shows while the node has declared nothing at all - it appends, it never replaces.

  3. 3

    Write the expression

    One statement per line, or separate them with ;. Anything after // or # is a comment.

  4. 4

    Press Run

    Editing never runs the node. Changing the expression, a parameter or the run mode only marks the output out of date, with an amber badge on the node. Run evaluates it and clears the badge.

A freshly placed node that has never been run publishes nothing downstream. There is no input-mesh passthrough waiting to happen: the input only passes through when an already-declared run fails partway.

What one run means

Run Over decides what a single run of your code corresponds to. It is not a performance setting - it changes which channels exist and what your code is allowed to touch.

Run Over One run is What it is for
Vertex one vertex Moving points, per-vertex masks, anything that reads P and N.
Triangle one triangle Per-face work: area, face normals, material and group ids.
Corner one face-vertex Exact per-corner N, uv and Cd, splitting a shared overlay element where corners disagree. Both the owning vertex and the owning triangle are readable at once.
Texel one texel of this node's own output image Writing an image rather than a mesh.
Once (Detail) the whole mesh, exactly once, single threaded Landmark edits, setoutput() value outputs, and the only mode that may add or remove geometry.

Pins are yours to declare

There are no fixed pins. Every input and output on this node is one you declared, in the Parameters and User Outputs lists, and each one becomes a pin named after it.

  • Mesh is not a reserved word. Declare a Mesh parameter and it becomes the subject automatically when it is the only one - P, N, Cd, uv and the run-over all read it. Declare a second and flag one Primary.
  • Reference is not special either. Every donor mesh is read through the pin-name form, neardist("Pin", p), nearpoint("Pin", p), sdist("Pin", p). The classic layout just happens to call its donor pin Reference, by convention.
  • A Weight Map parameter named Mask is what mask reads.
  • A DNA parameter becomes a DNA input pin, read from the expression through the dna*("Pin", ...) functions - joints, meshes, blend shapes, controls and skin weights.
  • A parameter and a user output may share a name. They live in separate namespaces, so a read resolves the input and setoutput() writes the output.

Press Create pins from code to pick up names you have already typed into the expression.

Settings

Setting Type Description
Expression Text The code. One statement per line, or separated with ;.
Run Over Choice What one run corresponds to: Vertex, Triangle, Corner, Texel or Once (Detail).
Run Per Choice Vertex or triangle, for the two per-element modes. Ignored in Corner, Texel and Detail.
Output Width Whole number Output image width in texels, Texel mode only. 0 takes it from the first wired Texture parameter.
Output Height Whole number Output image height in texels, Texel mode only. Same auto rule as the width.
Create Missing Attributes True/False Let the code invent an attribute by assigning to a name the mesh does not have. Off is the safer default: a misspelled @name is then an error rather than a new, empty attribute nothing reads.
Restrict Choice Narrows the run to the elements that pass a test, instead of hand-writing if (mask > 0) at the top of the expression.
Restrict Value Whole number The material ID or polygroup id to restrict against. Ignored for None and Mask.
Iterations Whole number How many times the whole evaluate-and-apply cycle repeats, each pass reading the last one's result. This is what turns a one-step neighbour average into a real smooth.
Show displacement True/False Preview overlay of how far each vertex moved on the last run that wrote P.
Python Script Text The script, authored through the #@python blocks in the same code editor.
Interactive Script True/False Tick it when the script opens a window of its own and waits on it.
Run Python Isolated True/False Run this node's Python stage out of process, even on a machine whose interpreter could host it in process.
User Params List The input parameters you declare. One input pin per entry.
User Outputs List The value outputs you declare.

Sharing a configured Wrangle

Pin layout, the expression, any Python and every parameter's current value travel together as one unit. Right-click the node for Export Node Preset (a .mmnode file with a title, author and description you fill in), Save to My Presets (installs it into Installed Nodes on this machine, with an Uninstall action that never touches a graph you already placed it into), or Copy as Shareable Text for a clipboard envelope anyone can paste into their own graph.

Importing a preset never runs the Python it carries. A script only ever executes from an explicit Run press - the same rule that governs a pasted node or a freshly opened graph.

Reference

The full language, one page per area. Every entry gives the syntax, what it does, and a line you can paste.

Language and control flowStatements, operators, types, loops and your own functions./pages/KQRyHgNzSb4IcC6kpEf9
Channels and attributesP, N, uv, Cd and the rest, per domain, plus the @attributes you name yourself./pages/RaLx5dzDGcwOK45lEZkU
ParametersThe inputs you declare on the node: floats, vectors, weight maps, ramps, transforms and deltas./pages/x87RxmpVIl6QHEBgSjvQ
Scalar and vector functionsMaths on numbers and on vectors, plus the integer and debug helpers./pages/JthIanuAnXbkR144JrDg
NoiseDeterministic simplex noise: the same input gives the same value on every run./pages/zoqByWdX7CeVHCkEz4l7
Neighbours, transforms and distanceWalking the one-ring, moving points and frames around, and geodesic distance across the surface./pages/vRDDBaQClb0Jl9OEaKOw
Donor mesh pinsReading a second mesh by pin name: positions, normals, attributes, nearest points and ray hits./pages/xwBAb23XWnR7wsWyph2w
Textures and landmarksSampling a Texture pin, and reading or writing a Landmarks pin./pages/MO7kZ8sPZ4c1mmlbumfu
MetaHuman DNAReading a DNA by pin name: joints, meshes, blend shapes, controls and skin weights./pages/7JA9EWBOWNmQjCnOU6PM
Run modes: Texel and CornerWhat one run means in the two per-element modes that are not Vertex or Triangle./pages/Hv1EZE5I42v4g1I5zEi9
Run mode: DetailThe mode that runs once for the whole mesh, and the only one that may add or remove geometry./pages/K9SRx4ZZxAhwwLS99918
ArraysGrowable lists of floats or vectors, local to one run of the expression./pages/4H8KhQTKbQMOOPQR1vrk
Skin weights and viewportReading and writing the mesh's real skin weights, and drawing debug geometry./pages/NUKp2CXhQEK25cvkCHZz
Python stageThe #@python blocks: when they run, what they can reach, and how they feed the expression./pages/iuKqnJQcDlS6ph2wPWYI
Python APIEverything on the mm object, plus the mm.ui buttons and labels a script can declare./pages/qoq286G1rlTZaeDsnA2q
ExamplesEvery recipe the code editor's own Examples menu inserts, expression and Python./pages/YDkk3xP0r9z12iLrZELz

Studio and Graph › Geometry › Wrangle

Language and control flow

Statements, operators, types, loops and your own functions.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Language

Syntax What it does Example
statements stmt; stmt; ... Statements run in order, separated by ;. Comments: // or # to end of line. P.z += 1; wmap("Weights") = P.z
assignment target = expr Assign a channel, a named attribute, or a local variable (created on first assignment). Compound forms: += -= *= /=. Locals that are vectors also support .x/.y/.z (or .r/.g/.b) writes. d = P.x * 2; v.z = 0
declaration float/vector/quaternion/matrix3/matrix name = expr Optional typed declaration of a local. Without a keyword the type is inferred from the first assignment. matrix3 R = lookat(P, target, vec3(0,0,1))
bare expression expr A statement that is just an expression, with no assignment, is always a compile error - it computes a value and throws it away, which is nearly always a typo. Assign it, e.g. to a Weight Map output (wmap("Name") = ...), a channel, or a local. wmap("Weights") = P.z * 0.5
vectors vec3(x, y, z) A vector is three scalars. vec3() costs zero instructions. Component access .x/.y/.z (or .r/.g/.b) works on any vector expression. wmap("Weights") = (P - nearpoint("Reference", P)).z
quaternion / matrix quat(x,y,z,w) / matrix3(c0,c1,c2) / matrix Quaternion is xyzw (4 slots). matrix3 is three column vectors (9 slots, column-major). matrix is matrix4 (16 slots, column-major with last row 0001). quat/matrix3 constructors emit no ops. quaternion q = quaternion(vec3(0,0,1), 90)
operators + - * / % ^ Arithmetic. Vectors support v+v, v-v, vv (per-component), v/v (per-component), vs, sv, v/s, -v. Also m3m3, m4m4, m3v (=vtransform), m4v (=ptransform), qq (=qmul). % and ^ are scalar only. Two vectors with * is not a dot or cross - use dot()/cross() for those. wmap("Weights") = 2 ^ 3 ^ 2
comparison < <= > >= Scalar comparisons; result is 1 or 0. wmap("Weights") = P.z > 10
equality == != Scalar equality; result is 1 or 0. Binds less tightly than < <= > >=, the way C and HLSL do, so a == b < c reads as a == (b < c). Comparing two floats that came out of arithmetic is rarely what you want; compare a difference against a tolerance instead. wmap("Weights") = frac(ptnum / 2) == 0
logic && || ! ?: Short-circuit logic and the conditional. Both ?: arms must be the same type (scalar or vector). wmap("Weights") = P.z > 0 ? 1 : 0
constants pi, e Folded at compile time; not assignable. wmap("Weights") = sin(pi / 2)

Case

Names are case sensitive: channels, variables, functions and keywords all are, so n is an ordinary variable while N is the normal channel, and p is free while P is the position. The two exceptions are component letters (P.X is P.x) and attribute names (@Height and @height are one attribute, because attribute names are case-insensitive).

float n = 0; N = normalize(N)

Strings - "text"

A string literal. Argument only, consumed entirely at compile time: it names a parameter for ch()/chf()/chv()/chi()/chb(), or names a pin, bone or attribute for the donor-mesh, texture, landmark, weight-map, ramp, transform and delta functions further down this reference - never just a ch() parameter, and never a value you can store in a variable, combine with an operator, or assign. No escape sequences, and the closing quote must be on the same line.

wmap("Weights") = ch("radius")

Control flow

Syntax What it does Example
if (cond) { ... } Run the block when cond is non-zero. Braces are required, so there is no dangling-else to guess about. The condition must be a scalar. if (P.z > 0) { wmap("Weights") = 1 }
if (...) { ... } else { ... } The other arm. else if (...) { ... } chains as deeply as you like. if (mask > 0.5) { P.z += 1 } else { P.z -= 1 }
while (cond) { ... } Repeat the block while cond is non-zero. while (d > 1) { d *= 0.5; n += 1 }
for (init; cond; step) { ... } C-style. Any of the three parts may be empty; for (;;) loops until break. There is no ++ - write i += 1. for (i = 0; i < 8; i += 1) { s += rand(i) }
break; Leave the innermost loop. for (i = 0; i < 99; i += 1) { if (i > 4) { break } }
continue; Skip to the next iteration (to the step of a for). foreach (nb in neighbours(ptnum)) { if (nb == ptnum) { continue } }
block scope { ... } A block's locals vanish at its closing brace, so two sibling loops may both declare i. A bare expression is not allowed inside a block, for the same reason it is not allowed beside other statements. for (i = 0; i < 3; i += 1) { float t = i * 0.5; s += t }

foreach (name in neighbours(p)) { ... }

Iterate the one-ring of point p. name is a fresh local holding each neighbour point ID, scoped to the block. Vertex or Corner domain. neighbors is accepted too. Also: foreach (t in neighbourprims(primnum)) walks edge-adjacent triangles (Triangle or Corner domain); foreach (i in points()) / foreach (i in points("Pin")) iterates live vertex ids; foreach (i in nearpoints("Pin", p, r)) iterates donor vertex ids within r of p (Vertex, Corner or Detail - see the Donor mesh pins page for the full nearpoints entry). Self points() is Vertex, Corner or Detail; points("Pin") is any run-over.

foreach (nb in neighbours(ptnum)) { sum += pointpos(nb) }

Step budget

Every element may dispatch at least 268 million instructions - more automatically, with no settings visit needed, once a bound mesh, texture or landmark set is large (Settings > Scripting overrides the number by hand the moment you change it there, up to 2 billion). Exceeding it aborts the whole run with an error naming the element - the mesh passes through unchanged rather than half-written. A loop-free expression can never reach it, whatever the limits are set to.

while (1) { } // error, does not hang

Unlimited mode

Settings > Scripting's Unlimited step budget turns the step budget off entirely and replaces it with a seconds-based run time limit (Unlimited run time limit (seconds)) for a loop whose iteration count genuinely depends on runtime data. Exceeding the time limit aborts the run the same way the step budget does; a long unlimited run can also be stopped early from its own progress bar's Cancel button. A time limit of 0 means no time limit at all - with the step budget off too, a loop that never ends will run for ever and the app has to be closed from Task Manager.

while (1) { } // runs until the time limit or Cancel, in unlimited mode

User functions

function name(type p0, type p1, ...) { ... return expr; }

Define a helper at the top of the expression (not inside if/for/foreach/while or another function). The body is inlined at every call site at compile time - there is no call stack, and a function cannot call itself. The body cannot see the caller's locals, only its own parameters plus channels and node parameters, so names the caller used may be reused inside the function. Parameter types are float, vector, quaternion, matrix3 or matrix. All returns in one function must share a type.

function falloff(float d, float r) { return saturate(1 - d / r); } P.z += falloff(length(P), 25)

return expr;

Leave an inlined function body with a value. Only legal inside a function.

return saturate(1 - d / r)

Call - name(args)

Call a previously defined function. Argument count and types must match the definition. Arguments are evaluated in the caller; the body cannot see the caller's locals.

wmap("Weights") = falloff(length(P), 25)

Studio and Graph › Geometry › Wrangle

Channels and attributes

P, N, uv, Cd and the rest, per domain, plus the @attributes you name yourself and the mesh-wide constants.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Channels: vertex domain

Syntax What it does Example
P vec3, read/write Vertex position, in cm. Also @P. P.z += 5
N vec3, read/write Vertex normal (mean of split-normal elements; writes patch each element and are not re-normalised). Also @N. N = normalize(N)
Cd vec3 rgb, read/write Vertex colour. Bare Cd is rgb as a vector; alpha is Cd.a (scalar). Writes broadcast across colour elements at the vertex. Also @Cd. Cd = vec3(uv.x, uv.y, 0)
Cd.a scalar, read/write Vertex colour alpha. Cd.a = 1
uv scalar components, read/write Primary UV as uv.x/uv.y (aliases uv.u/uv.v). Two components, so uv is not a vec3 - read the components. uv.x = 1 - uv.x
wmap (write) wmap("Name") = expr Writes the named WeightMap output parameter (also += -= *= /=) - Name resolves the primary WeightMap output when only one is declared, see primary on the Parameters page. See Weight maps for the read side and the shared-name rule. wmap("Weights") = fit(P.z, 0, 100, 0, 1)
mask scalar, read Per-vertex value of the primary WeightMap input parameter (the mask - typically named Mask; see primary on the Parameters page). Compile error while none is declared and wired. Also @mask. wmap("Weights") = mask * P.z
ptnum / elemnum scalar, read This vertex's id. Also @ptnum. wmap("Weights") = rand(ptnum)
numpt / numelem scalar, read Vertex count. Also @numpt. wmap("Weights") = ptnum / numpt
conditional writes A channel assignment inside an if or a loop only touches the elements whose run actually reached it. Everything else keeps what it had, so writing N or uv on part of a mesh leaves the hard edges and UV seams elsewhere exactly as they were. if (P.z > 0) { N.x = 0 }

Channels: triangle domain

Syntax What it does Example
P vec3, read Triangle centroid. Writes are rejected: a centroid write has no single meaning. @sz = length(P)
N vec3, read Face normal. @up = dot(N, vec3(0,0,1))
Cd, uv read Mean of the three corners. Read only here - corner elements are shared with neighbouring triangles. @u = uv.x
area scalar, read Triangle area in cm^2. @big = area > 10
primnum / numprim scalar, read Triangle id / triangle count. @odd = primnum % 2
@name per type Named attributes are the only writable thing per triangle. @flat = 1 - dot(N, vec3(0,0,1))

Channels: corner domain

Syntax What it does Example
P vec3, read Owning vertex's position (the vertex this corner belongs to). Write is a compile error - several corners share one vertex, so a P write has no single meaning here; use Run Per = Vertex. @dist = length(P - centroid())
Cd vec3 rgb, read/write This corner's exact colour element. Same split-on-disagreement rule as N. Cd = vec3(uv.x, uv.y, 0)
Cd.a scalar, read/write This corner's exact colour alpha. Cd.a = 1
uv scalar components, read/write This corner's exact uv element (uv.x/uv.y, aliases uv.u/uv.v). Same split rule as N. uv.x = 1 - uv.x
wmap (write) wmap("Name") = expr Writes the named WeightMap output parameter (also += -= *= /=), promoted to the per-vertex mean over corners that actually wrote it - a vertex none of whose corners wrote it keeps 0. wmap("Weights") = 1
mask scalar, read The owning vertex's weight from the primary WeightMap input parameter (the mask), not a per-corner value - all corners of a vertex share its fate. Compile error while none is declared and wired. wmap("Weights") = mask * P.z
elemnum scalar, read This corner's id: cornerid = 3*tid + c (c in 0..2), ascending per live triangle. wmap("Weights") = elemnum % 3
numelem scalar, read 3 * TriangleCount, pre-Restrict. wmap("Weights") = elemnum / numelem
cornerindex scalar, read This corner's own slot in its triangle, 0..2 - the c in cornerid = 3*tid+c. Corner domain only. wmap("Weights") = cornerindex
ptnum / numpt scalar, read Owning vertex id / mesh vertex count - the same registers Vertex mode's ptnum/numpt use, seeded from the corner's owning vertex here. float w = wmap("Falloff", ptnum)
primnum / numprim scalar, read Owning triangle id / mesh triangle count - the same registers Triangle mode's primnum/numprim use. wmap("Weights") = materialid("Pin", primnum)
area scalar, read The owning triangle's area in cm^2, exactly like Triangle mode's own area. @big = area > 10

N - vec3, read/write

This corner's exact normal element - never a mean, unlike Vertex mode. A write that disagrees with another corner sharing the same element splits it; writes that agree with every other corner (or with the unwritten ones' existing value) never split anything. See the Run modes: Texel and Corner page for the full rule and why it is never undone by a merge.

N = normalize(N)

UV layers

Non-primary UV channels - uvlayer(0) is uv, see the Channels sections above.

uvlayer(n) / uvlayer(n).x / uvlayer(n).y (aliases .u/.v)

UV channel n as vec3(u,v,0) (read) or per-component (.x/.y, read and write). n must be a constant whole number - it selects a register at compile time, the same constraint relax()'s iteration count has. uvlayer(0) is uv (same registers, no separate storage). Reads are legal in Vertex (per-vertex mean, same convention as uv) and Triangle (3-corner mean); writes are vertex only (Triangle refuses for the same shared-corner reason uv itself does there). Reading/writing a channel that does not exist is a compile error naming how many the mesh has; writing one with Create Missing Attributes on creates it as an all-zero atlas (a loud run note - Pack/Bake will happily succeed on it; lay it out with Generate UVs). Corner mode: deferred - only uvlayer(0) (the primary uv channel) is available per-corner for now; a non-primary layer there is a positioned compile error.

uvlayer(1).x = 1 - uvlayer(1).x

numuvlayers() / numuvlayers("Pin")

UV channel count, self or a named donor (0 without any UV layout - unlike numpolygrouplayers() there is no "layer 0 always exists" concept here). Scalar, every run-over.

wmap("Weights") = numuvlayers() > 1

Attributes

@name - read/write

A tagged named attribute. Scalar for Float; a Vector 3 attribute reads/writes as a vector; other sizes go per component (@a.x .. @a.w / .r .g .b .a). Cross-domain access is a compile error naming the fix (Promote Attribute). In Corner mode a name is readable from either domain (a vertex attribute at ptnum, a triangle attribute at primnum) - if the same name exists in both domains that is a positioned compile error naming the collision, not a silent pick; writes are refused outright in Corner (promotion policy deferred - write from Vertex or Triangle mode instead).

@height = P.z

Creation - write, opt-in

With Create Missing Attributes on, assigning an absent name creates it: Float from a scalar, Vector 3 from a vector. Off, the same line is an error listing what exists. Never available in Corner mode - see the row above.

@heat = saturate(P.z / 100)

Name clash

@name means the named attribute whenever the mesh carries one, and only falls back to the built-in channel when it does not. So on a mesh that really has an attribute called P, @P reads that attribute while the bare P still reads the position. Leave the @ off when you mean the channel.

wmap("Weights") = P.z

getattrib(name) / setattrib(name, value)

Read/write the same named attribute @name does, through identical rules (creation, domain, Corner read-only/write-refused), but with the name resolved at compile time from a string literal or chs("Param") instead of the @ sigil - handy when the name itself comes from a String parameter. No .component form (use @name.x = ... for that) and no @P/@Cd/@ptnum channel fallback - a getattrib()/setattrib() name always means an attribute. setattrib is usable as a bare statement.

setattrib(chs("TargetAttr"), getattrib(chs("TargetAttr")) + 1)

Detail constants

Mesh Wrangle node only; compile error in a Custom Force expression.

Syntax What it does Example
bboxmin() The mesh's axis-aligned bounding box minimum corner, in cm. One value for the whole evaluation, not per element. wmap("Weights") = P.z - bboxmin().z
bboxmax() The bounding box maximum corner. wmap("Weights") = (bboxmax().z - P.z) / bboxsize().z
bboxsize() bboxmax() - bboxmin(), the box's extent along each axis. wmap("Weights") = (P.x - bboxmin().x) / bboxsize().x
centroid() The average of the mesh's vertex positions. Not the bounding-box centre and not a volume-weighted centre of mass - always defined, even on an open mesh. wmap("Weights") = length(P - centroid())
surfacearea() Total triangle area in cm^2, the same quantity area sums per triangle. @rel = area / surfacearea()
volume() Enclosed volume in cm^3 via the divergence theorem. Only meaningful on a closed (watertight) mesh; an open mesh still returns a defined number rather than a guard. wmap("Weights") = volume() > 1000000

Studio and Graph › Geometry › Wrangle

Parameters

The inputs you declare on the node: floats, vectors, weight maps, ramps, transforms and deltas. These are inputs you define on the node, not attributes on the mesh.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Syntax What it does Example
bare read paramName Read a user-defined parameter by its bare name; a local of the same name shadows it. Type follows the parameter: Float/Int/Bool read as a scalar, Vector as a vector. wmap("Weights") = radius * 2
ch / chf ch("name") or chf("name") Read a Float parameter by name as a float: the name is a compile-time string (see strings on the Language and control flow page), not code. Both are the same function. wmap("Weights") = ch("strength") * mask
chv("name") Read a vector parameter by name. P += chv("offset")
chi("name") A parameter read truncated toward zero (same rule as trunc()). wmap("Weights") = chi("octaves")
chb("name") A parameter read as a boolean: 0 stays 0, anything else becomes 1. if (chb("enabled")) { wmap("Weights") = 1 }
read only Parameters are inputs, not variables, and cannot be assigned. Copy one into a local first if you need to change it. float r = radius; r *= 2

chs("Name")

Read a String parameter's text, resolved entirely at compile time - legal anywhere a string literal (a name/pin argument) is legal: donor mesh/texture/landmark/weight-map/bone names, chramp/chm/geodist/getattrib/setattrib, even ch()'s own argument. An empty parameter value, or a name that does not match any declared String parameter, is a compile error naming the parameter. This node recompiles every Run, so editing the parameter's value and re-running is exactly the same as editing the literal by hand.

float t = ch(chs("CurveParamName"))

Same name

A Parameter and a User Output may now share the same name - they are two separate pin namespaces (an input list and an output list). A read (bare name, ch()/chf()/chv()/chi()/chb(), or a donor mesh/texture/landmark/weight-map/delta function's pin-name argument) always resolves the input of that name; setoutput() always resolves the output.

(Parameters: Float "Body"; User Outputs: Float "Body") - ch("Body") reads the input, setoutput("Body", x) writes the output

Primary

Every one of these resolves to exactly one declared parameter/output of its type, the same way: the subject (a Mesh parameter - what P/N/Cd/uv/@attrs/the run-over/neighbours/relax/geodist/the detail constants and the bare "Mesh" alias on the Donor mesh pins page all bind to), the mask (a WeightMap parameter - mask, Restrict = Mask, mm.mask), the result (a Mesh User Output - what the node actually publishes), and its Texture, Landmarks and Delta User Outputs (the Texel image and the Detail landmark/delta working sets each publish to whichever one of that type is Primary). WeightMap User Outputs are the one exception - wmap("Name") = ... and mm.set_wmap("Name", buf) both write any declared one by name, Primary or not (Primary only decides which output aliases the fast register-file slot the old single-Weights-output form used - a compile-time detail, invisible to the script). With exactly one candidate of a type, it is automatically that role; declare a second one of the same type and flag one of them Primary in the pin editor, or a node warning names which extra one(s) it ignored.

(Parameters: Mesh "Body" Primary, Mesh "Cage") - Body is the subject; Cage is read only through the donor mesh functions, by name

Weight maps

Parameters list, type Weight Map.

WeightMap parameter

Add a Parameter of type Weight Map and it becomes an input Weight Map pin named as the param - no name is reserved (see same name/primary in the Parameters section above). Name one "Mask" (or flag it Primary if you declare more than one) to make it the mask the mask/Restrict/mm.mask machinery reads. No bare-read form: read any of them through wmap() by pin name.

Parameters list, type Weight Map, name "Falloff"

wmap("Name")

Current-vertex weight from that pin (0 if the vertex id is out of range). Vertex or Corner domain (the owning vertex, in Corner). Missing/unconnected pin is a compile error: No weight map input named X is connected. As an rvalue this always reads the named WeightMap input; used as an assignment target (wmap("Name") = ...) it writes the output of that name instead (see wmap (write) on the Channels and attributes page) - when an input and an output share a spelling, a read binds the input and a write binds the output.

wmap("Weights") = wmap("Falloff")

Wmap (index) - wmap("Name", i)

Weight at vertex i from that pin (self map). Legal in any domain that has meaning for an index.

wmap("Weights") = wmap("Falloff", ptnum)

Ramp parameter

Parameters list, type Ramp - value-only, no pin.

Ramp parameter

Add a Parameter of type Ramp and edit its keys in the pin editor - no pin is ever created, since a ramp has no wire to accept. Two keys, (0,0) and (1,1), the first time it is added.

Parameters list, type Ramp, name "Falloff"

chramp("Name", t)

Baked 256-sample lookup into the named Ramp's curve: t is clamped to [0,1], the value is linearly interpolated between the two nearest keys (constant outside the authored range, which the clamp already guarantees). Legal in every run-over - a ramp is independent of what the program is iterating over, exactly like a Parameter's bare read. Unknown name is a compile error listing the ramp parameters that do exist.

wmap("Weights") = chramp("Falloff", d / 50)

String parameter

Parameters list, type String - value-only, no pin.

String parameter

Add a Parameter of type String and type its text in the pin editor - no pin is ever created, since a string has no wire to accept (same shape as Ramp above). Read it with chs("Name") - see that entry in the Parameters section above for the full rule (legal anywhere a string literal is legal; recompiles every Run). Empty value is a compile error naming the parameter.

Parameters list, type String, name "TargetAttr"

Transform parameter

Parameters list, type Transform.

Transform parameter

Add a Parameter of type Transform and it becomes an input Transform pin named as the param, exactly like Apply Rigid Transform's own Transform pin. Unwired, chm() uses the parameter's own inline location/rotation/scale default instead of erroring - there is no "not connected" case for this type.

Parameters list, type Transform, name "Placement"

chm("Name")

The named Transform parameter as a matrix4 - wired pin wins, else the inline default. Feed it straight to ptransform/vtransform/ntransform/invert/transpose like any other matrix. Legal in every run-over.

P = ptransform(P, chm("Placement"))

Deltas

Parameters list, type Delta - per-vertex offsets by vertex id.

Syntax What it does Example
numdeltas("Pin") How many vertex entries the named pin carries. wmap("Weights") = numdeltas("Sculpt")
hasdelta("Pin", i) 1 if vertex i has an entry in the named pin, else 0. if (hasdelta("Sculpt", ptnum)) { P += delta("Sculpt", ptnum) }
delta("Pin", i) The offset stored for vertex i, as a vector - the zero vector when i has no entry. Absence is a legitimate answer, not a guarded fallback: use hasdelta() first if you need to tell "no entry" apart from "an entry of exactly zero". P += delta("Sculpt", ptnum)
cleardeltas() Empties the Detail run's working delta set. Detail Run Mode only. Usable as a bare statement. cleardeltas()
setdelta(i, v) Upserts vertex i's offset in the working set - overwrites it if i already has one, inserts it otherwise. Detail Run Mode only. Usable as a bare statement. setdelta(0, vec3(0, 0, 1))
removedelta(i) Removes vertex i's entry, if it has one. Detail Run Mode only. Usable as a bare statement. removedelta(0)

Delta parameter

Add a Parameter of type Delta and it becomes an input Delta pin named as the param, exactly like Apply Deltas (Topo Match)'s own Delta pin. No bare-read form - read it through the functions below, by pin name in quotes. Missing/unconnected pin is a compile error: No Delta input named X is connected.

Parameters list, type Delta, name "Sculpt"

Working set / output

The working set starts as a copy of the first wired Delta parameter (Parameters-list order), or empty if none is wired - the same rule Detail's landmark working set follows. After a successful Detail run it publishes on this node's primary Delta output if one exists (see primary above) - Create pins from code (or the pin editor) adds one when the expression writes deltas; switching Run Mode does not.

cleardeltas(); setdelta(0, vec3(0, 0, 1))

Studio and Graph › Geometry › Wrangle

Scalar and vector functions

Maths on numbers and on vectors, plus the integer and debug helpers.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Scalar functions

Syntax What it does Example
abs(x) or abs(v) Absolute value; vectors are component-wise. wmap("Weights") = abs(P.z); P = abs(P)
floor(x) Largest integer <= x. wmap("Weights") = floor(2.7)
ceil(x) Smallest integer >= x. wmap("Weights") = ceil(2.1)
round(x) Round half away from zero. wmap("Weights") = round(2.5)
frac(x) x - floor(x); always in [0,1). wmap("Weights") = frac(P.x * 0.1)
sign(x) -1, 0 or 1. wmap("Weights") = sign(P.z)
sqrt(x) Square root; negative x is guarded to 0. wmap("Weights") = sqrt(dot(P, P))
pow(x, y) x to the power y; undefined combinations are guarded to 0. wmap("Weights") = pow(mask, 2.2)
exp(x) e to the x; overflow is guarded to 0. wmap("Weights") = exp(-d * d)
log(x) Natural log; x <= 0 is guarded to 0. @logarea = log(area)
log2(x) Base-2 log; x <= 0 is guarded to 0. wmap("Weights") = log2(numpt)
sin(x) Sine (radians). wmap("Weights") = sin(P.x * 0.1)
cos(x) Cosine (radians). wmap("Weights") = cos(radians(45))
tan(x) Tangent (radians); overflow guarded to 0. wmap("Weights") = tan(0.5)
asin(x) Arcsine; the argument is clamped to [-1,1]. wmap("Weights") = asin(N.z)
acos(x) Arccosine; the argument is clamped to [-1,1]. wmap("Weights") = acos(dot(N, vec3(0,0,1)))
atan(x) Arctangent. wmap("Weights") = atan(P.y)
atan2(y, x) Angle of (x, y), full circle. wmap("Weights") = atan2(P.y, P.x)
radians(deg) Degrees to radians. wmap("Weights") = sin(radians(30))
degrees(rad) Radians to degrees. wmap("Weights") = degrees(acos(N.z))
min(a, b) Smaller of two; vectors are component-wise. wmap("Weights") = min(mask, 0.5); P = min(P, vec3(1,1,1))
max(a, b) Larger of two; vectors are component-wise. wmap("Weights") = max(P.z, 0); P = max(P, vec3(0,0,0))
clamp(x, lo, hi) x limited to [lo, hi] (reversed bounds are reordered). Vectors are component-wise; clamp(v, s, s) broadcasts the scalars. wmap("Weights") = clamp(P.z, 0, 1); P = clamp(P, 0, 1)
saturate(x) clamp(x, 0, 1). wmap("Weights") = saturate(d / 50)
lerp(a, b, t) a + (b - a) * t. mix is the same function. wmap("Weights") = lerp(0.2, 1, mask)
mix(a, b, t) Alias of lerp. wmap("Weights") = mix(0.2, 1, mask)
fit(v, omin, omax, nmin, nmax) Map v from [omin, omax] to [nmin, nmax], clamped to the new range. remap is the same function. wmap("Weights") = fit(P.z, 0, 100, 0, 1)
remap(v, omin, omax, nmin, nmax) Alias of fit. wmap("Weights") = remap(d, 0, 25, 1, 0)
fit01(v, nmin, nmax) Convenience alias of fit(v, 0, 1, nmin, nmax). wmap("Weights") = fit01(mask, -1, 1)
step(edge, x) 0 while x < edge, else 1 (HLSL order). wmap("Weights") = step(50, P.z)
smoothstep(e0, e1, x) Hermite ramp from 0 at e0 to 1 at e1, clamped. wmap("Weights") = smoothstep(0, 25, d)
mod(a, b) Remainder with the sign of a; b = 0 is guarded to 0. wmap("Weights") = mod(ptnum, 2)
rand(seed) Deterministic hash of the seed to [0,1). Same seed, same value, every run and every machine. wmap("Weights") = rand(ptnum)
trunc(x) Toward zero. Differs from floor for every negative non-integer: trunc(-1.5) is -1, floor(-1.5) is -2. wmap("Weights") = trunc(-1.5)
exp2(x) 2 to the x; overflow is guarded to 0. wmap("Weights") = exp2(3)
log10(x) Base-10 log; x <= 0 is guarded to 0. wmap("Weights") = log10(1000)
hypot(x, y) sqrt(xx + yy) - the 2D length, for uv and other two-component work. wmap("Weights") = hypot(uv.x - 0.5, uv.y - 0.5)
inversesqrt(x) 1 / sqrt(x); x <= 0 is guarded to 0. wmap("Weights") = inversesqrt(dot(P, P))
sinh(x) Hyperbolic sine; overflow is guarded to 0. wmap("Weights") = sinh(1)
cosh(x) Hyperbolic cosine; overflow is guarded to 0. wmap("Weights") = cosh(0)
tanh(x) Hyperbolic tangent, always in (-1, 1). The standard soft clip: it compresses large values instead of cutting them off the way clamp does. wmap("Weights") = tanh(P.z * 0.1)
finite(x) 1 if x is finite, else 0. Finite(x) and isfinite(x) are the same function. Arithmetic already replaces overflow and divide-by-zero with 0, so finite(Num / Den) on a quotient the expression produced is 1; test the inputs (finite(Den) && Den != 0) when you care. wmap("Weights") = finite(1)
isnan(x) 1 if x is NaN, else 0. wmap("Weights") = isnan(0)
isinf(x) 1 if x is infinite, else 0. wmap("Weights") = isinf(0)
cbrt(x) Cube root, sign-preserving (unlike pow(x, 1/3), which guards every negative x to 0). wmap("Weights") = cbrt(-8) // -2
bias(x, b) Schlick's fast bias curve: pushes x toward 0 (b < 0.5) or 1 (b > 0.5); b = 0.5 is the identity. x is clamped to [0,1], b to a safe (0,1) range. wmap("Weights") = bias(mask, 0.25)
gain(x, g) S-curve built from bias: steepens the middle and flattens the ends (g < 0.5) or the reverse (g > 0.5); g = 0.5 is the identity. Same clamping as bias. wmap("Weights") = gain(mask, 0.75)

Vector functions

Syntax What it does Example
vec3(x, y, z) Build a vector from three scalars. Compiles to nothing. vector up = vec3(0, 0, 1)
dot(a, b) Dot product of two vectors. wmap("Weights") = dot(N, vec3(0,0,1))
cross(a, b) Cross product (left-handed, like the rest of UE). vector t = cross(N, vec3(0,0,1))
length(v) or length(x, y, z) Euclidean length. Both spellings are the same function. wmap("Weights") = length(P - nearpoint("Reference", P))
distance(a, b) length(a - b). wmap("Weights") = distance(P, vec3(0,0,0))
normalize(v) v / length(v); the zero vector is guarded to the zero vector (and counted). N = normalize(N)
lerp(a, b, t) Component-wise blend of two vectors by a scalar t. mix works too. P = lerp(P, nearpoint("Reference", P), 0.5)
reflect(i, n) i - 2 * dot(i, n) * n; n is used verbatim (normalise it yourself). vector r = reflect(v, N)
planedist(planept, planenormal, p) Signed distance from p to the plane through planept with the given normal - positive on the side the normal points to. The normal is normalised for you; a zero-length one is guarded to 0. wmap("Weights") = planedist(vec3(0,0,0), vec3(0,0,1), P)
ptlined(a, b, p) Distance from p to the segment a-b (VEX's own argument order: the two endpoints, then the point). A degenerate segment (a == b) falls back to distance(p, a). wmap("Weights") = ptlined(vec3(0,0,0), vec3(0,0,10), P)

Integers

Syntax What it does Example
bitand / bitor / bitxor bitand(a, b) / bitor(a, b) / bitxor(a, b) Bitwise and / or / xor of two integral operands. wmap("Weights") = bitand(floor(ptnum), 3)
bitnot(a) Bitwise not (one's complement) of one integral operand. wmap("Weights") = bitnot(0)
shl / shr shl(a, count) / shr(a, count) Shift left / arithmetic (sign-preserving) shift right. count is clamped to [0, 63] and the clamp is counted (DomainGuarded) when it fires. wmap("Weights") = shl(1, 4)
floordiv(a, b) Floor division: floor(a / b), exact even where / followed by floor() would lose precision. Differs from / at every negative result - floordiv(-7, 2) is -4, not -3.5 truncated. b == 0 is guarded to 0 (DivideByZero), same as /. wmap("Weights") = floordiv(-7, 2)

What these are

Eight functions filling gaps float arithmetic leaves - there is still no separate integer type anywhere in this language: every one of these takes and returns an ordinary float, so any local, channel or attribute can carry an integral value straight through them. Operands must be exactly integral and within +-2^53 (the largest integer a double represents exactly) or the result is 0, counted (DomainGuarded) - the same "defined fallback, always counted" convention every other domain guard in this file uses.

wmap("Weights") = bitand(ptnum, 1)

imod(a, b)

Euclidean modulo: always in [0, |b|), never negative. % and mod() keep their existing fmod behaviour (the sign of the dividend, so mod(-7, 3) is -1) - imod exists because that trap catches almost everyone who reaches for "wrap an index into range": imod(-7, 3) is 2, which is the wrap-around answer % does not give you. b == 0 is guarded to 0 (DivideByZero).

wmap("Weights") = imod(ptnum - 1, numpt)

Debug

trace(x)

Returns x unchanged, and folds it into this call site's running count/min/max/mean, reported in the node's run Summary as "trace at line N: count ..., min ..., max ..., mean ...". A read-back for what an expression actually computed without adding a permanent output. Legal in every run-over. Up to 64 trace() sites per expression; a 65th is a compile error naming the cap. Trace values are only reported by the Wrangle node's own run summary - the Custom Force (simulation) expression compiles trace() calls but discards the report, so trace() there returns x unchanged with no readable stats anywhere.

wmap("Weights") = trace(P.z) * 2

Studio and Graph › Geometry › Wrangle

Noise

Deterministic simplex noise: the same input gives the same value on every run and every machine.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Syntax What it does Example
noise(p) or noise(x, y, z) Scalar simplex noise, range about [-1, 1]. The two spellings are the same function. Coordinates are in cm, so scale P down before sampling. wmap("Weights") = noise(P * 0.05)
noise (seeded) noise(p, seed) or noise(x, y, z, seed) Same as noise(), with an explicit seed so two calls at the same point give different fields. seed 0 is bit-identical to the unseeded form. wmap("Weights") = noise(P * 0.05, layer)
vnoise(p) Three decorrelated simplex samples as a vector; each component is about [-1, 1]. Use it to push points in a direction rather than along one axis. P += vnoise(P * 0.02) * 3
vnoise (seeded) vnoise(p, seed) Same as vnoise(), seed-offset the same way. seed 0 is bit-identical to the unseeded form. P += vnoise(P * 0.02, layer) * 3
curlnoise(p) A divergence-free vector field (the standard "curl noise" construction), built from central differences of vnoise. Useful for swirly motion that never converges to a point or drains into one. P += curlnoise(P * 0.02) * 2
curlnoise (seeded) curlnoise(p, seed) Same construction, seed-offset. P += curlnoise(P * 0.02, layer) * 2
cellular(p) Euclidean distance from p to the nearest cellular feature point. 0 on a feature point, rising to roughly 1 between them. Not normalised - put a fit() after it if you need a fixed range. wmap("Weights") = saturate(cellular(P * 0.1))
fbm(p, octaves) Fractal sum of simplex octaves, normalised to about [-1, 1]. Lacunarity 2, gain 0.5. wmap("Weights") = fbm(P * 0.02, 5)
fbm(p, octaves, lacunarity, gain) The full form. Lacunarity is the frequency step per octave, gain the amplitude step. wmap("Weights") = fbm(P * 0.02, 6, 2.5, 0.4)
fbm (seeded) fbm(p, octaves, lacunarity, gain, seed) The full form with an explicit seed, so two fbm() layers at the same point give different fields. seed 0 is bit-identical to the unseeded form. wmap("Weights") = fbm(P * 0.02, 6, 2.5, 0.4, layer)
octave clamp octaves is clamped to 1..32 and the clamp is counted and reported. One fbm() call is a single step whatever its octave count, so an unclamped count would escape the per-element step budget. Same clamp applies to ridged(). wmap("Weights") = fbm(P, 100) // clamped to 32, reported
ridged(p) Musgrave ridged multifractal noise, range about [-1, 1] like fbm() but shaped as sharp ridges near 1 instead of a smooth hump - good for mountain-like detail. Defaults: 6 octaves, lacunarity 2, gain 0.5. wmap("Weights") = ridged(P * 0.02)
ridged(p, octaves, lacunarity, gain) The full form, same parameter meanings as fbm's full form. wmap("Weights") = ridged(P * 0.02, 6, 2.2, 0.6)
ridged (seeded) ridged(p, octaves, lacunarity, gain, seed) The full form with an explicit seed, same relationship to the unseeded form that fbm's seeded overload has. wmap("Weights") = ridged(P * 0.02, 6, 2.2, 0.6, layer)

Studio and Graph › Geometry › Wrangle

Neighbours, transforms and distance

Walking the one-ring, moving points and frames around, and geodesic distance across the surface.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Neighbours

Vertex or corner domain only; compile error in the triangle domain, except the prim forms which are triangle or corner.

Syntax What it does Example
neighbourcount(p) How many points share an edge with point p. neighborcount is the same function. wmap("Weights") = neighbourcount(ptnum)
neighbour(p, i) The i-th one-ring neighbour of p, as a point id. neighbor is the same function. An out-of-range i returns p itself and is counted. wmap("Weights") = neighbour(ptnum, 0)
neighbourweight(p, i) Cotangent weight of the i-th one-ring neighbour of p (uniform 1/valence fallback when the cotan contribution is degenerate). neighborweight is the same function. Same out-of-range convention as neighbour(). Vertex or Corner domain. float w = neighbourweight(ptnum, 0)
pointpos(p) Position of any point, as a vector. In Vertex/Corner mode reads the mesh as it was before this expression ran. In Detail mode with setpointpos, reads the working copy so later foreach-points iterations see prior writes. vector q = pointpos(neighbour(ptnum, 0))
pointnormal(p) Normal of any point, as a vector - the same split-element mean the N channel reads. wmap("Weights") = dot(N, pointnormal(neighbour(ptnum, 0)))
neighbourprimcount(t) How many triangles share an edge with triangle t. neighborprimcount is the same function. Triangle or Corner domain. wmap("Weights") = neighbourprimcount(primnum)
neighbourprim(t, i) The i-th edge-adjacent triangle id. neighborprim is the same function. Out-of-range returns t itself and is counted. Triangle or Corner domain. float n = neighbourprim(primnum, 0)
smooth_implicit(lambda) One whole-mesh implicit smooth (M + lambda L) X = M P0 solved directly, as a pre-pass. lambda is a compile-time positive scalar. Returns the smoothed position of the current vertex (the owning vertex, in Corner). Vertex or Corner only. P = smooth_implicit(1)
smoothing (recipe) One-ring Laplacian smooth, the reason loops and neighbours exist. Prefer relax(n) or smooth_implicit(lambda) for a pre-pass; or sum neighbourweight() by hand. vector s = vec3(0,0,0); float n = 0; foreach (nb in neighbours(ptnum)) { s += pointpos(nb); n += 1 }; if (n > 0) { P = lerp(P, s / n, 0.5) }

isboundary() or isboundary(p)

1 if the point lies on the mesh boundary (any of its edges is shared by only one triangle), else 0. Isolated vertices with no edges are 0. Out-of-range p returns 0 and is counted. isboundary() is Vertex or Corner (current vertex; in Corner, the corner's owning vertex). isboundary(p) is Vertex, Corner or Detail.

if (isboundary()) { Cd = vec3(1,0,0) }

relax(n)

Jacobi cotangent-weighted smooth, run as a whole-mesh pre-pass before the per-vertex expression. n is a compile-time positive integer literal, at most 4096; asking for more is a compile error naming the ceiling, not a silently smaller n. Returns the relaxed position of the current vertex (in Corner, the corner's owning vertex). Vertex or Corner only.

P = relax(4)

Transforms

Syntax What it does Example
rotatevector(v, axis, degrees) Rodrigues rotation of v about axis by degrees. Axis need not be unit; a zero axis leaves v unchanged (counted). P = rotatevector(P, vec3(0,0,1), 90)
dihedral(v, a, b) Rotate v by the rotation that takes a onto b. P = dihedral(P, vec3(0,0,1), N)
polar(v) Cylindrical: vec3(r, theta, z) with r = hypot(x,y), theta = atan2(y,x). vector c = polar(P)
frompolar(r, theta, z) Inverse of polar: vec3(rcos(theta), rsin(theta), z). P = frompolar(c.x, c.y, c.z)
relbbox() or relbbox(p) (p - bboxmin()) / bboxsize(), with a zero size component guarded to 0. Zero-arg form uses P (Vertex/Triangle/Corner). Explicit p works in Detail too. wmap("Weights") = relbbox().z
displace(s) / displace(s, mode) normalize(N) * s, area-weighted by default (vertex area / mean area). mode 0 = unweighted, nonzero = area (default). Does not write P. Vertex or Corner only (area weight uses the owning vertex, in Corner). P += displace(2)
ident / ident3 ident() / ident3() Identity matrix4 / matrix3. matrix M = ident()
quaternion(axis, degrees) Quaternion from axis-angle. quaternion q = quaternion(vec3(0,0,1), 90)
quaternion / quat quaternion(m3) / quat(m3) Quaternion from a rotation matrix3 (Shepperd's method), renormalised. Assumes m3 is a pure rotation - feed it a scale/shear matrix and you get an answer, not an error. quaternion q = quaternion(lookat(P, target, vec3(0,0,1)))
slerp(q1, q2, t) Spherical linear interpolation. Takes the short arc (a quaternion and its negative represent the same rotation, and slerp knows it), falls back to a plain lerp when the two are nearly identical, and always returns a unit quaternion. quaternion q = slerp(qa, qb, 0.5)
eulertoquat / quattoeuler eulertoquat(v) / quattoeuler(q) Convert between a quaternion and XYZ-degree Euler angles - the same convention maketransform's euler argument uses, so the two always agree. quattoeuler clamps at the +-90 degree gimbal singularity instead of returning NaN. quaternion q = eulertoquat(vec3(0, 90, 0))
qmul / qrotate qmul(a,b) / qrotate(q,v) Quaternion product; rotate a vector by a quaternion. vector r = qrotate(q, vec3(1,0,0))
lookat(from, to, up) matrix3 basis: Z=normalize(to-from), X=normalize(cross(up,Z)), Y=cross(Z,X). Degenerate -> ident3 (counted). matrix3 R = lookat(P, target, vec3(0,0,1))
maketransform(t, euler_deg, s) / maketransform(t, q, s) matrix4 TRS. Euler is XYZ degrees. matrix M = maketransform(t, r, s)
ptransform / vtransform / ntransform (p|v|n, m4|m3) ptransform applies Rp+t (m4) or Rp (m3); vtransform is R*v; ntransform is inverse-transpose then normalize. P = ptransform(P, M)
invert / transpose invert(m3|m4|q) / transpose(m3|m4) Same-type inverse/transpose. Singular -> identity (counted). matrix Minv = invert(M)

Geodesic distance

Vertex or Corner domain only; compile error in the triangle domain, Texel or a Custom Force expression.

geodist("SeedMap")

Geodesic (along-the-surface, heat-method) distance from the current vertex (the owning vertex, in Corner) to the nearest painted vertex of the named Weight Map parameter pin - a whole-mesh pre-pass, computed once per distinct seed map before the run starts, exactly like relax()/smooth_implicit(). "Painted" means weight above the same small epsilon Restrict-by-Mask uses. An empty/missing seed map, or a solver failure on a disconnected/degenerate mesh, leaves every distance at a large finite sentinel (1e19) - far enough that a falloff built from it reads as zero influence, still a normal number the rest of the language can do arithmetic on.

wmap("Weights") = 1 - saturate(geodist("Seeds") / 50)

Studio and Graph › Geometry › Wrangle

Donor mesh pins

Reading a second mesh by pin name: positions, normals, attributes, nearest points and ray hits. Every donor, including one named Reference, is read through the pin-qualified functions below - there...

Reading a second mesh by pin name: positions, normals, attributes, nearest points and ray hits. Every donor, including one named Reference, is read through the pin-qualified functions below - there is no bare, no-pin-name overload of any of them.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Syntax What it does Example
npoints("Pin") Vertex count of the named mesh. wmap("Weights") = npoints("Reference") > 0
pointpos("Pin", i) Position of vertex i on the named mesh, as a vector. vector q = pointpos("Donor", ptnum)
pointnormal("Pin", i) Mean split-normal of vertex i on the named mesh, as a vector. N = pointnormal("Donor", ptnum)
nprims() / nprims("Pin") Triangle count of the subject mesh, or of the named donor. Legal in every run-over. wmap("Weights") = nprims()
primpoints(t, k) / primpoints("Pin", t, k) Vertex id of corner k (0..2) of triangle t. Out-of-range returns -1 and is counted. Legal in every run-over. float a = primpoints(primnum, 0)
materialid() / materialid("Pin", t) Triangle MaterialID (0 if none). Read-only. Current-face form needs Triangle or Corner domain (in Corner, the owning triangle). wmap("Weights") = materialid()
numpolygrouplayers() / numpolygrouplayers("Pin") Total layer count, always >= 1 (layer 0 always counts, even with no groups enabled). Scalar, every run-over. float n = numpolygrouplayers()
hitprim("Pin", p) Triangle id of the nearest surface point on the named donor, or -1. float t = hitprim("Donor", P)
hitbary("Pin", p) Barycentric coords of that nearest hit, as a vector. vector b = hitbary("Donor", P)
primuv("Pin", p) PrimaryUV barycentric blend at the nearest hit, as vec3(u,v,0). vector u = primuv("Donor", P)
uvbary("Pin", u, v[, layer]) Barycentric coords of the uvhitprim() hit, as vec3 - zero vector on a miss. vector b = uvbary("Donor", uv.x, uv.y)
neardist("Pin", p) Distance from p to the nearest point on the named mesh's surface. Unsigned - it does not know inside from outside. wmap("Weights") = 1 - saturate(neardist("Reference", P) / 25)
nearpoint("Pin", p) The nearest point on the named mesh's surface, as a vector. P = lerp(P, nearpoint("Reference", P), mask)
sdist("Pin", p) Signed distance to the named mesh: negative inside, positive outside (unsigned via the same query as neardist, sign via a winding-number test). Costs more than neardist - only ask for it when the sign matters. wmap("Weights") = sdist("Reference", P) < 0
rayhitpos("Pin", origin, dir) The first hit's position along the same watertight ray raydist() casts - origin itself on a miss (raydist's own "a miss is a defined sentinel" convention, not a counted guard). Zero-length dir is guarded the same way raydist's is. P = rayhitpos("Donor", P, -N)
rayhitprim("Pin", origin, dir) The first hit's triangle id along the same ray, or -1 for a miss - raydist()'s own -1-for-miss convention. float t = rayhitprim("Donor", P, -N)
primarea(t) / primarea("Pin", t) Triangle area in cm^2 of an explicit triangle id t, on the subject mesh or the named donor - unlike materialid()/polygroup() this never reads the current face, so (like primpoints(t, k)) it is legal in every run-over. Invalid t returns 0 and is counted. float a = primarea("Donor", hitprim("Donor", P))
primnormal(t) / primnormal("Pin", t) Triangle normal of an explicit triangle id, as a vector. Same shape and guard as primarea. N = primnormal("Donor", hitprim("Donor", P))
primcentroid(t) / primcentroid("Pin", t) Triangle centroid of an explicit triangle id, as a vector. Same shape and guard as primarea. vector c = primcentroid(primnum)
maxprims() / maxprims("Pin") The highest triangle id ever allocated (MaxTriangleID()) - the primpoints()/materialid()-style twin of maxpoints(). for (t = 0; t < maxprims(); t += 1) { s += primarea(t) }

Mesh parameter

Add a Parameter of type Mesh and it becomes an input pin, exactly like Float/Vector/Int/Bool ones - see the Parameters page for the shared naming rules (case sensitive, no colliding-with-a-language-name rule) and primary for the subject/Reference distinction. Unlike the value types it has no bare-read or ch()-family form: a Mesh parameter is only ever read through the functions below, by its pin name in quotes.

Parameters list, type Mesh, name "Donor"

Pin names - "Mesh" / "Reference" / "YourParam"

Every function below takes the source mesh's pin name as its first argument, a string literal in quotes. "Mesh" always resolves to the subject - your primary Mesh parameter (the node's own alias for it) - even when you named it something other than "Mesh"; reading it is safe even while this same expression is writing P/N/Cd, because donor reads only ever see data from before this run, same as pointpos()/pointnormal() above. "Reference" resolves to whichever Mesh parameter you named Reference (an ordinary declared parameter, no different from "Donor" - just a name every doc example and the pin-editor's Add Classic Mesh Setup button agree on). Naming a pin that does not exist, or a Mesh parameter that is not currently wired, is a compile error: No mesh input named X is connected.

wmap("Weights") = npoints("Mesh")

pointattr("Pin", "name", i)

A per-vertex value of the named mesh at vertex i: "P" (position), "N" (mean normal), "Cd" (colour rgb) and "uv"/"uv0"/"uvN" (a UV channel mean as vec3(u,v,0) - "uv" and "uv0" both mean channel 0, "uvN" (N>=1) means channel N; an out-of-range N is a compile error) are built in; any other name must be a tagged Float, Int, Vector 2 (as vec3 x,y,0), Vector 3 or Vector 4 (xyz only) vertex attribute on that mesh - triangle attributes are a compile error naming what the attribute really is (use surfattr() instead). An out-of-range i returns 0 (or the zero vector) and is counted like every other point-index guard in this language.

wmap("Weights") = pointattr("Donor", "thickness", ptnum)

polygroup() / primgroup() / pin forms

Layer-0 group id, or 0 if none. Layer 0 is the mesh's own polygroups - the layer GenerateCageMesh/Retopologize/SelectFromMesh actually write - not a polygroup attribute layer; those are numbered from 1 upward, see polygroup(t, layer) below. Same shape as materialid.

wmap("Weights") = polygroup()

polygroup(t, layer) / polygroup("Pin", t, layer)

Explicit triangle id and a runtime scalar layer: layer 0 is the mesh's own groups (same value as polygroup()); layer k>=1 reads the mesh's k-1'th polygroup attribute layer. Legal in every run-over, self or donor - unlike polygroup()'s current-face form. An out-of-range layer or triangle returns 0 and is counted.

float g = polygroup(primnum, 1)

uvhitprim("Pin", u, v[, layer])

The triangle containing UV position (u, v) in the named donor's UV channel (layer, a constant whole number, defaults to 0) - lowest triangle id on an overlap (two UV islands sharing the same UV space sample deterministically regardless of which was appended to the mesh first), or -1 for a miss. A containment test, unlike hitprim()'s nearest-3D-point search. A miss counts nothing, the raydist() convention. No implicit wrap or clamp - write frac(u) yourself for tiling.

float t = uvhitprim("Donor", uv.x, uv.y)

uvsample("Pin", "name", u, v[, layer])

A value sampled at UV position (u, v) in the named donor's UV channel (layer, a constant whole number, defaults to 0) - the UV-space twin of surfattr(), same samplable set ("P" position, "N" normal, "Cd" colour, or a tagged Float/Int/Vector 3 attribute; bare "uv" is refused, same reason as surfattr's) and the same Vertex-blend/Triangle-direct domain rule. Legal in every run-over - Texel is the headline use, since a texel could not otherwise read the mesh it is texturing. A miss returns 0 (or the zero vector) and counts one OutOfRangeIndex guard (unlike uvhitprim/uvbary, which count nothing for a miss).

Cd = uvsample("Donor", "Cd", uv.x, uv.y)

surfattr("Pin", "name", p)

A value sampled on the surface of the named mesh at the point nearest to p - the headline donor query. "P" is the nearest surface point itself; "N" and "Cd" are barycentric-blended across the hit triangle's three corners (N is re-normalised after blending); "uv0"/"uvN" is a UV channel barycentric blend as vec3(u,v,0) (bare "uv" is refused - circular, which channel would it even mean); any other name must be a tagged Float, Int or Vector 3 attribute - a vertex one is blended the same way, a triangle one is taken directly from the hit triangle, since a face's own attribute has no corners to blend across.

vector surf = surfattr("Donor", "P", P); float thick = surfattr("Donor", "thickness", P)

raydist("Pin", origin, dir)

Distance along dir from origin to the first hit on the named mesh's surface, or -1 for a miss. dir is normalised for you; a zero-length dir is guarded to a miss. Uses a watertight ray test, so a ray that visibly grazes a triangle edge still registers a hit - the naive nearest-hit query this avoids is known to miss those.

wmap("Weights") = raydist("Donor", P, -N)

nearestpoint("Pin", p)

The donor vertex id nearest p (an expanding search: starts at bbox/64, doubles until it finds one or has covered the donor's own bounding-box diagonal) - -1 when the donor has no vertices, counted. This is the id every per-vertex donor transfer needed and neardist()/nearpoint() (nearest surface point) could not supply: feed it into pointpos()/pointattr()/boneweight-by-index and so on.

float srcId = nearestpoint("Donor", P); Cd = pointattr("Donor", "Cd", srcId)

foreach (i in nearpoints("Pin", p, r)) { ... }

Iterate every donor vertex id within r of p, sorted ascending so the visiting order is the same on every run (the underlying spatial search is not itself ordered - the sort exists so you never have to think about that). Vertex, Corner or Detail run-over, gathered fresh once per loop entry, not re-queried per iteration.

foreach (i in nearpoints("Donor", P, 5)) { Cd += pointattr("Donor", "Cd", i) }

maxpoints() / maxpoints("Pin")

The highest vertex id the subject mesh (or the named donor) has ever allocated (the highest id ever handed out) - not npoints()'s live count. The two agree only on a mesh that has never had a vertex deleted; once one has, a raw-id accessor like pointattr()/primpoints() needs this to know how far ids can run, not the live count.

for (i = 0; i < maxpoints("Donor"); i += 1) { if (pointpos("Donor", i) != vec3(0,0,0)) { s += 1 } }

Studio and Graph › Geometry › Wrangle

Textures and landmarks

Sampling a Texture pin, and reading or writing a Landmarks pin.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Textures

Read a Texture input pin by name - legal in every domain, including Texel.

Syntax What it does Example
Texture parameter Add a Parameter of type Texture and it becomes an input pin - a plain object pin, wire it a texture exactly like Load Texture From File's own output. No bare-read or ch()-family form: a Texture parameter is only ever read through the functions below, by its pin name in quotes. Parameters list, type Texture, name "Albedo"
pin names "Albedo" Every function below takes the texture pin's name as its first argument, a string literal in quotes. Naming a pin that does not exist, or one that is not currently wired, is a compile error: No texture input named X is connected. Cd = texture("Albedo", uv.x, uv.y)
texture("Pin", u, v) Bilinear sample, linear colour space, as a vector (rgb). u/v outside [0,1] wrap (a tiling texture stays continuous across the seam), matching every other texture consumer in this app. Cd = texture("Albedo", uv.x, uv.y)
texturea("Pin", u, v) The same bilinear sample's alpha, alone. Cd.a = texturea("Albedo", uv.x, uv.y)
v origin v=0 is the top row of the image, the UE-native convention - a UV of (0,0) addresses the top-left texel, the same as every other texture consumer in this app (the UV-layout renderer, Project Texture). wmap("Weights") = texturea("Stencil", uv.x, uv.y)
texel("Pin", x, y) Unfiltered read of one integer texel, as a vector (rgb) - no interpolation. x/y outside the image clamp to the nearest edge texel and count an out-of-range guard, unlike texture()'s wrap. vector c = texel("Albedo", texelx(), texely())
texwidth("Pin") The texture's native width in texels. float u = texelx() / texwidth("Albedo")
texheight("Pin") The texture's native height in texels. float v = texely() / texheight("Albedo")

Landmarks

Read a Landmarks input pin by name - legal in every Run Mode.

Syntax What it does Example
Landmarks parameter Add a Parameter of type Landmarks and it becomes an input pin (the same "Landmarks" struct every landmark tool in this app uses). No bare-read form: read it through the functions below, by pin name in quotes. Parameters list, type Landmarks, name "Guide"
pin names "Guide" Every function below takes the pin's name as its first argument, a string literal in quotes. Naming a pin that does not exist, or one that is not currently wired, is a compile error: No Landmarks input named X is connected. wmap("Weights") = numlandmarks("Guide")
numlandmarks("Pin") Source/target pair count of the named pin. for (i = 0; i < numlandmarks("Guide"); i += 1) { s += landmarksrc("Guide", i) }
landmarksrc("Pin", i) Source position of pair i, as a vector. An out-of-range i returns the zero vector and is counted, like every other point-index guard in this language. vector s0 = landmarksrc("Guide", 0)
landmarkdst("Pin", i) Target position of pair i, as a vector. Same out-of-range convention. vector d0 = landmarkdst("Guide", 0)
nearlandmark("Pin", p) Index of the source landmark nearest p by Euclidean distance, or -1 when the pin has no pairs. Ties break to the lowest index, so the answer is the same on every run. float i = nearlandmark("Guide", P); P = lerp(P, landmarkdst("Guide", i), 0.5)
numsplines("Pin") How many spline pairs the named Landmarks pin carries. Legal in every run-over. wmap("Weights") = numsplines("Guide")
splinesample("Pin", u) / splinesample("Pin", i, u) Sample a source spline polyline at u in [0,1] by cumulative length (index lerp if length is 0). Prefers baked samples, else control points. Empty or out of range -> zero vector (counted). vector p = splinesample("Guide", 0.5)
splinesampledst("Pin", i, u) Same for a dest spline. vector q = splinesampledst("Guide", 0, 0.5)

Index order

Pairs are indexed in a canonical order - lexicographic by source position (X, then Y, then Z), ties broken lexicographically by destination position - not the pin's own internal storage order (not stable across a save/load round trip) and not the order they were placed in (a map does not remember that). Two pins with the same pairs always agree with each other, and with themselves after a save/load; do not assume index 0 is "the first one you placed".

Studio and Graph › Geometry › Wrangle

MetaHuman DNA

Reading a MetaHuman DNA by pin name from the expression: joints, meshes, blend shapes, controls and skin weights.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Syntax What it does Example
dnacount (mesh) dnacount("Pin", "what", mesh) A per-mesh count for kind "what" - vertices, normals, uvs, layouts, faces, skinweights, maxinfluences, blendshapetargets, meshregions - at the named mesh index. Naming a whole-DNA kind here is a compile error naming the fix. float n = dnacount("Head", "vertices", 0)
dnajoint("Pin", "Name") Compile-time joint-name lookup: the index of the named joint on this DNA, or a compile error listing every joint name present. Case sensitive. float j = dnajoint("Head", "head")
dnamesh("Pin", "Name") Compile-time mesh-name lookup, same rule as dnajoint. float m = dnamesh("Head", "head_lod0")
dnablendshape("Pin", "Name") Compile-time blend shape channel-name lookup, same rule as dnajoint. float c = dnablendshape("Head", "bs_a")
dnacontrol("Pin", "Name") Compile-time raw control-name lookup, same rule as dnajoint. float c = dnacontrol("Head", "raw_a")
dnaguicontrol("Pin", "Name") Compile-time GUI control-name lookup, same rule as dnajoint. float c = dnaguicontrol("Head", "gui_a")
dnaanimatedmap("Pin", "Name") Compile-time animated map-name lookup, same rule as dnajoint. float a = dnaanimatedmap("Head", "am_a")
dnajointparent("Pin", j) Parent joint index of joint j. Out-of-range j returns 0 and is counted. float p = dnajointparent("Head", dnajoint("Head", "head"))
dnajointpos("Pin", j) Neutral (bind) translation of joint j, as a vector. Out-of-range j returns the zero vector and is counted. vector t = dnajointpos("Head", 2)
dnajointrot("Pin", j) Neutral (bind) rotation of joint j, as a vector of Euler degrees. Out-of-range j returns the zero vector and is counted. vector r = dnajointrot("Head", 2)
dnavertex("Pin", "Mesh", i) Vertex position i of the named mesh, as a vector. Out-of-range mesh or vertex index returns the zero vector and is counted. vector p = dnavertex("Head", "head_lod0", 0)
dnanormal("Pin", "Mesh", i) Vertex normal i of the named mesh, as a vector - same guard convention as dnavertex. vector n = dnanormal("Head", "head_lod0", 0)
dnauv("Pin", "Mesh", i) Texture coordinate i of the named mesh, as vec3(u, v, 0). Out-of-range returns the zero vector and is counted. vector t = dnauv("Head", "head_lod0", 0)
dnabschannel("Pin", "Mesh", t) The blend shape channel index that blend shape target t of the named mesh drives. Out-of-range mesh or target returns 0 and is counted. float c = dnabschannel("Head", "head_lod0", 0)
dnadeltacount("Pin", "Mesh", t) Delta count of blend shape target t on the named mesh. Same guard convention as dnabschannel. float n = dnadeltacount("Head", "head_lod0", 0)
dnadelta("Pin", "Mesh", t, k) Delta k of blend shape target t on the named mesh, as a vector. Out-of-range mesh, target or delta index returns the zero vector and is counted. vector d = dnadelta("Head", "head_lod0", 0, 0)
dnadeltavertex("Pin", "Mesh", t, k) The vertex index delta k of blend shape target t moves, on the named mesh. Same guard convention as dnadelta. float v = dnadeltavertex("Head", "head_lod0", 0, 0)
dnaskinweight("Pin", "Mesh", v, j) The skin weight joint j contributes to vertex v of the named mesh, or 0 when joint j does not influence that vertex - absence is a legitimate answer, not counted (the delta()-family convention). An out-of-range mesh or vertex is counted. float w = dnaskinweight("Head", "head_lod0", 0, dnajoint("Head", "head"))
dnaskinweights("Pin", "Mesh", v) Every skin weight influencing vertex v of the named mesh, as a fresh float[] - index-parallel with dnaskinjoints(). Out-of-range mesh or vertex returns an empty array (handle 0) and is counted. float[] w = dnaskinweights("Head", "head_lod0", 0)
dnaskinjoints("Pin", "Mesh", v) The joint index for each entry of dnaskinweights() at the same vertex, as a fresh float[] cast from the DNA's own integer joint indices. Same guard convention as dnaskinweights. float[] j = dnaskinjoints("Head", "head_lod0", 0)
dnaposescale("Pin", p) Scale factor of RBF pose p. Out-of-range p returns 0 and is counted. float s = dnaposescale("Head", 0)

DNA parameter

Add a Parameter of type DNA and it becomes an input DNA pin named as the param - the same "name pins by parameter" rule Delta/WeightMap/Mesh already follow. No bare-read form - read it through the dna*() functions below, by pin name in quotes (case sensitive, unlike bone names elsewhere in this language). Missing/unconnected pin is a compile error: No DNA input named X is connected.

Parameters list, type DNA, name "Head"

dnacount("Pin", "what")

A whole-DNA count for kind "what" - lods, joints, meshes, blendshapechannels, rawcontrols, guicontrols, animatedmaps, mlcontrols, neuralnetworks, jointgroups, psds, jointrows, jointcolumns, meshblendshapemappings, rbfsolvers, rbfposes, rbfposecontrols, twists, swings. Unknown kind is a compile error listing every kind name. Naming a per-mesh kind here (see the next row) is a compile error naming the fix.

wmap("Weights") = dnacount("Head", "joints")

Raw space

Every dna*() function returns the value exactly as the DNA stores it - the DNA's own coordinate system, translation unit and rotation unit, read straight off the file. It is not converted to the app's UE space. For a pin buffer that is Maya/Source ({Left, Up, Front}, cm, degrees), confirm with the descriptor. Convert it with the DNA coordinate-space helpers on the C++ side, or apply the swizzle yourself in the expression.

Studio and Graph › Geometry › Wrangle

Run modes: Texel and Corner

What one run corresponds to in the two per-element modes that are not Vertex or Triangle, and what each one may touch.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Run over: Texel

Run Mode = Texel - Domain/Run Per is ignored.

What it is

Set Run Mode to Texel and the code runs once per texel of a durable output image this node owns, instead of once per vertex or triangle. The subject Mesh parameter becomes optional: undeclared or unwired, the code still runs (against whatever texture parameters it names); wired, it passes through unchanged and doubles as the "Mesh" donor slot.

Cd = texture("Base", uv.x, uv.y) * 0.5

Cd - vec3 rgb, read/write

The texel's own colour. Seeded from the first wired Texture parameter (Parameters-list order), sampled at this texel (matching size) or bilinear at the texel centre (mismatched size); black with alpha 1 when none is wired.

Cd = vec3(1, 1, 1) - Cd

Cd.a - scalar, read/write

The texel's own alpha.

Cd.a = 1

uv - scalar components, read only

uv.x/uv.y are this texel's own centre, normalised to [0,1] - the same coordinates you would hand texture()/texturea() to read this exact texel back. Assigning to uv here is a compile error: a texel's position is fixed by which one it is, the same reason a triangle's P cannot be assigned.

Cd = texture("Ramp", uv.x, 0.5)

elemnum / numelem - scalar, read

This texel's flat index / texel count, exactly like every other domain.

Cd.a = elemnum / numelem

texelx() / texely()

This texel's own coordinates, as unwrapped integers (0 .. width-1 / 0 .. height-1) - the same position uv.x/uv.y give normalised. Legal only in this domain.

vector c = texel("Albedo", texelx() + 1, texely())

Not available

Everything that describes a mesh element is a positioned compile error here: P, N, mask, @attributes, wmap(...) writes, area, ptnum, neighbourcount()/neighbour()/pointpos()/pointnormal()/isboundary() (the self-mesh, no-pin forms). A texel is not a vertex or a triangle and has none of those.

P, N, mask, @name, wmap(...) writes, area, ptnum - all errors

Donor-mesh functions (npoints/pointpos/pointattr/neardist/nearpoint/surfattr/sdist/raydist with a pin argument) and every texture function: their pins are independent of the run-over. Parameters (ch()/chf()/chv()/chi()/chb() and bare reads) too. Detail constants (bboxmin() and friends) also stay legal but need the subject Mesh parameter declared and wired - with none, calling one is a compile error naming it.

float t = pointattr("Mesh", "thickness", 0)

Output

The result is OutputTextureWidth x OutputTextureHeight texels (0 = auto: the first wired Texture parameter's own size, else 1024), published on this node's primary Texture output if one exists (see primary on the Parameters page) - a plain texture you can wire anywhere a texture pin is accepted. Switching Run Mode to Texel does not create that output; Create pins from code (or the pin editor) adds one when the expression writes Cd. A step-budget abort or a compile failure discards the whole run, exactly like the other two domains: nothing new publishes, and the persisted output from the last successful run is left untouched.

Run over: Corner

Run Mode = Corner - Domain/Run Per is ignored.

What it is

Set Run Mode to Corner and the code runs once per corner (face-vertex/wedge) instead of once per vertex or triangle: cornerid = 3*tid + c, c in 0..2, for every live triangle's three corners, ascending. A mesh whose MaxTriangleID() exceeds MAX_int32/3 refuses the run with a node error rather than overflow the id.

N = normalize(N)

Why a corner exists

An overlay element (N, uv, Cd) has exactly one parent vertex, and a triangle references three distinct vertices, so one triangle references a given overlay element at most once - a corner is that (triangle, element) pair. Reading/writing "this corner's N" therefore always means one exact overlay element, never a vertex's several split elements averaged together the way Vertex mode's N does.

Split, never merged

Writing N/uv/Cd per corner can make two corners that used to share an overlay element disagree - a hard edge or a UV seam being authored by the expression, not just read. When that happens the shared element splits: one corner keeps the original element, the other(s) get a freshly split one as a fresh split element, grouped by exact bitwise equality (see the next row for why exact). Corners already written to the same value, or left unwritten and therefore still equal to the old value, are never split from each other - only genuine disagreement splits. The reverse never happens: this run-over never calls MergeElement, even when two corners' new values happen to end up equal. A seam that was deliberately split (an artist's hard edge, a UV chart boundary) must stay split - silently welding it because today's write happened to agree would destroy information the mesh cannot get back, and unpredictably so, since it would depend on what the expression happened to compute this run.

if (materialid() == 2) { N = vec3(0,0,1) } // splits at the material boundary

Exact equality, not epsilon

Grouping corners that share a value uses bitwise equality, not a tolerance. An epsilon comparison is not transitive (a within eps of b, b within eps of c, but a not within eps of c is possible), so which corners end up grouped together would depend on the order they happen to be compared in - not deterministic. Two corners you intend to be "close enough" to share an element should be made exactly equal on purpose (round() or a shared computation, e.g. read one corner's N and assign it to the other) rather than relying on two similar expressions to land on the same float bits by chance.

N = round(N * 1000) / 1000 // quantise on purpose so nearby corners actually match

Determinism

Corner ids are visited in a fixed order (ascending cornerid, i.e. ascending triangle id then 0/1/2), and every step of the apply pass that decides which elements split - the touched-element set and the split grouping - runs in that same ascending order, single threaded. Running the same program on the same mesh twice always produces the same element count and the same values in the same order; only the parallel per-corner candidate computation (TryToFloat, blend, clamp - no element-count-affecting decision) runs across workers.

wmap reduction

Each named WeightMap output write (wmap("Name") = ...) is promoted to the per-vertex mean over corners that actually wrote it (a serial, ascending-corner-id sum/count per vertex, for float-sum determinism) - a vertex none of whose corners wrote it keeps 0, exactly like Vertex mode's own "never written" default. A single corner conditionally writing wmap("Weights") = 1 on a vertex with three corners gives that vertex 1.0, not 1/3 - the mean is over writers, not over every corner.

if (cornerindex == 0) { wmap("Weights") = 1 }

Per-vertex normal buffer

If the mesh has both the split normal overlay and the legacy per-vertex normal buffer, Corner mode writes only the overlay - the per-vertex buffer is left exactly as it was, with a run-summary Note that it was not updated (never silently discarded). Rebuild it downstream (Recompute Normals, or any node that reads the overlay) if you need it in sync.

Restrict

Mask tests the corner's owning vertex (every corner of a vertex shares its fate, so a vertex is never partly included). MaterialID / PolyGroup test the owning triangle. Same Restrict dropdown as Mesh Domain.

Restrict = Material ID, Restrict Value = 2

Not available

Everything that needs exactly one current vertex to write is a positioned compile error here: P write (use Run Per = Vertex), setboneweight/clearinfluences (skin writes - several corners can share a vertex, so which one "wins" has no answer), setpointpos (Detail only). @attribute writes are refused outright too (promotion policy deferred - see the Attributes section).

P = ..., setboneweight(...), @name = ... - all errors in Corner

Everything else a Vertex-mode program could do, reading through PtNum/PrimNum instead of a bare vertex/triangle id: isboundary (both forms), materialid()/polygroup() (owning triangle), wmap("Name") (owning vertex), geodist/relax/smooth_implicit (owning vertex), relbbox()/displace() (owning vertex/normal), the point-topology family (neighbourcount/neighbour/neighbourweight/pointpos/pointnormal) and prim-topology family (neighbourprimcount/neighbourprim), foreach neighbours/neighbourprims/points()/nearpoints, and skin reads (boneweight/weight/weighti/numinfluences/influencebone/influenceweight - the owning vertex's working copy). Donor-mesh/texture/landmark/ramp/transform/delta functions and Parameters, exactly like every other domain.

wmap("Weights") = weight("root") + wmap("Falloff")

Studio and Graph › Geometry › Wrangle

Run mode: Detail

The mode that runs once for the whole mesh, and the only one that may add or remove geometry.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Run once: Detail

Run Mode = Detail.

What it is

Set Run Mode to Detail and the code runs exactly once for the whole mesh, single threaded, instead of once per vertex/triangle/texel - elemnum is 0 and numelem is 1. This is what makes side-effecting writes (landmarks, setoutput, setpointpos) safe: there is only ever one run, so there is nothing for two elements to race. The subject Mesh parameter is optional, exactly like Texel: undeclared or unwired, the code still runs; wired, it passes through (or is rewritten when setpointpos is used) and doubles as the "Mesh" donor slot.

clearlandmarks(); addlandmark(pointpos("Mesh", 0), pointpos("Mesh", 0) + pointnormal("Mesh", 0))

Not available

Everything that describes a current mesh element is a positioned compile error here, because Detail has none: P, N, uv, Cd, wmap(...) writes, mask, area, ptnum/numpt/primnum/numprim, @attributes (read one with pointattr("Mesh", "name", i) or surfattr("Mesh", "name", p) instead), foreach over neighbours, and neighbourcount()/neighbour()/pointnormal()/isboundary() (the no-argument form). pointpos(i) and isboundary(p) are legal here so foreach-over-points can read the working copy.

P, N, Cd, wmap(...) writes, mask, @name - all errors

Parameters (bare reads and ch()/chf()/chv()/chi()/chb()), detail constants (need the subject Mesh parameter wired), every donor-mesh function and every texture function - their pins are independent of the run-over, same as in Texel. Every landmark read function above. setoutput() and setpointpos() below. foreach (i in points()). addpoint()/addprim()/removeprim()/removepoint() and foreach (t in prims()) - see the Topology creation/deletion section below.

float t = pointattr("Mesh", "thickness", 0)

setpointpos(i, v)

Write vertex i's position on the Detail working copy. Later pointpos(i) / pointpos("Mesh", i) in the same run see the write - that is what makes foreach (i in points()) { setpointpos(i, ...) } work. Statement-OK. Detail only (Vertex/Triangle are parallel and refuse it). After a successful run, dirty positions are applied to the Mesh output.

foreach (i in points()) { setpointpos(i, pointpos(i) + vec3(0,0,1)) }

clearlandmarks()

Empties the working landmark set's pairs. Splines are untouched. Usable as a bare statement (its return value, if any, is simply discarded).

clearlandmarks()

addlandmark(src, dst)

Appends a pair to the working set and returns its new index. A cap of 16,777,216 pairs makes this a no-op (a counted LimitGuarded guard, not an error) past that point.

float i = addlandmark(pointpos("Mesh", 0), pointpos("Mesh", 0) + pointnormal("Mesh", 0) * 2)

setlandmarksrc(i, v)

Overwrites pair i's source position. Out-of-range i is a counted no-op.

setlandmarksrc(0, pointpos("Mesh", 0))

setlandmarkdst(i, v)

Overwrites pair i's target position. Same out-of-range convention.

setlandmarkdst(0, pointpos("Mesh", 0) + pointnormal("Mesh", 0))

removelandmark(i)

Removes pair i, preserving the order of the rest. Same out-of-range convention.

removelandmark(numlandmarks("Guide") - 1)

Working set

The working set starts as a copy of the first wired Landmarks parameter (Parameters-list order) - its splines carry through unchanged - or empty if none is wired. After a successful run it publishes on this node's primary Landmarks output if one exists (see primary on the Parameters page) - Create pins from code (or the pin editor) adds one when the expression writes landmarks; switching Run Mode does not. The default landmark viewport rendering picks it up automatically. The output rebuilds its map from the flat pair list; since a map keys on the source position, two pairs that end up with the same source position collapse to one - the last write for that position wins, so order your addlandmark/setlandmarksrc calls with that in mind.

setoutput("Name", value)

Writes a Parameters-list value output ("User Outputs", Float/Vector/Int/Bool) by name - Detail mode's counterpart to a named WeightMap output write (wmap("Name") = ...) in the vertex/corner domain. The value must match the declared type: scalar for Float/Int/Bool (Int truncates toward zero, Bool becomes 0/1 by !=0, the same rules chi()/chb() use on the read side), vector for Vector. Writing a name that is not declared is a compile error listing the declared outputs. Multiple writes: the last one wins. Usable as a bare statement.

setoutput("Count", numlandmarks("Guide")); setoutput("Centroid", centroid())

Unwritten outputs

After a successful run, every declared output publishes its pin's own default value if the expression never wrote it - and the node reports a warning naming which ones. Nothing is ever left stale from a previous run.

Topology creation/deletion

Detail Run Mode only.

What it is

addpoint()/addprim()/removeprim()/removepoint() edit the Detail working copy's topology - not just a position or an attribute - immediately, inside the same run. Vertex/Triangle/Corner refuse all four with a positioned compile error: those run-overs are parallel, so a new element's id would depend on what every other element did and could not be the same from one run to the next.

n = addpoint(P + N * 2)

addpoint(v)

Appends a new vertex at v and returns its new id. A cap of 100,000,000 new points per run (counted from the pre-run mesh, not the mesh's own size) makes this a no-op (a counted LimitGuarded guard, not an error) past that point - the addlandmark() precedent. Statement-OK.

float n = addpoint(pointpos(0) + vec3(0, 0, 1))

addprim(a, b, c)

Appends a new triangle over three existing vertex ids and returns its new id, or -1. Any corner that does not name a live vertex, or two corners naming the same vertex, is a counted OutOfRangeIndex and adds nothing. A triangle that would be non-manifold (an edge already shared by two faces) or that already exists is a counted TopologyRefused and adds nothing. A cap of 100,000,000 new triangles per run is a counted LimitGuarded, the addpoint() twin. No group argument - a new triangle always lands in TriangleGroups' default group; assign a real one downstream if you use polygroups. Statement-OK.

float t = addprim(a, b, c)

Winding

The new triangle's face normal follows normalize(cross(Pc - Pa, Pb - Pa)) - the same left-handed convention every other triangle in this engine uses. Wind it like the triangle you copied the corners from; if the result renders inside-out, swap b and c.

float t = addprim(a, c, b) // flipped on purpose

Overlay fill

A freshly appended triangle's UV/normal/colour elements are unset by the engine (every downstream bake silently skips an unset triangle), so addprim() fills them itself: each corner reuses that vertex's first existing overlay element if it has one, or gets a fresh neutral one otherwise (UV zero; normal = the new triangle's own face normal; tangent/bitangent layers, if present, zero - they need a real downstream tangent recompute; colour white).

removeprim(t) / removeprim(t, keep_points)

Removes triangle t; returns 1, or 0 if t already was not a triangle (a legitimate "nothing to remove" answer, the removedelta() precedent - not counted). The one-argument form also removes any corner left referencing no other triangle (which is also what a "blast a region" script's usual intent); keep_points != 0 leaves those corners in place as free points, which round-trip through the Mesh output pin same as any other isolated vertex. Statement-OK.

removeprim(t); removeprim(t2, 1)

removepoint(i)

Removes vertex i and every triangle still touching it; returns 1, or 0 if i already was not a vertex (same "nothing to remove", not counted). No keep_prims form exists: a mesh cannot hold a triangle that references a dangling vertex, so removing the vertex necessarily removes its triangles too. Statement-OK.

removepoint(i)

clearmesh()

Empties every point and triangle from the working copy, one at a time - not the same as an empty mesh from Mesh.Clear(): every overlay's layout (UV/normal layer count, colour layer presence) survives with zero elements in it, so a from-scratch addpoint()/addprim() pass right after this call still has overlays to fill. Cleared points/triangles are counted into the same totals removepoint()/removeprim() report. Has no per-element form (unlike every other function in this section, it refuses with its own message rather than suggesting a foreach loop). Statement-OK.

clearmesh(); n = addpoint(vec3(0,0,0))

foreach (t in prims()) { ... }

Iterate every live triangle id, Detail only - the required companion to removeprim()/addprim(): without it, a removal script has nothing but a raw for (t = 0; t < maxprims(); ...) loop over a ceiling that keeps moving if the body itself adds triangles. The element set is snapshotted once at loop entry, exactly like foreach (i in points()) - a body that adds or removes triangles does not retroactively grow or shrink the current loop. No mesh-pin argument: a donor mesh is never mutated, so there is nothing to iterate there.

foreach (t in prims()) { if (primarea(t) < 0.01) { removeprim(t) } }

Live counts

npoints()/nprims()/maxpoints()/maxprims()'s self forms (a bare call, or an explicit "Mesh" pin name) read the current count/ceiling after any addpoint()/addprim()/removeprim()/removepoint() earlier in the same run - what makes removeprim(t); setoutput("Count", nprims()) tell the truth.

setoutput("PointCount", npoints())

Ids do not survive publish

A vertex/triangle id returned by addpoint()/addprim() (or read via npoints()/pointpos(i)/etc.) is only meaningful for this run. A mesh leaving any pin is always compacted if it was not already, which renumbers every id - so an id you saved into a User Output and expect to feed into a later node's own point-index math will not necessarily name the same element anymore. An isolated point (removeprim's keep_points, or any point with no triangle) is not discarded by that compaction - it round-trips through the Mesh output pin's own orphan-vertex block, just potentially under a different id.

Interactions

Deltas: if this run wrote a Delta entry (setdelta) and also changed the topology and the mesh was not already compact, the node posts a warning - the delta's key no longer names the same vertex once the mesh is renumbered on publish. Skin: points added by addpoint() carry no skin weights - a note recommends Transfer Weights or Bind Skin downstream when the mesh has a skin-weights attribute.

Studio and Graph › Geometry › Wrangle

Arrays

Growable lists of floats or vectors, local to one run of the expression.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Syntax What it does Example
declare float[] name = expr; / vector[] name = expr; A growable list of floats or vectors, local to this expression. The = is required, same as every other declaration - there is no way to spell "an array with no value yet". An empty one is float[] a = {};. float[] heights = {}; vector[] hits = {}
literal { e1, e2, ... } Build an array from a fixed list of same-typed expressions (all float, or all vector) - up to 256 of them, a compile-time limit naming itself if you cross it. float[] weights = { 1, 0.5, 0.25, 0 }
index (write) a[i] = v; Overwrite element i. Same out-of-range convention as a read: a no-op, counted. Compound forms work too: += -= *= /=. weights[0] = 1; weights[1] += 0.1
vector element swizzle a[i].y Indexing a vector[] yields a vector, which then takes .x/.y/.z (or .r/.g/.b) exactly like any other vector expression. wmap("Weights") = hits[0].y
len(a) Element count, for either array type. for (i = 0; i < len(weights); i += 1) { wmap("Weights") += weights[i] }
append(a, s) / append(a, v) Add one element to the end and return the new length. Mutates a in place - usable as a bare statement, since the length is usually not what you came for. append(weights, 0.75)
insert(a, i, s) / insert(a, i, v) Insert one element at index i (clamped into [0, len(a)]), shifting the rest up; returns the new length. Mutates in place. insert(weights, 0, 1)
removeindex(a, i) Remove the element at index i, shifting the rest down; returns the new length. Out-of-range i is a counted no-op. Mutates in place. removeindex(weights, 0)
resize(a, n) Grow (new elements are zero / the zero vector) or shrink to exactly n elements; returns n. Mutates in place. resize(weights, 8)
find(a, s) / find(a, v) Lowest index whose element exactly equals the value, or -1 if none does. Exact comparison - two floats that came out of arithmetic rarely match exactly, so prefer this for values you set on purpose (ids, flags) over ones you computed. wmap("Weights") = find(weights, 0.5)
sort(a) A fresh float[] with every element in ascending order. Stable - equal elements keep their original relative order, which is what makes chunking a large mesh across worker threads never change the result. Float arrays only. float[] sorted = sort(weights)
argsort(a) A fresh float[] of the indices (as exact whole-number floats) that would put a in ascending order, stable on ties - sort a vector[] (or several parallel arrays) by feeding it a float[] of the key you actually want to sort by. float[] order = argsort(weights)
reverse(a) A fresh array with element order reversed. Works on either array type. float[] r = reverse(weights)
slice(a, lo, hi) A fresh array holding the elements in [lo, hi), clamped into range (a reversed or out-of-range pair just yields fewer elements, never an error). Works on either array type. float[] first3 = slice(weights, 0, 3)
concat(a, b) A fresh array holding every element of a followed by every element of b. Both arguments must be the same array type. float[] all = concat(weights, sort(weights))
sum / avg sum(a) / avg(a) Sum / mean of every element, either array type - a float[] gives a float, a vector[] gives a component-wise vector. avg() of an empty array is 0 (or the zero vector), uncounted: an empty mean has no other honest answer. wmap("Weights") = sum(weights); vector centre = avg(hits)
min / max min(a) / max(a) Smallest / largest element of a float array. A vector[] argument is a compile error naming argsort() + indexing as the fix - there is no single agreed meaning for "the biggest vector". wmap("Weights") = max(weights)

Index (read) - a[i]

The element at index i, 0-based. An out-of-range i (there is no negative indexing - see no negative index below) returns 0 (or the zero vector) and is counted, exactly like every other point-index guard in this language - not an error, so a loop that overshoots by one still finishes and tells you afterward.

wmap("Weights") = weights[0]; vector p = hits[2]

foreach (name in a) { ... }

Iterate any array-typed expression, in index order - name is a fresh local of the array's element type, scoped to the block. The array's handle and length are read once before the loop starts: appending to a from inside the body does not extend the iteration, so a foreach body is always safe to append into a different array from the one it walks.

foreach (h in hits) { wmap("Weights") += h.y }

Value semantics

Assigning an array (float[] b = a; or b = a;) copies it - later writes to b never touch a, and vice versa. A value that is already fresh (a literal, a function's own result) is handed over without copying, since nothing else could be holding onto it yet; passing an array to a function you wrote also copies it into that function's own parameter, for the identical reason.

float[] a = { 1, 2, 3 }; float[] b = a; append(b, 9); wmap("Weights") = len(a)

Per-element lifetime

Every array is scoped to one element's run - vertex, triangle, texel or the single Detail run - and is gone (its slot silently returned to the pool) the moment that element finishes. There is no way to carry an array from one vertex to the next; if you need that, write it into a Weight Map, a User Output or a named attribute instead.

No negative index

a[-1] is not "the last element" - it is an ordinary out-of-range read/write, counted like any other. find() already returns -1 for "not found", and a silently-aliasing negative index would make that -1 look like a hit the moment it was fed straight back into a[]. Use len(a) - 1 to reach the last element on purpose.

wmap("Weights") = weights[len(weights) - 1]

Nearpoints (array) - nearpoints("Pin", p, r)

Every donor vertex id within r of p on the named mesh pin, as a fresh float[], sorted ascending - the value-returning twin of foreach (i in nearpoints("Pin", p, r)) above (see the Donor mesh pins page), for when you want the whole id list rather than to iterate it once. Vertex or Detail run-over.

float[] ids = nearpoints("Donor", P, 5); wmap("Weights") = len(ids)

Guarded growth

An array's total element storage is capped per element - growth past the cap (append/insert/resize/a literal/sort()-and-friends producing a bigger result) is a no-op, counted (ArrayCapacityGuarded) rather than growing without bound. The number of distinct arrays one element may have live at once is capped separately, the same way.

Studio and Graph › Geometry › Wrangle

Skin weights and viewport

Reading and writing the mesh's real skin weights, and drawing debug geometry in the viewport.

Part of the Wrangle reference. Everything on this page goes in the node's Code field, and runs once per element of the current Run Over mode.

Skin weights

Default profile on the mesh's real skin attribute - not a tagged @attribute.

Syntax What it does Example
numbones() / numbones("Pin") Bone-table count of the subject mesh, or of the named donor mesh pin. Legal in every run-over. wmap("Weights") = numbones()
boneweight (pin) / weight (pin) boneweight("Pin", "Bone", i) / weight("Pin", "Bone", i) Weight of the named bone at donor vertex i (glob sums). Bone is resolved against that pin's skeleton. Legal in every run-over. Out-of-range i returns 0 and is counted. wmap("Weights") = weight("Donor", "jaw", ptnum)
boneweighti / weighti boneweighti(k) / weighti(k) Current-vertex weight by bone index. Out-of-range -> 0 + counted. Vertex or Corner domain (a read). wmap("Weights") = weighti(0)
bonepos("Bone") / bonepos("Pin", "Bone") Component-space bind-pose origin of the named bone, as a vector. Legal in every run-over (needs a skeleton). vector o = bonepos("root")
boneaxis("Bone", i) / boneaxis("Pin", "Bone", i) Component-space bind-pose axis i in {0,1,2} (X/Y/Z). vector x = boneaxis("root", 0)
bonelength("Bone") Bind-pose distance from the named bone to its parent. 0 for the root bone (no parent to measure against), and that 0 is counted - self mesh only, no "Pin" form. wmap("Weights") = bonelength("upperarm_l")
boneparentpos("Bone") The named bone's parent's bind-pose component-space origin, as a vector - the bone's own position for the root (there is a legitimate answer there, unlike bonelength). Self mesh only. vector p = boneparentpos("hand_l")
numinfluences() How many influences the current vertex currently carries (working copy). Vertex or Corner domain (a read - see setboneweight's own note on why writes stay Vertex-only). wmap("Weights") = numinfluences()
influencebone(k) Bone index of the k-th influence; out-of-range k returns -1 and is counted. Vertex or Corner domain (a read). float b = influencebone(0)
influenceweight(k) Weight of the k-th influence; out-of-range k returns 0 and is counted. Vertex or Corner domain (a read). wmap("Weights") = influenceweight(0)
clearinfluences() Drop every influence on this vertex's working copy. Later setboneweight calls in the same element still apply. Statement-OK. Vertex domain only - a write, same reason setboneweight stays out of Corner. clearinfluences(); setboneweight("jaw", 1)
working copy Reads and writes go through a per-element working copy seeded from the mesh before the expression runs and written back after, so reading boneweight after setboneweight in the same element sees the write - the same sequential semantics as reading P after writing P. setboneweight("a", 1); clearinfluences(); setboneweight("b", 1)
not @skin Skin weights are not a tagged named attribute. There is no @skin and no generic attribute buffer - the mesh's own Default skin-weight profile is the only store.

boneweight("Bone") / weight("Bone")

Current-vertex weight for the named bone on the Default skin-weight profile; 0 when that bone has no influence. Bone name is a string literal resolved at compile time (case-insensitive). A literal containing * is a glob (case-insensitive): matching bones are summed. Zero matches is a compile error listing present names. Vertex or Corner domain (a read - the owning vertex, in Corner). Not a tagged @attribute - Paint/Transfer/Poser/FBX read the same Default profile.

wmap("Weights") = weight("root"); wmap("Weights") = weight("thigh_*")

setboneweight("Bone", w)

Write weight for the named bone on the current vertex. w <= 0 removes that bone from the working copy. Always renormalises with Always-normalize on apply; max 12 influences. Statement-OK. Vertex domain only - a write needs exactly one current vertex, and several corners can share one, so this stays out of Corner mode even though the reads above are legal there. Does not invent new bones - compile-time names only. A glob (*) is a compile error (ambiguous).

clearinfluences(); setboneweight("root", 1)

Viewport

Syntax What it does Example
setcamera("front") / setcamera("front", "source") Jump to a framed, axis-aligned view of the whole mesh. Presets: front, back, left, right, top, bottom, three_quarter_left, three_quarter_right. Optional second string is the pane ("source" or "target", default source). Needs mesh bounds - returns 0 with none. setcamera("front"); setcamera("three_quarter_left", "source")
orbitcamera(yaw, pitch) Relative orbit around the current pivot, in degrees. orbitcamera(30, 0)
dollycamera(d) Relative move toward(-)/away(+) along the view, in world units. dollycamera(-10)
framecamera() Refit the whole preview mesh at the current angle. framecamera()
setviewmode("lit") Restyle both panes: "lit", "unlit" or "wireframe". setviewmode("unlit")
captureviewport("C:/path/shot.png") Write an offscreen PNG/JPEG of the source pane to that path (literal or chs()). Returns 0 when there is no GPU or the write failed. captureviewport("C:/path/shot.png")
selected() 1 if the current vertex is in the viewport mask (painted selection), else 0. Vertex or Corner only (the owning vertex, in Corner). A compile error in Triangle/Texel/Detail: selected() needs a current vertex. if (selected()) { Cd = vec3(1, 0, 0) }

What it is

setcamera/orbitcamera/dollycamera/framecamera/setviewmode/captureviewport drive the live preview camera, shading and an offscreen screenshot - the same capabilities the agent tools set_camera / set_view_options / frame_camera / capture_viewport already have. Once per Run in every Run Over. In Once (Detail) they run through the expression (nested ifs legal). In Vertex/Triangle/Corner/Texel they are legal only as top-level statements and run once on the game thread before the per-element loop; nested inside if/for/while/foreach is a compile error. No Mesh pin is required. Each call returns 1 on success or 0 when there is no preview scene / no mesh for a preset / a capture failed; the run is not aborted. Statement-OK.

setcamera("front")

Studio and Graph › Geometry › Wrangle

Python stage

The #@python blocks in the code editor: when they run, what they can reach, and how they hand values to the expression.

Part of the Wrangle reference. Everything on this page goes in a #@python block in the node's Code field, and runs once per Run - before the expression half compiles.

Block syntax - #@python / #@wrangle

A line whose trimmed text is exactly #@python opens a Python block; the next #@wrangle line, or end of document, closes it - every other line is the Wrangle expression. Multiple #@python blocks in one document coalesce (their python text concatenates, in document order, into one script); ##@python (doubled #) is the escape for a literal comment line that must not open a block. Both marker words are ordinary # comments to whichever language they end up inert in, so a malformed marker degrades to a comment rather than a hard error.

#@python
import math
#@wrangle
P.z += py("scale")

Pipeline order

Fixed, every time the stage actually runs: the Python script runs first, once, on the working mesh - it may write named attributes and detail values. Then the compiler builds this run's schema (which now includes anything the script just wrote). Then the expression half compiles against that schema. Then the expression evaluates. A script that creates @thick can be read by @thick in the expression on the same run; there is no separate Run needed in between. A document that is nothing but a #@python block is legal - the stage's own writes publish with no expression pass at all (Mesh Domain/Corner).

@thick from the script, P.z += @thick in the expression

Reading script output

Per-element values (an attribute the script wrote with mm.set_attrib) are read exactly like any other named attribute: @name. Whole-run values (mm.set_detail) are read with py()/pyv() below - they are not per-element, so they are not attributes.

@thick, py("scale")

py("key") -> scalar

The named Python-stage detail value, as a scalar - baked at compile time from the last successful run (the script does not run again to answer this). Unknown key is a compile error listing the keys the script actually set on its last run, or saying the stage has not run yet when there are none. A vector-typed key is a compile error naming pyv() instead.

wmap("Weights") = py("thickness_scale")

pyv("key") -> vector

The vector twin of py() - same resolution, same "unknown key" / "has not run yet" errors, same "use py() instead" error for a scalar-typed key.

P += pyv("offset")

Execution

The stage runs every Run, in full, whenever the #@python body is non-empty - there is no separate run mode and no cache to keep warm or invalidate. A #@requires package that is already satisfied costs nothing beyond the up-front check (see requires below); only an actual install pays for itself, once, the Run it happens on. A script that needs to skip its own expensive work on a later Run guards itself in Python (e.g. an os.path.exists check around a download into mm.cache_dir - see the code editor's Fetch Once example).

#@requires numpy scipy==1.11

One or more package specs, whitespace separated, on their own line inside a #@python block - the fast path for a dependency: the next time the stage actually runs, anything not already present installs automatically into the managed packages folder, before the script's own imports execute. Offline (no network, or the install fails), the script still runs and its own import line fails with an ordinary ImportError naming what is still missing - #@requires cannot make a package appear out of nowhere, it only automates the same manual step. A version pin (scipy==1.11) installs that exact version; an unpinned name installs whatever is currently latest.

#@requires numpy
import numpy as np

Interpreter and packages

#@requires is the fast path for numpy/scipy/... - it installs into the same managed folder every Wrangle node's Python stage already searches. The script runs against this app's own bundled Python 3.11 - never your system Python, never a virtualenv - and a compiled package built for a different Python fails with an ordinary ImportError, which the stage appends a hint to naming this exact requirement. A folder of your own packages can also be added under Additional Python Paths.

import numpy as np

Custom interpreter - Settings > Scripting > Python Interpreter Path

Empty (default) runs this app's own bundled Python 3.11 in-process. A python.exe path here switches the stage to run that interpreter out-of-process instead - any version, your own environment, your own already-installed packages - at the cost of a slower per-Run interpreter start-up. Use it for a package this app's managed installer cannot reach, or a Python version numpy/scipy actually ships wheels for. A path that does not exist is a node error naming this setting, with no interpreter ever spawned.

Isolated built-in - Settings > Scripting > Isolate Built-in Interpreter

Runs this app's own bundled interpreter out-of-process too, even with no custom path set - the escape hatch for a script that imports a native wheel you do not fully trust: a segfault inside a compiled extension takes the whole app down when it happens in-process, but only takes the isolated child down when this is on, surfacing as an ordinary node error instead. Off by default, since the common case pays nothing for a robustness feature it does not need.

Settings on this node > Python Isolated

Runs this node's Python in the isolated (out-of-process) transport even on the shipped, in-process-capable interpreter - the same transport a custom Python Interpreter Path or Isolate Built-in Interpreter selects, chosen per node instead of app-wide: crash/hang containment and native-package conflict avoidance for one node you do not fully trust, without switching every other Wrangle node's Python to the slower start-up. Off by default. Redundant, not conflicting, once a custom interpreter path or Isolate Built-in Interpreter already forces isolation.

Isolated mode's hard kill

Any isolated case (a custom path, Isolate Built-in Interpreter, or this node's own Python Isolated setting) gets a real, hard OS-level kill on cancel or timeout instead of the in-process stage's cooperative watchdog, which can only ask a running interpreter to raise - a script stuck inside a C extension with the GIL released can ignore that ask forever, but cannot decline an OS-level TerminateProcess. This is isolation's actual robustness benefit, not merely a different way of running the same script.

Settings on this node > Interactive Script

Tick this on when the script opens its own window (tkinter, PySide, PyQt, ...) and waits on it. Needs an isolated interpreter (tick this node's own Python Isolated setting, or set a custom Python Interpreter Path / Isolate Built-in Interpreter app-wide) - in-process is refused, naming the fix, because a GUI toolkit's own event loop would hang this whole application unkillably in-process (the cooperative watchdog cannot reach it). tkinter ships with this app's interpreter but fails in-process with a raw TclError anyway (no window-server pump on this thread); PySide/PyQt import fine in-process but app.exec() is exactly the unkillable hang - a built-in sys.meta_path guard (in-process only, never in the isolated child - the isolated process is precisely where these toolkits are allowed) refuses the import itself with a message naming this setting, so the failure is a clear one instead of either of those two shapes. Also disables the Python Timeout for this run - a user-chosen Cancel (a real, hard kill in isolated mode) is the only expected exit while the script's window is open, not a timer. mm.ui.host() implies this setting and isolation automatically for that run.

Python limits - Python Timeout (seconds), Isolate Built-in Interpreter

Python Timeout (default 300s) aborts a script that runs longer, cooperatively - it can only ask a running interpreter to stop, which one stuck inside a C extension with the GIL released can ignore forever; turn on Settings > Scripting > Isolate Built-in Interpreter for a real, hard OS-level kill instead when that matters more than in-process start-up speed.

Custom interpreter and packages

A custom Python Interpreter Path never sees this app's managed PyPackages folder (#@requires installs cp311 wheels there, built for this app's own embedded Python - loading one into a different interpreter version risks a crash uglier than a plain ImportError). Additional Python Paths still reaches a custom interpreter; install packages into its own environment for everything else - a #@requires line targeting the managed folder is a no-op for it either way.

Errors

A Python-stage failure surfaces on the same status strip a compile error does, remapped from the extracted script's own line number back to the merged document's line so the underline lands on what you actually see on screen; the node's own message names what went wrong (Python Last Error/Python Last Error Traceback), the node goes to its failed state, and - the same promise the expression itself keeps - the mesh is left exactly as it arrived, never half-written.

Security

The Python stage runs only when Run is pressed - never on graph load, paste, undo or redo. That press can be yours, or the in-app AI agent's (node_action, if you are running an agent session) - the agent can also author PythonScript before pressing it, the same set_node_properties edit you would make by hand (it lands inside the document's #@python block in the human-facing editor, same as if you had typed it there). Python is on by default app-wide now (Settings > Scripting can switch it off per machine) and gated by licence besides; the guarantees that matter are unchanged regardless of that default - explicit press only, never on load/paste/undo, licence-gated. #@requires does not widen any of this: it installs through the same pip, into the same managed folder, behind the same gates as any other #@requires install - convenience, not capability; read a #@requires line the same way you would read the script under it. Isolation (a custom interpreter, Isolate Built-in Interpreter, or a node's own Python Isolated setting) is a robustness feature, not a security boundary - a spawned child process inherits this signed application's own privileges exactly like an in-process call would.

Determinism

Everything else in this language is deterministic - same input, same output, every machine, every run. A Python script is not bound by that: one that calls random.random(), reads the system clock, or opens a network connection makes this node's output non-reproducible, and nothing here can detect or warn about it. An unpinned #@requires spec adds its own source of drift - numpy installs whatever is currently latest, which can differ machine to machine and month to month - pin a version (numpy==1.26) wherever the rest of the graph needs to be reproducible. Keep the script itself deterministic too if that matters.

Code completion

The code editor's mm. popup always offers the built-in name list (see the Python API page) instantly, on every keystroke. When Settings > Scripting is on, it also offers real completions from the bundled jedi engine - stdlib/package names (import numpy offers what numpy actually exports) and real call signatures for every mm. member - layered in about 300ms after you stop typing (jedi's own richer entry wins when both offer the same name). Off (or the module failed to load): the built-in list is all you get, exactly as before this existed.

import js -> offers "json"

Python topology

mm.set_mesh() and the incremental working copy.

Two ways, pick one

mm.set_mesh() replaces the whole subject in one call - the right tool for "I computed an entirely new mesh". mm.add_point()/mm.add_tri()/mm.remove_tri()/mm.remove_point() edit the existing subject incrementally - the right tool for "I am adding/removing a few things". A single run may use one or the other, never both (a script that calls set_mesh() and also add_point() in the same run is a compile-time-shaped ScriptError naming the rule).

mm.set_mesh(points, tris)
# or
i = mm.add_point(p)

Virtual ids

Every id add_point()/add_tri() hands back is virtual: a dense counter this run owns (starting right after the pre-run mesh's own last id), never the engine's own internal id. This is deliberate, not a limitation - the engine's real ids can be reused by any later add once something earlier is removed (its own "free list"), which would make an id you saved into a python variable silently start naming a different point later in the same run. Virtual ids never do that: once handed to you, an id names the same thing (or is dead - see is_point()/is_tri()) for the rest of the run.

i = mm.add_point(p); assert mm.is_point(i)

Survival table

is_point(i)/is_tri(t) answer against all of this run's history: the pre-run subject's own points/triangles, plus everything add_point()/add_tri() created, minus everything remove_point()/remove_tri() has since killed (remove_tri(keep_points=False) also kills any corner left with no other live triangle; remove_point() also kills every triangle still touching it, leaving their other corners alive). max_points()/max_prims() are the ceiling those ids run up to - not a live count, exactly like the expression language's own maxpoints()/maxprims().

for i in range(mm.max_points()):
    if mm.is_point(i): ...

mm.P after topology

Before any topology call, mm.P is Wave 1's plain snapshot. After the first add_point()/add_tri()/remove_tri()/remove_point() call, mm.P re-materializes from the growing working copy instead - reading it again after a later add_point() sees the new row too. Holding onto an old mm.P result across an add_point() call and still using it is undefined (a live memoryview blocks the working copy's own bytearray from growing) - re-read mm.P fresh after any topology call if you need it.

mm.add_point(p); p2 = mm.P  # fresh, includes p

What cannot be combined

set_mesh() and the edit list are mutually exclusive (see two ways, pick one above) - a hard error naming both. mm.set_P/set_N/set_Cd/set_uv/set_wmap/set_attrib can never be combined with an edit list that removes anything (remove_tri()/remove_point()) in the same run, because a removal can make an id stop naming the row it used to - split into two Wrangle nodes, or use set_mesh() to replace everything atomically instead. An adds-only edit list (add_point()/add_tri() only, nothing removed) is exempt - ids only ever grow, so a channel write's row-per-id promise still holds.

mm.add_point(p); mm.set_P(new_positions)  # OK, adds-only

Caps

Both set_mesh() and the edit list share the same per-run growth ceilings as the expression's own addpoint()/addprim(). set_mesh() enforces its cap as a hard error (an atomic replacement cannot be "truncated" down to the cap without publishing a mesh you never asked for) - build incrementally instead. The edit list enforces the same cap per-op instead: an add_point()/add_tri() call past the cap is silently skipped (counted, not an error) and every other op in the list still applies.

mm.builder(from_subject=False)

A third option, built on top of set_mesh() rather than a third mechanism: a plain python-side accumulator with its own .add_point()/.add_tri()/.remove_tri() (local list indices, not the same ids as the working copy above) and .commit(normals=..., uvs=..., colors=..., attribs=...), which flattens everything into one mm.set_mesh() call for you. Use it when "build a mesh from a loop" is more natural than hand-flattening arrays yourself.

b = mm.builder(from_subject=True); b.remove_tri(0); b.commit()

Studio and Graph › Geometry › Wrangle

Python API

Everything on the mm object, plus the mm.ui buttons and labels a script can declare.

Part of the Wrangle reference. Everything on this page goes in a #@python block in the node's Code field, and runs once per Run - before the expression half compiles.

Syntax What it does Example
mm.num_points -> int Vertex count of the subject mesh. n = mm.num_points
mm.num_prims -> int Triangle count of the subject mesh. t = mm.num_prims
mm.run_over -> str "vertex", "triangle", "corner", "texel" or "detail" - this run's run-over. if mm.run_over == "vertex": ...
mm.P -> ndarray or memoryview numpy ndarray (N,3) float64 when numpy is importable, else a flat memoryview. Lazy and cached on first access; call mm.set_P() to stage a change. Re-materializes after mm.add_point()/mm.remove_point()/mm.remove_tri() this run. p = mm.P; x0 = p[0]
mm.N -> memoryview (float32, xyz per vertex) Vertex normals (mean of split elements), same lazy-snapshot rule as mm.P. n = mm.N
mm.Cd -> memoryview (float32, rgba per vertex) Vertex colour, same lazy-snapshot rule as mm.P. c = mm.Cd
mm.uv -> memoryview (float32, uv per vertex) Primary UV, same lazy-snapshot rule as mm.P. t = mm.uv
mm.mask -> memoryview (float32, one per vertex) The primary WeightMap input parameter's weight (the mask), empty when none is declared and wired. w = mm.mask[0]
mm.tris -> memoryview (int32, 3 per triangle) Vertex ids per triangle corner. a, b, c = mm.tris[0:3]
mm.selection -> list[int] or ndarray Welded vertex ids whose mask weight is > 0.5. numpy int32 array when numpy is importable, else a list[int]. Empty when the node has not filled a selection. ids = mm.selection
mm.attribs() -> list[str] Every tagged attribute name the mesh currently carries. for name in mm.attribs(): print(name)
mm.attrib(name) -> memoryview (float64) Read a tagged attribute's dense per-element values. thick = mm.attrib("thickness")
mm.params() -> dict Every scalar/vector/int/bool/string parameter's current value, by name - Ramp/Transform/Mesh/Texture/Landmarks are excluded (use mm.param() for those). d = mm.params(); print(d["strength"])
set_P / set_N / set_Cd / set_uv mm.set_P(buf) / mm.set_N(buf) / mm.set_Cd(buf) / mm.set_uv(buf) Stage new channel values - float64 (P) or float32 (N/Cd/uv) bytes, num_points*3/3/4/2. mm.set_P(new_positions)
mm.set_wmap(name, buf) Stage a named Weight Map output write - float32 bytes, num_points (Vertex/Corner run-over only). Any declared Weight Map output, Primary or not; wmap("Name") = ... writes the same way from the expression half. mm.set_wmap("Weights", weights)
mm.set_attrib(name, buf, domain='vertex', type=None) Stage a tagged attribute write. buf is float64 bytes; type is inferred from length when omitted. mm.set_attrib("curvature", data, "vertex", "float")
mm.set_mesh(points, tris, normals=None, uvs=None, colors=None, attribs=None, groups=None) Atomic whole-subject replacement - see the Python stage page. mm.set_mesh(points, tris)
mm.add_point(p) -> int Append a point to the incremental topology working copy; returns its new virtual id - see Python topology. i = mm.add_point((0, 0, 1))
mm.add_tri(a, b, c) -> int Append a triangle over three point ids; returns its new virtual id. t = mm.add_tri(a, b, c)
mm.remove_tri(t, keep_points=False) -> bool Remove triangle t from the working copy. mm.remove_tri(t)
mm.remove_point(i) -> bool Remove point i and every triangle still touching it. mm.remove_point(i)
is_point / is_tri mm.is_point(i) -> bool / mm.is_tri(t) -> bool True if i/t currently names a live element in the topology working copy. if mm.is_point(i): ...
max_points / max_prims mm.max_points() -> int / mm.max_prims() -> int The current point/triangle id ceiling - every id below this has existed this run, whether or not it is still live. n = mm.max_points()
mm.builder(from_subject=False) -> Builder A plain accumulator (.add_point/.add_tri/.remove_tri/.commit(...)) ending in one set_mesh() call - see Python topology. b = mm.builder(); b.add_point((0,0,0)); b.commit()
mm.set_texture(name, path_or_pixels, width=None, height=None, srgb=True, normal=False) Stage a Texture User Output write from an on-disk image path, or from packed RGBA8 pixels (bytes/numpy uint8) with width and height. Creates the named output pin if missing. Any Run Over. mm.set_texture("BaseColor", path)
mm.draw_points(points, color=(1,0.4,0.1), size=4) Stage debug points for the node to draw after this run. points is (N,3) or a list of xyz. Capped at 8192 primitives total; extra calls note the cap and drop. mm.draw_points([(0,0,0)])
mm.draw_lines(pairs, color=(0.2,0.8,1), thickness=1) Stage debug line segments. pairs is a list of (a, b) xyz. Same 8192 primitive cap as draw_points. mm.draw_lines([((0,0,0),(1,0,0))])
mm.draw_vectors(origins, vectors, color=(1,1,0)) Stage debug vectors. origins/vectors are (N,3). Dir is the vector, not an endpoint. Same 8192 primitive cap as draw_points. mm.draw_vectors([(0,0,0)], [(0,0,1)])
mm.bone_names() -> list[str] Skeleton bone names on the subject mesh. Empty list when the mesh has no skeleton. names = mm.bone_names()
mm.bone_weights() -> ndarray or list Dense skin weights as an (N, B) float32 ndarray when numpy is importable, else nested lists. w = mm.bone_weights()
mm.set_bone_weights(buf) Stage a dense (N, B) float32 skin-weight buffer, same row-major layout as mm.bone_weights(). mm.set_bone_weights(w)
mm.set_bone_weight(vertex, bone, weight) Set one skin weight. bone is an int index or a bone name string. Raises mm.Error("mesh has no skeleton") when BoneNames is empty. mm.set_bone_weight(0, "root", 1.0)
mm.polygroups() -> list[int] or ndarray Per-triangle polygroup ids (int32). Empty when the mesh carries none. g = mm.polygroups()
mm.material_ids() -> list[int] or ndarray Per-triangle material ids (int32). Empty when the mesh carries none. m = mm.material_ids()
mm.set_polygroups(buf) Stage per-triangle polygroup ids - int32, one per triangle, on the live subject (no set_mesh required). mm.set_polygroups(g)
mm.set_material_ids(buf) Stage per-triangle material ids - int32, one per triangle, on the live subject (no set_mesh required). mm.set_material_ids(m)
mm.set_landmarks(name, pairs) Stage a Landmarks User Output write. pairs is an iterable of (src, dst) 3-number sequences. Creates the named output pin if missing. Any Run Over. mm.set_landmarks("Landmarks", [((0,0,0),(1,0,0))])
mm.set_deltas(name, deltas) Stage a Delta User Output write. deltas is a dict {int: (x,y,z)} or an iterable of (id, (x,y,z)). Creates the named output pin if missing. Any Run Over. mm.set_deltas("Deltas", {0: (0,0,1), 4: (0,1,0)})
mm.set_transform(name, location=(0,0,0), rotation_euler=(0,0,0), scale=(1,1,1)) Stage a Transform User Output write. rotation_euler is degrees XYZ. Creates the named output pin if missing. Any Run Over. mm.set_transform("Xform", location=(0,0,10))
mm.set_detail(key, value) Stage a whole-run detail value (scalar, 3-tuple/list, or string) - read back via py()/pyv() above. mm.set_detail("scale", 1.25)
note / log mm.note(msg) / mm.log(msg) note() appends a short line to this run's Summary (capped ~8). log() writes a verbose line to the application log only. mm.note(f"wrote {n} values")
mm.progress(t, label='') Report fractional progress (0..1); raises KeyboardInterrupt if the run was cancelled from its progress bar. mm.progress(i / n, "baking")
mm.event -> str "" on an ordinary Run press, or "button:" for the one run a mm.ui.button() press triggered - see the Python UI section below. if mm.event == "button:Bake": ...
mm.prior_detail(key, default=None) -> value Read a detail value this node's own previous successful run staged via mm.set_detail - the read side of a state channel that survives across presses (a button's handler reading what an earlier press already decided). Returns default when key was never set by a prior run. count = mm.prior_detail("presses", 0) + 1
mm.cache_dir -> str Per-node scratch folder under Saved/WrangleScripts - the right place to cache a downloaded file, guarded with an os.path.exists check, so a later Run does not re-fetch it every time (see the code editor's Fetch Once example). path = os.path.join(mm.cache_dir, "data.json")
mm.stats() -> dict {elapsed_ms, notes_so_far} always; plus bbox_min/bbox_max/centroid/surface_area/volume - the same values the expression's own bboxmin()/centroid()/surfacearea()/volume() detail constants expose - when the subject mesh has any vertices. area = mm.stats().get("surface_area", 0.0)
mm.set_camera(preset=None, orbit_yaw=None, orbit_pitch=None, dolly=None, frame_mesh=False, view="source") -> dict Move the preview camera. preset is an absolute framed view of the mesh; orbit_yaw/orbit_pitch (degrees) and dolly (world units) are relative nudges; frame_mesh refits at the current angle. Raises mm.Error when there is no scene or a preset has no mesh bounds. mm.set_camera(preset="front")
mm.get_camera(view="source") -> dict Current camera location/rotation/fov/ortho/ortho_width. cam = mm.get_camera()
mm.set_view_options(view_mode=None, shadows=None, grid=None, floor=None, light_intensity=None, wireframe_overlay=None, view=None) -> dict Restyle how the viewport renders. All args optional - call with none to read. view_mode is "lit"/"unlit"/"wireframe". Styles both panes unless view is given. mm.set_view_options(view_mode="unlit", shadows=False)
mm.get_view_options() -> dict Current view_mode/shadows/grid/floor/light_intensity/wireframe_overlay. opt = mm.get_view_options()
mm.frame_camera(target="mesh", view="source", margin=1.4, center=None, radius=None) -> dict Center and fit the camera on the preview mesh, or target="point" with center=(x,y,z) and radius. mm.frame_camera()
mm.capture_viewport(path=None, view="source", view_mode=None, max_size=None) -> dict Write an offscreen PNG/JPEG of the preview. path defaults to mm.cache_dir/viewport.png. Raises mm.Error when there is no GPU, no scene, or the write failed. mm.capture_viewport()
mm.Error Raise mm.Error("message") for a script-authored failure - reported the same way an uncaught Python exception is. raise mm.Error("missing parameter")

mm.param(name) -> value

Read one declared parameter by name. WeightMap -> bytes; Delta -> {vertex_id: (x,y,z)}; Ramp -> a callable Ramp with .samples (the same baked 256-entry LUT chramp() reads)/.keys/r(t); Transform -> a Transform with .location/.rotation_euler/.scale/.matrix (16 doubles, column-major, matching chm())/.transform_points(buf); Mesh -> a lazy MeshView with .P/.tris/.num_points/.num_prims; Texture -> a TextureView with .width/.height/.row(y)/.pixel(x,y), decoded the same way texture()/texturea() read pixels; Landmarks -> [(src_xyz, dst_xyz), ...].

r = mm.param("falloff"); y = r(0.5)

mm.dna(name=None) -> DNA

Read/write one DNA input parameter by name (name is optional when the node has exactly one). mm.dna.create(name) makes a brand-new DNA from nothing instead, published on output pin name (always an output, even with no input to pair it with) - build it up with set_/clear() the same as any other DNA, but reads are refused ("this DNA does not exist yet") and the whole run is refused if the DNA you built is not structurally sound by the time it commits; mm.dna.created() lists every name ever passed to create() this run. 14 read methods (descriptor/definition/lod/behavior/joint_group/mesh/skin_weights/blendshape_target/ml/rbf/twist_swing/joint_metadata/raw_bytes, input DNA only) plus two kinds of write: staged set_/clear() field edits (applied to the DNA output pin of the same name only after this run finishes without raising; works on input and created DNA alike), and structural DNACalib edits (remove_joint/remove_mesh/remove_blendshape/remove_animated_map/remove_joint_animation/rename_joint/rename_mesh/rename_blendshape/rename_animated_map/prune_blendshape_targets/clear_blendshapes/set_lods/calculate_mesh_lower_lods/rotate/translate/scale/convert_units, input DNA only) that run immediately, in call order, and can add/remove/renumber joints, meshes, blend shapes, animated maps and LODs, correctly renumbering every layer (a section this build does not recognise still survives, but its own internal indices cannot be rewritten). Additive edits (also eager, input and created DNA alike, never touch DNACalib and never renumber joints/meshes) round out a third kind: add_gui_control/add_raw_control/add_expression/add_blendshape_channel/add_animated_map/add_psd/add_rbf_pose_control/add_rbf_pose/add_blendshape_target/add_corrective_blendshape/add_twist/add_swing/add_joint/add_mesh/add_rbf_solver/add_neural_network/add_ml_control/add_lod, plus wire_expression_to_joint_group/blendshape_channel/animated_map/rbf_solver to attach an already-added expression downstream (wire_expression_to_joint_group's attributes= can also insert brand-new joint-attribute rows, placed adjacent to the joint's own first existing row of the same class and inheriting its LOD visibility) - add_raw_control/add_psd/add_expression/add_ml_control shift the control-space indices above them (raw/PSD/ML/RBF-pose controls share one flat buffer), add_lod clones an existing LOD, every name accepts a single value or a list to add several in one flush. .set_gui_control_rows(target,rows)/.link_gui_control(target,raw,from_value=0.0,to_value=1.0,slope=1.0,cut=0.0)/.unlink_gui_control(target,raw) edit an existing GUI control's mapping rows (target and raw accept an int index or a name; rows are int | name | (raw,) | (raw,from,to,slope,cut); the control's rows are rewritten as one block grouped so each (gui, raw) pair is one consecutive run, because RigLogic sums split runs; set replaces, link appends, unlink drops every row of that raw; a control must keep at least one row (MetaHuman's face tools abort on an unused GUI control) - remove_gui_control drops it outright) - eager like add*, and sets the soundness gate. A fourth kind, removal (input DNA only, also eager, only ever shrinks), mirrors add*: remove_gui_control/remove_raw_control/remove_expression/remove_psd/remove_ml_control/remove_rbf_pose_control/remove_rbf_pose/remove_rbf_solver/remove_neural_network/remove_twist/remove_swing/remove_blendshape_target/remove_metadata(target, force=False) - by default refuses naming every other place the removed thing is still referenced (a full report), force=True cascades through them too, reporting every extra thing it took with it. set*/clear() also covers RBF solver parameters, neural net layers and jbmd (joint_representation) as ordinary staged fields; set_twist/set_swing are eager instead (the correction ledger owns that layer at commit time). merge(other, ...) merges a head/face DNA into this one (the body) by index-space concatenation, eagerly replacing this object's own bytes. A DNA can also be sourced from a file/bytes instead of a pin: mm.dna.load(name, path)/mm.dna.from_bytes(name, data) - the loaded slot supports the full read/write surface above and publishes to its own DNA output pin only if this run mutates it or calls .publish() explicitly; .save_to_file(path) stages a commit-time write of this DNA's own committed bytes. Rig donation: .scaffold_rig(template=None, body_part=None, bone_mapping=None, bone_mapping_inverse=None, retarget_values=True, translation_scale="none") / .transfer_rig(...) donate a template's rig (controls/joint groups/blend shapes/animated maps/RBF/twist-swing/jbmd) onto this DNA (template=None + body_part="head"/"body" auto-locates the shipped archetype); bone_mapping is a dict/list of (a,b) pairs/.mmbonemap path, none given auto-maps by name/hierarchy; retarget_values also converts kept rows via per-(joint,control) quaternion conjugation. mm.dna.auto_bone_map(template, target) previews that mapping with no side effects; mm.dna.save_bone_map(path, pairs, ...)/load_bone_map(path) read/write the shared .mmbonemap JSON format. Every value is raw DNA space, never converted to the app's UE space.

d = mm.dna(); d.remove_joint("Twist_L"); print(d.descriptor()["lod_count"])

mm.ui.button(id_text, tooltip='') / mm.ui.label(text) / mm.ui.separator() / mm.ui.host(where, height=280) / mm.ui.attach(obj) / mm.ui.attach_hwnd(hwnd)

Declare buttons/labels/separators the node's details panel renders as rows, in call order - replaced wholesale every run, not incremental. Capped at 32 elements / 128 characters per string (truncate/drop + a mm.note() explaining it); duplicate button ids within one run: last wins + note. host(where=panel|window) embeds or floats a toolkit window (isolated only; implies Interactive Script). attach() takes tkinter/Qt or an HWND. See the Python UI section below.

mm.ui.host(where="window")

Python UI

mm.ui buttons/labels, mm.event, mm.prior_detail.

What this is

A Wrangle script can declare its own buttons/labels/separators (mm.ui.button()/label()/separator() above), rendered as rows in this node's details panel, above the parameter pin editor - so a shared/reusable Wrangle node can offer a purpose-built mini-UI ("Bake To Attribute", a "Reset" button, ...) instead of an artist hunting for the right ch()/chf() parameter to edit by hand.

mm.ui.button("Bake"); mm.ui.label("Result: %.2f" % value)

Declare every run

Declarations are not incremental - every mm.ui.* call this run makes replaces the whole set the last successful run declared. A script that wants the same button on every run simply calls mm.ui.button(...) every run (the common case - most scripts declare their whole UI unconditionally, near the top).

mm.ui.button("Apply")

Pressing a button

Pressing a declared button (in the panel, or an agent's ui_<snake(id)> action - see agent access below) re-runs the full script - the same PythonScript, not a separate handler - with mm.event set to "button:" for that one run. A script branches on mm.event to decide what a press should do; on an ordinary Run press mm.event is "".

if mm.event == "button:Bake": mm.set_attrib("baked", data, "vertex", "float")

Declarations refresh on success only

ScriptUIElements refreshes only when the run's Status is Ok - a run that raises, times out or is refused leaves the last good buttons on screen, so an artist debugging a broken script still has working controls to fix things with rather than a panel that goes blank the moment something breaks.

Caps

Up to 32 UI elements per run; each of a button's id/tooltip and a label's text is capped at 128 characters. A call past either cap truncates (a string) or drops (the 33rd+ element) rather than raising - always reported with mm.note() naming exactly what happened, on both transports, byte-identical wording.

Duplicate button ids

Two mm.ui.button() calls in the same run with the same id: the last one wins (the earlier declaration is replaced, at the later call's position in the row order), noted via mm.note().

mm.ui.button("Bake", "v1"); mm.ui.button("Bake", "v2")  # only "v2" survives

State across presses - mm.prior_detail(key, default=None)

The designed-but-unwired state channel: mm.set_detail() writes a value this run; mm.prior_detail() reads what the node's own previous successful run wrote - so a button's handler can remember something across presses (a counter, a toggle, a cached path) without an external file. Returns default when the key was never set by a prior run.

n = mm.prior_detail("presses", 0); mm.set_detail("presses", n + 1)

Agent access

Every declared button also shows up as an agent action named "ui_<snake(id)>" - pressing it via the agent's node_action tool is identical to a human clicking the row: the same PressScriptUIButton() call, the same mm.event, the same "same trust decision as Run" rule - declarations are inert data restored on load; nothing runs until a press actually happens.

node_action {"action": "ui_bake"}

Presses while running

A press that arrives while this node is already mid-Run is dropped (never queued) - the panel's own button rows disable themselves the instant a run starts, and a press some other way (an agent action arriving mid-run) gets a plain refusal naming why instead of silently doing nothing.

mm.ui.host(where, height=280) / mm.ui.attach(obj) / mm.ui.attach_hwnd(hwnd)

Isolated only. where is panel (embed in this node's details, Windows HWND) or window (free-floating). A mm.ui.host() call in the script forces isolation and Interactive Script for that run. attach() accepts tkinter/Qt windows (winfo_id/winId) or an HWND int.

mm.ui.host(where="window")

Studio and Graph › Geometry › Wrangle

Examples

Every recipe the Wrangle node's Examples menu can drop into the Code field, with the note each one ships with. Pick the closest one, paste it, and edit the numbers.

Inserting an example from the menu also declares the parameters it needs, so a freshly inserted snippet compiles as-is. Pasting one from this page does not - declare the parameters it names (Mask, Reference, Iterations) in the pin editor first.

Expression examples

These are the expression half: paste one into the Code field as it is.

Deform

Inflate Along Normal (Masked)

Push vertices outward along their normal, scaled by the Mask input. Run Over: Vertex. Insert already declared the classic Mask; wire a weight map into the Mask parameter.

float amount = 2.0 * mask;
P += normalize(N) * amount;

Smooth Only The Masked Region

Blend a whole-mesh relax smooth against the original position, gated by the Mask input. Run Over: Vertex. Insert already declared the classic Mask; wire a weight map into the Mask parameter.

vector smoothed = relax(4);
P = lerp(P, smoothed, mask);

Iterative Smooth (Iterations)

Average each vertex toward its one-ring neighbours - a single pass only nudges the mesh once. Run Over: Vertex. Insert already set Iterations to 5 on this node, so this pass actually runs five times, each one reading the previous pass's result - that is what turns the one-step average below into a real smooth. Compare to relax(n), which is a pre-pass that runs once, before your code, not a repeat of your code itself.

Insert also sets Iterations.

vector sum = vec3(0, 0, 0);
float count = 0;
foreach (nb in neighbours(ptnum)) { sum += pointpos(nb); count += 1; }
if (count > 0) { P = sum / count; }

Noise Displacement (Seeded)

Push each vertex by a seeded 3D noise field - change the seed for a different look without touching anything else. Run Over: Vertex.

P += vnoise(P * 0.05, 7) * 2;

Taper Along Z

Taper the mesh toward a point along Z: full width at the base, narrowed at the top. Run Over: Vertex.

float t = fit(P.z, bboxmin().z, bboxmax().z, 1, 0.3);
P.x *= t;
P.y *= t;

Distance-To-Reference Falloff

Fade toward 1 near the Reference input's surface and toward 0 far from it. Run Over: Vertex. Wire the classic Reference parameter. If you already renamed this node's Weight Map output, write wmap("YourName") = ... instead of "Weights".

float d = neardist("Reference", P);
wmap("Weights") = 1 - saturate(d / 25);

Project Onto Reference Surface

Pull vertices onto the nearest point on the mesh wired into the Reference parameter, blended by the Mask input. Run Over: Vertex. Wire the classic Reference parameter and a weight map into the Mask parameter.

vector target = nearpoint("Reference", P);
P = lerp(P, target, mask);

Blend Toward Index-Matched Reference

Blend toward the mesh wired into the Reference parameter when it shares this mesh's exact vertex order (a blend-shape target). Run Over: Vertex. Wire the classic Reference parameter. Needs a Float Parameter named "blend".

vector donorPos = pointpos("Reference", ptnum);
P = lerp(P, donorPos, ch("blend"));

Attributes

Transfer Attribute From A Second Mesh (Named Pin)

Sample a tagged attribute at the nearest surface point on a second mesh - beyond the Reference parameter - and paint it as greyscale colour. Run Over: Vertex. Needs a Parameter of type Mesh named "Donor", tagged with a Float attribute called "thickness".

float thickness = surfattr("Donor", "thickness", P);
Cd = vec3(thickness, thickness, thickness);

Skinning

Visualize Bone Weight Glob

Visualize the combined skin weight of every bone whose name matches a glob, as greyscale vertex colour. Run Over: Vertex. The subject mesh needs a skeleton with bone names matching thigh_*.

float w = weight("thigh_*");
Cd = vec3(w, w, w);

Harden A Skin Weight

Push a bone's influence to full strength wherever it already dominates; setboneweight renormalizes on apply. Run Over: Vertex. The subject mesh needs a skeleton with a bone named spine_02. Needs a Float Parameter named "threshold".

if (weight("spine_02") > ch("threshold")) { setboneweight("spine_02", 1); }

Color & UV

UV Band Mask

Repeating stripes across U, written to the node's Weights output as a paintable mask. Run Over: Vertex. If you already renamed this node's Weight Map output, write wmap("YourName") = ... instead of "Weights".

wmap("Weights") = sin(uv.x * pi * 8) * 0.5 + 0.5;

Vertex Colour From Weight Map

Paint a WeightMap parameter's values as greyscale vertex colour - handy for sanity-checking a mask. Run Over: Vertex. Needs a Parameter of type Weight Map named "Falloff" wired.

float w = wmap("Falloff");
Cd = vec3(w, w, w);

Selection

Boundary Ring Detect

Colour boundary vertices red and interior vertices white, to spot open edges before a boolean or a bake. Run Over: Vertex.

if (isboundary()) { Cd = vec3(1, 0, 0); } else { Cd = vec3(1, 1, 1); }

Detail Mode

Center Mesh On Origin

Recenter the whole mesh on the origin by subtracting its centroid from every vertex. Run Over: Once (Detail). Insert already declared the classic Mesh; wire a mesh into it.

Insert also sets the Run Mode the snippet needs.

vector c = centroid();
foreach (i in points()) { setpointpos(i, pointpos(i) - c); }

Triangle Mode

Area-Based Mask

Flag small triangles for cleanup by writing a 0..1 mask attribute from triangle area. Run Over: Triangle. Needs Create Missing Attributes on to let @areaMask be created.

Insert also sets the Domain the snippet needs.

@areaMask = fit(area, 0, 50, 0, 1);

Python examples

These are the Python half. A snippet that already opens with #@python is a whole document - paste it as it is; the rest are script bodies, so put them inside a #@python block.

Mixed

Mixed: Python feeds the expression

#@python
#@requires numpy
# Compute the bounding-box centre and longest axis once, in Python,
# then let the expression below use them per vertex.
if mm.num_points == 0:
    mm.note("add a Mesh parameter first")
    mm.set_detail("centre", [0.0, 0.0, 0.0])
    mm.set_detail("longest", 0.0)
else:
    import numpy as np
    p = np.frombuffer(mm.P, dtype=np.float64).reshape(-1, 3)
    lo, hi = p.min(axis=0), p.max(axis=0)
    mm.set_detail("centre", ((lo + hi) * 0.5).tolist())
    mm.set_detail("longest", float((hi - lo).max()))
#@wrangle
// Push every vertex away from the centre, scaled by the mesh's own size.
vector c = pyv("centre");
float s = py("longest");
P += normalize(P - c) * (s * 0.02);

Interactive

Tkinter Slider + Apply

Insert also declares amount (Float) and ticks Interactive Script, switching this node to an isolated interpreter.

#@python
# Tkinter Slider + Apply: a script that opens ITS OWN window and waits for the
# artist to move a slider and press Apply.
# REQUIRES: Interactive Script and an isolated interpreter (this example ticks
# both on insert). In-process is refused outright (a GUI event loop would hang
# the whole app unkillably).
import tkinter as tk

amount = [float(mm.params().get("amount", 0.0))]
root = tk.Tk()
root.title("Wrangle: Push Along Normal")
# The child spawns with a HIDDEN startup window (SW_HIDE-style startup info) -
# these three lines make that moot, forcing the window to the front the moment
# it exists.
root.deiconify()
root.lift()
root.attributes("-topmost", True)

def on_apply():
    amount[0] = slider.get()
    root.destroy()

slider = tk.Scale(root, from_=-10.0, to=10.0, resolution=0.1, orient=tk.HORIZONTAL, label="Amount")
slider.set(amount[0])
slider.pack(padx=12, pady=12)
tk.Button(root, text="Apply", command=on_apply).pack(pady=(0, 12))

def heartbeat():
    # A progress heartbeat, not a cancel check - Cancel is a hard kill in
    # isolated mode, handled entirely on the C++ side; this call only keeps
    # the dialog's own progress label alive while the window is open.
    mm.progress(0.5, "waiting for the window...")
    root.after(200, heartbeat)

root.after(200, heartbeat)
root.mainloop()

mm.set_detail("amount", amount[0])
mm.note(f"amount = {amount[0]:.2f}")
#@wrangle
// Push along the normal by the slider amount the Python window wrote.
P += normalize(N) * py("amount");

Tkinter Hosted UI

Insert also declares amount (Float) and ticks Interactive Script, switching this node to an isolated interpreter.

#@python
# Tkinter hosted by mm.ui.host(where='panel') - stdlib only.
# REQUIRES: an isolated interpreter. mm.ui.host implies Interactive Script
# and isolation even if those tickboxes are off (this example still ticks both).
# where='panel' embeds above the code editor (Windows). where='window' floats.
# tk.Tk() auto-attaches after host(where='panel'); mm.ui.attach(root) also works.
import tkinter as tk

amount = [float(mm.params().get("amount", 0.0))]
mm.ui.host(where='panel', height=220)
root = tk.Tk()
root.title("Wrangle: Push Along Normal")

def on_apply():
    amount[0] = slider.get()
    root.destroy()

slider = tk.Scale(root, from_=-10.0, to=10.0, resolution=0.1, orient=tk.HORIZONTAL, label="Amount")
slider.set(amount[0])
slider.pack(fill='both', expand=True, padx=8, pady=8)
tk.Button(root, text="Apply", command=on_apply).pack(pady=(0, 8))
root.mainloop()

mm.set_detail("amount", amount[0])
mm.note(f"amount = {amount[0]:.2f}")
#@wrangle
// Push along the normal by the slider amount the Python window wrote.
P += normalize(N) * py("amount");

Python Sculpt Lab

Insert also ticks Interactive Script, switching this node to an isolated interpreter.

#@python
#@requires numpy
# Python Sculpt Lab: a window with its OWN interactive 3D viewport and
# custom brushes that are NOT in the core Mesh Morpher toolset
# (Snake Hook, Crease, Blob, Nudge, Vortex, Polish, Magnet, Wrinkle).
# REQUIRES: Interactive Script and an isolated interpreter (this example
# ticks both on insert). LMB sculpts; Alt-LMB orbits; Apply writes mm.set_P().
import os
import runpy

def _sculpt_lab_candidates():
    out = []
    try:
        root = os.path.normpath(os.path.join(mm.cache_dir, '..', '..', '..'))
        out.append(os.path.join(root, 'Tools', 'python', '_sculpt_lab.py'))
        out.append(os.path.join(root, 'Plugins', 'MeshMorpherGraph', 'Resources', 'Python', 'sculpt_lab.py'))
    except Exception:
        pass
    out.append(os.path.abspath('_sculpt_lab.py'))
    return out

path = None
for c in _sculpt_lab_candidates():
    if c and os.path.isfile(c):
        path = c
        break
if not path:
    raise mm.Error('Python Sculpt Lab not found (Tools/python/_sculpt_lab.py)')
mm.note('sculpt lab: ' + path)
runpy.run_path(path, init_globals={'mm': mm}, run_name='__sculpt_lab__')
#@wrangle

No Dependencies

Height Ramp

Height Ramp: normalize Z height into a 0..1 vertex attribute. mm.P is (N,3) when numpy is importable, else a flat float64 view.

p = mm.P
n = mm.num_points
def height(i):
    return float(p[i][2] if getattr(p, "ndim", 1) == 2 else p[i * 3 + 2])
buf = bytearray(n * 8)
view = memoryview(buf).cast('d')
zmin = min(height(i) for i in range(n)) if n else 0.0
zmax = max(height(i) for i in range(n)) if n else 0.0
span = (zmax - zmin) or 1.0
for i in range(n):
    view[i] = (height(i) - zmin) / span
mm.set_attrib("heightRamp", buf, "vertex", "float")
mm.note(f"height range {zmin:.1f} .. {zmax:.1f}")

CSV Import

CSV Import: read one value per vertex from a CSV file in this node's cache folder.

import csv
import os
path = os.path.join(mm.cache_dir, "values.csv")
n = mm.num_points
if not os.path.exists(path):
    mm.note(f"no values.csv in {mm.cache_dir} - using 0 everywhere")
    values = [0.0] * n
else:
    with open(path, newline='') as f:
        values = [float(row[0]) for row in csv.reader(f) if row]
    values = (values + [0.0] * n)[:n]
buf = bytearray(n * 8)
view = memoryview(buf).cast('d')
for i, v in enumerate(values):
    view[i] = v
mm.set_attrib("csvValue", buf, "vertex", "float")

Fetch Once

Fetch Once: download a reference file once and reuse it. The script itself runs every Run, but the os.path.exists guard below skips the actual download whenever the file is already sitting in mm.cache_dir, so a re-run costs almost nothing once it has fetched the file the first time.

Insert also leaves the Mesh parameter undeclared - the snippet does not need one.

import os
import urllib.request
path = os.path.join(mm.cache_dir, "reference.json")
if not os.path.exists(path):
    mm.note("downloading reference.json (first Run only)")
    urllib.request.urlretrieve("https://example.com/reference.json", path)
else:
    mm.note("using cached reference.json")
mm.set_detail("fetched_path", path)

Ramp + Transform

Ramp + Transform: sample a Ramp parameter named "Falloff" by height, then apply a Transform parameter named "Offset" to the result. Needs a Ramp parameter "Falloff" and a Transform parameter "Offset" declared on this node. mm.P is (N,3) when numpy is importable, else a flat float64 view.

p = mm.P
n = mm.num_points
ramp = mm.param("Falloff")
xf = mm.param("Offset")
tmp = memoryview(bytearray(n * 3 * 8)).cast('d')
def xyz(i):
    if getattr(p, "ndim", 1) == 2:
        return float(p[i][0]), float(p[i][1]), float(p[i][2])
    return float(p[i * 3]), float(p[i * 3 + 1]), float(p[i * 3 + 2])
for i in range(n):
    x, y, z = xyz(i)
    t = ramp(max(0.0, min(1.0, z / 100.0)))
    tmp[i * 3] = x
    tmp[i * 3 + 1] = y
    tmp[i * 3 + 2] = z + t * 5.0
mm.set_P(xf.transform_points(tmp))

Python-only Node

Python-only Node: this document is nothing but a #@python block - there is no #@wrangle section at all, so there is no expression to compile; this script alone is the whole node. Legal exactly the way an empty document (no python either) is. mm.P is (N,3) when numpy is importable, else a flat float64 view.

p = mm.P
n = mm.num_points
def x_of(i):
    return float(p[i][0] if getattr(p, "ndim", 1) == 2 else p[i * 3])
buf = bytearray(n * 8)
view = memoryview(buf).cast('d')
cx = (sum(x_of(i) for i in range(n)) / n) if n else 0.0
for i in range(n):
    view[i] = abs(x_of(i) - cx)
mm.set_attrib("distFromCenterX", buf, "vertex", "float")
mm.note("Python-only: no expression needed")

Button: Bake To Attribute

Button: Bake To Attribute. Declares a button every run (mm.ui.button); an ordinary Run press only shows a preview count, but pressing the button itself (mm.event == "button:Bake") writes the count into a real attribute.

mm.ui.button("Bake", "Write the vertex count into @baked")
n = mm.num_points
if mm.event == "button:Bake":
    buf = bytearray(n * 8)
    view = memoryview(buf).cast('d')
    for i in range(n):
        view[i] = float(i)
    mm.set_attrib("baked", buf, "vertex", "float")
    mm.note(f"baked {n} value(s)")
else:
    mm.note(f"press Bake to write {n} value(s) into @baked")

Needs A Package

Curvature Attribute (numpy)

#@requires numpy
# Curvature Attribute (numpy): mean curvature proxy from vertex-normal disagreement
# across every edge. The '#@requires numpy' line above installs it into the managed
# folder automatically on next Run.
if mm.num_points == 0:
    mm.note("add a Mesh parameter first")
else:
    import numpy as np
    n_pts = mm.num_points
    p = np.frombuffer(mm.P, dtype=np.float64).reshape(-1, 3)
    nrm = np.frombuffer(mm.N, dtype=np.float32).reshape(-1, 3).astype(np.float64)
    tris = np.frombuffer(mm.tris, dtype=np.int32).reshape(-1, 3)
    accum = np.zeros(n_pts)
    counts = np.zeros(n_pts)
    for a, b, c in tris:
        for i, j in ((a, b), (b, c), (c, a)):
            d = 1.0 - float(np.dot(nrm[i], nrm[j]))
            accum[i] += d; accum[j] += d
            counts[i] += 1; counts[j] += 1
    curv = np.divide(accum, counts, out=np.zeros_like(accum), where=counts > 0)
    mm.set_attrib("curvature", curv.astype(np.float64).tobytes(), "vertex", "float")

KD-Tree Donor Distance (scipy)

Insert also declares Donor (Mesh) and turns Create Missing Attributes on.

#@python
#@requires scipy
# KD-Tree Donor Distance (scipy): distance from each vertex to the nearest point on a
# donor Mesh parameter named "Donor". The '#@requires scipy' line above installs it
# into the managed folder automatically on next Run. Needs a Parameter of type Mesh
# named "Donor" wired.
if mm.num_points == 0:
    mm.note("add a Mesh parameter first")
    mm.set_detail("gap_max", 0.0)
else:
    from scipy.spatial import cKDTree
    import numpy as np
    donor = mm.param("Donor")
    donor_p = np.frombuffer(donor.P, dtype=np.float64).reshape(-1, 3)
    p = np.frombuffer(mm.P, dtype=np.float64).reshape(-1, 3)
    tree = cKDTree(donor_p)
    dist, _ = tree.query(p)
    mm.set_attrib("gap", dist.astype(np.float64).tobytes(), "vertex", "float")
    mm.set_detail("gap_max", float(dist.max()) if len(dist) else 0.0)
#@wrangle
// Distance to the Donor mesh as a 0..1 weight (1 = on the donor). If you already renamed this node's Weight Map output, write wmap("YourName") = ... instead of "Weights".
wmap("Weights") = 1 - saturate(@gap / py("gap_max"));

Studio and Graph

Repair

  • Remove Small Components: Throw away the loose shells a scan or a boolean leaves behind. Anything not connected to the rest of the mesh and smaller than your thresholds goes; a mesh that is all one piece is never touched.
  • Remove Occluded: Delete the triangles you can never see from outside: the body under the clothes, the inside of a boot, the overlapping shells a kitbash left behind.
  • Fill Holes: Close the open boundary loops in a mesh. Five ways to triangulate the patch, from a quick flat fan up to a smoothed surface that blends into the shape around it.
  • Compact Mesh: Renumber a mesh so its vertex and triangle IDs run without gaps. Several nodes refuse to touch a mesh with holes in its numbering and say so; drop this in front of them.
  • Fill From Mirror: Deletes the thin half of a mesh, appends a mirror of the half that is there, and welds the seam. Use this when one side is missing. Topology changes.
  • Find Plane: Estimates the best mirror plane on a scan. Press Find Plane. Tick Align To X to rotate the mesh onto the sculpt X plane; the Transform pin is written either way.
  • Fix Symmetry: Make a nearly-symmetric scan exactly symmetric by pairing each vertex with its mirror and averaging the two, so both halves keep their detail instead of one half being thrown away.
  • Mesh Health: Drop it anywhere in a chain to see what is wrong with the mesh: invalid positions, open edges, holes, floating islands, degenerate triangles, pinch points, duplicate vertices.
  • Mirror Mesh: Reflects the mesh about the sculpt / Fix Symmetry plane and flips winding so it is a valid Non-Rigid Fit target. Not a finished symmetrised asset.

Studio and Graph › Repair

Remove Small Components

Photogrammetry scans and marching-cubes surfaces leave confetti behind. This throws away every disconnected island under a triangle-count or surface-area threshold, in one press of Remove Small Com...

Remove Small Components node

The Remove Small Components node

When to use it

Photogrammetry scans and marching-cubes surfaces leave confetti behind. This throws away every disconnected island under a triangle-count or surface-area threshold, in one press of Remove Small Components.

For junk that is connected but buried inside the model, Remove Occluded is the one.

On a mesh with uneven density, set the threshold by area rather than triangle count. Otherwise a dense speck survives while a sparse but real part gets deleted.

Nothing protects the largest island. A threshold above your actual model deletes everything, so when the output comes back empty, look at the result before you go hunting through the settings.

How to use it

  1. 1

    Wire the mesh into Mesh

  2. 2

    Set a triangle count, a surface area, or both

    Either one on its own is enough; an island only has to fail one test to go.

  3. 3

    Press Remove Small Components

    A mesh that is all one connected piece is never touched, whatever the thresholds say. Once there are two pieces, neither is protected for being the bigger one, so set the thresholds under the size of the part you want to keep.

Pins

Pin Type Description
Mesh Mesh The mesh with loose bits floating around it.
Pin Type Description
Mesh Mesh The mesh with the undersized islands gone.

Settings

Setting Type Description
Min Area Island Number Islands with less surface area than this get deleted. 0 turns the area test off. Being the biggest piece protects nothing, so keep this under the area of the part you want or it goes out with the scraps.
Min Tri Count Island Whole number Islands with fewer triangles than this get deleted. 0 turns the triangle test off. Same warning as the area threshold: the main body is not exempt.

Studio and Graph › Repair

Remove Occluded

Deletes interior triangles that cannot be seen from outside, using winding number or raycast sampling. Hidden geometry inside a merged or scanned asset - the inner wall of a double-sided surface, a...

Remove Occluded node

The Remove Occluded node

When to use it

Deletes interior triangles that cannot be seen from outside, using winding number or raycast sampling. Hidden geometry inside a merged or scanned asset - the inner wall of a double-sided surface, a body under clothing - costs triangles and confuses bakes.

Winding number is the more reliable test and wants a reasonably closed mesh. Raycast works on open ones, but a sample count that is too low fools it, either leaving interior shells behind or punching holes through thin visible geometry.

Weld first. An unwelded surface has no inside for the winding number to compute.

How to use it

  1. 1

    Wire the mesh into Mesh

    Leave Target empty and the mesh hides itself, which is what you want on a kitbash full of overlapping shells.

  2. 2

    To strip a body under clothing

    Wire the body into Mesh and the clothing into Target.

  3. 3

    Press Remove Occluded

    This deletes triangles for good. If the cut nibbles into surface you can still see, raise Shrink Removal a ring or two before reaching for anything else.

Pins

Pin Type Description
Mesh Mesh The mesh to cut hidden triangles out of.
Target Mesh Optional second mesh doing the hiding. Wire the jacket in here to strip the torso underneath it. Empty means the mesh hides itself.
Pin Type Description
Mesh Mesh The mesh with the hidden triangles gone.

Settings

Setting Type Description
Occlusion Test Method Choice How a triangle is judged hidden.
Triangle Sampling Choice Where on each triangle the test gets taken.
Winding Iso Value Number The cutoff that separates inside from outside for the winding test. 0.5 is the standard value; raise it to be stricter about what counts as inside and keep more, lower it to cut more.
Add Random Rays Whole number Extra rays in random directions on top of the six axis rays. Raise it when the raycast test is leaving slivers of hidden surface behind.
Add Triangle Samples Whole number Extra sample points scattered over each triangle. Raise it when big triangles are being kept because a corner happens to peek out.
Shrink Removal Whole number Pulls the removal set back by this many rings of triangles before deleting, so the cut stops short of the visible surface instead of nibbling into it.
Min Area Island Number After the cut, delete any leftover island with less surface area than this. 0 keeps them all.
Min Tri Count Island Whole number After the cut, delete any leftover island with fewer triangles than this. 0 keeps them all.

Studio and Graph › Repair

Fill Holes

Closes open boundaries. The method matters more than anything else here. A triangle fan is instant and fine on a small flat hole. Ear clipping copes with a concave outline. Minimal produces the few...

Fill Holes node

The Fill Holes node

When to use it

Closes open boundaries. The method matters more than anything else here. A triangle fan is instant and fine on a small flat hole. Ear clipping copes with a concave outline. Minimal produces the fewest triangles. Smooth fill reconstructs a curved surface that carries on from the shape around it, and on an organic form it is the only one that looks right.

Run it after a crop, a Remove Geometry or a scan cleanup, then check with Mesh Health that the boundary count actually reached zero.

A hole that refuses to fill is usually not one loop. Two boundaries that touch at a pinch vertex read as a figure eight, so weld first. Press Fill Holes.

How to use it

  1. 1

    Wire the mesh into Mesh

  2. 2

    Pick a fill method

    Minimal handles most things; use Smooth on a large opening across a curved surface.

  3. 3

    Press Fill Holes

    Every patch gets flat face normals and a flat UV projection, so it will read as a facet against the surface around it until you recompute normals and lay its UVs out properly.

Pins

Pin Type Description
Mesh Mesh The mesh with holes in it.
Pin Type Description
Mesh Mesh The mesh with its boundary loops closed. Each patch inherits the material of the triangles around it.

Settings

Setting Type Description
Fill Method Choice How the patch gets triangulated.
Filter By Size True/False Skip holes with more boundary edges than Max Hole Edges. Off, a scan's whole open back gets sealed over along with the pinholes you were after.
Max Hole Edges Whole number Holes with more boundary edges than this are left open.
Constrain To Hole Interior True/False Keep the fill from touching any triangle outside the hole. Protects the surrounding mesh, at the cost of a patch that meets it more abruptly.
Interior Smoothness Number Trades smoothness inside the patch against staying close to the shape the first fill produced.
Remeshing Exterior Region Width Whole number How many rings of surrounding triangles get remeshed along with the patch. Only does anything when the fill is not constrained to the hole interior.
Smoothing Exterior Region Width Whole number How many rings outside the patch get smoothed too. Raise it to soften the seam where the patch meets the mesh.
Smoothing Interior Region Width Whole number How far in from the patch border the smoothing constraint fades out.
Fill Density Scalar Number Sets the patch's triangle size: the average edge length around the hole, divided by this. Higher gives you a denser patch.
Project During Remesh True/False Pull vertices back onto the fill surface while the patch is remeshed.

Studio and Graph › Repair

Compact Mesh

After a lot of deleting, vertex, edge and triangle indices have gaps in them. This renumbers everything dense and contiguous again.

Compact Mesh node

The Compact Mesh node

When to use it

After a lot of deleting, vertex, edge and triangle indices have gaps in them. This renumbers everything dense and contiguous again.

Hardly anything needs it by hand. What does is per-index data: a saved selection, an attribute array, an external file of vertex positions. All of that is only meaningful against a compact mesh, so run this before exporting index-keyed data or handing vertices to an outside tool.

Compacting changes vertex ids. Any selection, weight map or delta set captured beforehand no longer lines up. Compact first, capture second.

Pins

Pin Type Description
Mesh Mesh The mesh to renumber. Deleting geometry upstream is what leaves the gaps.
Pin Type Description
Mesh Mesh The same geometry, with no gaps left in the vertex and triangle numbering.

Studio and Graph › Repair

Fill From Mirror

The missing-half tool. Deletes every triangle on the drop side of the plane, appends a reflected copy of the keep side, and welds the seam. Topology changes. Use it when one half of a scan is simpl...

Fill From Mirror node

The Fill From Mirror node

When to use it

The missing-half tool. Deletes every triangle on the drop side of the plane, appends a reflected copy of the keep side, and welds the seam. Topology changes. Use it when one half of a scan is simply gone, not when both halves are there and only disagree.

Fix Symmetry cannot invent partners that do not exist, and Mirror Mesh plus a wrap keeps the original topology, which is the wrong answer when half the surface is missing. This is delete, append, weld - not a boolean.

Set Keep to the half that exists, or leave it on Larger Side. A wrong Keep copies the thin stub over the good half. Press Fill From Mirror; the Filled weight map marks the vertices the mirror added.

How to use it

  1. 1

    Wire the incomplete scan into Mesh and pick the Axis

  2. 2

    Set Keep to the half that exists (or leave Larger Side)

  3. 3

    Press Fill From Mirror

    Topology will change.

Pins

Pin Type Description
Mesh Mesh The mesh that is missing a half. Passes straight through until you press Fill From Mirror.
Pin Type Description
Mesh Mesh The mesh with the missing half filled from the mirror of the keep side. Topology changes.
Filled Weight Map 1.0 on vertices appended from the mirrored keep side that survived the weld, 0.0 everywhere else.

Settings

Setting Type Description
Axis Choice The axis the mirror plane faces along. X mirrors left to right for a head looking down +Y, which is the app's front. None is refused rather than quietly doing nothing.
Plane Origin Choice Which point the mirror plane passes through.
Plane Offset Vector Nudges the plane off that point, in cm. Only the component along Axis does anything; the other two just slide the plane around inside itself.
Keep Choice Which side of the plane is kept. The other side is deleted and replaced by the mirror of this one.
Seam Tolerance Fraction Number Vertices this close to the plane, as a fraction of the bounds diagonal, count as the seam and are kept with both sides.
Weld Tolerance Number How close two seam vertices must sit before the weld merges them, in cm.
Seam Snap Fraction Number How far off the plane a boundary counts as the seam, as a fraction of the bounds diagonal. A ragged scan cut wanders off the true midline by a few millimetres; every boundary edge with both ends inside this band is pulled exactly onto the plane before the mirror, so the two halves meet with no slit no matter how far that stretch wandered. Raise it if a stubborn gap remains; lower it if a real hole near the plane (an eye socket) is being sealed shut. Keep it below the distance from the plane to the nearest hole you want to preserve. An edge with only one end in the band is a rim crossing the plane, not the seam, and is left alone.

Studio and Graph › Repair

Find Plane

Estimates the dominant mirror plane of a scan when you do not already know which axis it sits on, or when the scan arrived rotated off the sculpt X plane.

Find Plane node

The Find Plane node

When to use it

Estimates the dominant mirror plane of a scan when you do not already know which axis it sits on, or when the scan arrived rotated off the sculpt X plane.

How to use it

  1. 1

    Wire the scan into Mesh

  2. 2

    Press Find Plane

    Read Closest Axis and Residual.

  3. 3

    Tick Align To X if you want the mesh rotated onto the sculpt X plane; the Transform pin is written either way so Apply Rigid Transform can consume it without moving this mesh

Pins

Pin Type Description
Mesh Mesh The mesh whose mirror plane you want to find. Passes straight through until you press Find Plane.
Pin Type Description
Mesh Mesh The input mesh, or the same mesh rotated onto X if Align To X is on.
Transform Transform The rigid transform that would align the found plane to X. Written even when the mesh is left unmoved.
Residual Number How far the estimated plane is from a perfect mirror. Blank when the run was refused.

Settings

Setting Type Description
Max Samples Whole number How many vertices to sample. More is slower and a little more stable.
Align To X True/False Rotate the mesh so the found plane becomes the X axis. Off leaves the mesh where it is and still writes the Transform pin.
Snap Aligned Plane To Origin True/False After aligning, slide the plane onto the world origin.

Studio and Graph › Repair

Fix Symmetry

Takes a nearly symmetric mesh and makes it exactly symmetric. Each vertex finds its mirror partner across the plane and the pair is averaged, so both halves keep their detail and every vertex moves...

Fix Symmetry node

The Fix Symmetry node

When to use it

Takes a nearly symmetric mesh and makes it exactly symmetric. Each vertex finds its mirror partner across the plane and the pair is averaged, so both halves keep their detail and every vertex moves by half the disagreement instead of one side being overwritten by the other. On a scan that beats mirroring geometry, because nothing gets thrown away.

How to use it

  1. 1

    Wire the scan into Mesh and pick the Axis

    X for a head facing +Y.

  2. 2

    Press Fix Symmetry

    Read Asymmetry Before / After in the details panel.

  3. 3

    If Unpaired Vertices is not zero, find out where

    Wire the Unpaired output into a mask to see the gaps, then either raise Match Tolerance or fix the crop upstream.

  4. 4

    Paint a Weights mask when part of the mesh should stay lopsided

    A pair moves by the lower of its two weights, so paint the region on both sides of the plane. A vertex painted 0 never moves and holds its partner still as well, which is what keeps "unpainted means untouched" true for the whole mesh rather than only for the half you happened to paint.

Pins

Pin Type Description
Mesh Mesh The nearly-symmetric mesh. Passes straight through until you press Fix Symmetry.
Weights Weight Map Optional mask scaling how far each vertex moves, so you can straighten a face without touching a deliberately lopsided hairstyle. A pair moves by the lower of its two weights, so paint both sides of the region you want fixed - a vertex painted 0 is never moved, and neither is its partner. Unconnected means full strength everywhere.
MatchTolerance Number Partner search radius, as a fraction of the bounds diagonal. Leave it unconnected to use the value in the details panel.
Strength Number How far each vertex travels toward the symmetric average, 0 to 1. Leave it unconnected to use the value in the details panel.
Pin Type Description
Mesh Mesh The symmetrised mesh. Only positions moved - vertex count, order and every attribute are untouched.
Unpaired Weight Map 1.0 on every vertex that found no mirror partner and was left where it was, 0.0 everywhere else. Wire it into a mask to see the gaps.
UnpairedVertices Whole Number How many vertices had no mirror partner. Zero means everything paired up.
AsymmetryBefore Number Largest gap, in cm, between a vertex and the mirror of its partner before the fix.
AsymmetryAfter Number The same measurement after the fix. Zero, to floating point, at full Strength.

Settings

Setting Type Description
Axis Choice The axis the mirror plane faces along. X mirrors left to right for a head looking down +Y, which is the app's front. None is refused rather than quietly doing nothing.
Plane Origin Choice Which point the mirror plane passes through.
Plane Offset Vector Nudges the plane off that point, in cm. Only the component along Axis does anything; the other two just slide the plane around inside itself.
Correspondence Choice How each vertex finds its mirror partner. Nearest Vertex matches the other half's vertices. Closest Point On Surface matches the mirrored position onto the mesh itself, which is what a scan needs when the two halves were tessellated independently.
Match Tolerance Fraction Number How far from its mirrored position a partner may sit, as a fraction of the bounds diagonal, so one number works on a 2 cm ear and a 200 cm body. It has to be bigger than the asymmetry you are fixing or nothing pairs at all, and smaller than the gap between neighbouring vertices or a vertex grabs its partner's neighbour instead and the fix smears detail sideways. One percent of the diagonal clears typical scan asymmetry with room left. On a dense scan that one percent is larger than the neighbour spacing, so Limit Match To Spacing (on by default) also caps the search at a few mean edge lengths. Closest Point On Surface uses the same radius against the mirrored surface rather than the nearest vertex. Clamped at a quarter of the diagonal: past that the search radius covers a large fraction of the mesh, every query returns most of the other side and the pairing stops being a mirror match at all - while the cost climbs toward comparing every vertex with every other one. The clamp also bounds what a value driven in through the Match Tolerance pin can do.
Limit Match To Spacing True/False Cap the partner search at a few mean edge lengths. The default 1% of the bounds diagonal is larger than neighbour spacing on a dense scan and the extra radius is how a vertex grabs its partner's neighbour and smears detail. Off restores a pure diagonal fraction.
Max Match Edge Lengths Number Search radius in mean edge lengths, used only while Limit Match To Spacing is on. 1.5 keeps the query inside the first ring of neighbours.
Seam Tolerance Fraction Number Vertices this close to the plane, as a fraction of the bounds diagonal, count as seam vertices and pair with themselves. They need their own rule: a seam vertex's mirrored position lands within Match Tolerance of both itself and its neighbours across the plane, so it would otherwise compete for a partner it must not have. Note the band between this and Match Tolerance: a vertex just outside the seam whose true partner sits just inside it cannot pair, because seam vertices are deliberately kept out of the partner search. Those vertices are reported as unpaired (count, Unpaired map and node warning) rather than quietly skipped, so the usual symptom is a thin ring of unpaired vertices hugging the plane. Lower Seam Tolerance until it clears.
Snap Seam To Plane True/False Pull seam vertices exactly onto the plane. Off leaves them where they are, which keeps a deliberately off-plane seam intact but means the result is not exactly symmetric along it.
Strength Number How far each vertex travels toward the symmetric average. 1 lands exactly symmetric; lower closes part of the gap and leaves the mesh measurably straighter without being exact.

Studio and Graph › Repair

Mesh Health

Inspects the incoming mesh for the flaws that make sculpting and deformation tools misbehave, passes the mesh straight through, and publishes what it found on pins. Findings are ranked by severity ...

Mesh Health node

The Mesh Health node

When to use it

Inspects the incoming mesh for the flaws that make sculpting and deformation tools misbehave, passes the mesh straight through, and publishes what it found on pins. Findings are ranked by severity and written in plain language, and each one has a repair button next to it.

Drop one in wherever you suspect the input rather than the operation: before a boolean that keeps failing, after an import, either side of a Weld to see how many boundary edges actually went away. Branch a batch graph on Is Clean to stop a bad mesh reaching an export.

Until you press a repair button it is a pass-through, so it re-checks on its own whenever the mesh upstream changes. Press one and the output becomes a computed result like any other node's: an upstream edit then marks it stale and waits for you to re-run it.

How to use it

  1. 1

    Drop it anywhere in a mesh chain

    Mesh in, mesh out, nothing changes.

  2. 2

    Read the findings in the details panel

  3. 3

    Press a repair button for what can be fixed

    Remove Floaters, Weld, Remove Degenerate, Split Pinch Points and Fill Holes. Each is one undo step, and each publishes the repaired mesh downstream.

Pins

Pin Type Description
Mesh Mesh The mesh to inspect. Passes straight through to the Mesh output unless you press a repair button.
MinIslandTriangles Whole Number Islands with fewer triangles than this count as floaters. Leave it unconnected to use the value in the details panel.
Pin Type Description
Mesh Mesh The input mesh, unchanged, or the repaired mesh once you have pressed a repair button.
IsClean True/False True when the mesh has no invalid positions, no open edges, no floaters, no degenerate triangles and no pinch points. Blank at the fast scan depth, which skips two of those checks.
Vertices Whole Number Vertex count of the analysed mesh.
Triangles Whole Number Triangle count of the analysed mesh.
OpenBoundaryEdges Whole Number Edges with only one triangle attached. Non-zero means the surface is open.
HoleLoops Whole Number Number of distinct boundary loops (holes) in the surface. A lower bound when pinch points interrupt the walk.
FloaterIslands Whole Number Disconnected islands smaller than Min Island Triangles.
DegenerateTriangles Whole Number Triangles with effectively zero area. Empty (no value) when the scan depth is Boundary + Islands.
BowtieVertices Whole Number Vertices where two surface fans meet at a single point. Empty (no value) when the scan depth is Boundary + Islands.
CoincidentVertices Whole Number Vertices sitting on top of another vertex. Empty (no value) when the check did not run - it is skipped on very large meshes.

Settings

Setting Type Description
Analyze Automatically True/False Re-check the mesh every time it changes upstream. Turn it off on a mesh dense enough that the scan gets in your way; the node then shows nothing until you press Analyze, rather than numbers describing an older mesh.
Scan Depth Choice Which checks to run.
Min Island Triangles Whole number Islands with fewer triangles than this count as floaters, both in the report and for the Remove Floaters button, so the button deletes what the report named. The one exception is the largest surface, which the repair always keeps even when it is itself under the threshold - otherwise "remove everything under 1000 triangles" would empty a model made entirely of small pieces. Set the threshold above every island and the report counts them all while the button removes all but the biggest.
Max Auto Analyze Vertices Whole number Automatic checking is skipped above this vertex count; the Analyze button still works. 0 removes the ceiling.
Measure Symmetry True/False Also measure how far the mesh is from mirroring itself. Off by default: on a dense mesh this one check costs more than all the others together.
Symmetry Axis Choice Which plane the symmetry measurement mirrors about.
Symmetry Plane Origin Choice Which point that plane passes through. Mesh Centre is the sculpt / Fix Symmetry default, so a scan imported off-origin still measures about itself. World Origin is what you need when a one-sided crop has dragged the bounds centre off the real plane.
Symmetry Plane Offset Vector Nudges the plane off that point, in cm. Only the component along the symmetry axis does anything; the other two just slide the plane around inside itself.
Weld Tolerance Fraction Number How close two vertices have to be before Weld merges them, as a fraction of the bounds diagonal, so one number works on a 1 cm prop and a 200 cm character.
Max Hole Edges Whole number Fill Holes leaves boundary loops longer than this alone.

Studio and Graph › Repair

Mirror Mesh

Reflects every vertex about the same plane Fix Symmetry and the sculpt brushes use, and flips the winding so the result is a valid Non-Rigid Fit Target. That is what it is for: wrap a scan onto its...

Mirror Mesh node

The Mirror Mesh node

When to use it

Reflects every vertex about the same plane Fix Symmetry and the sculpt brushes use, and flips the winding so the result is a valid Non-Rigid Fit Target. That is what it is for: wrap a scan onto its own mirror, blend half way, then last-mile Fix Symmetry.

How to use it

  1. 1

    Wire the scan into Mesh and pick the Axis

    X for a head facing +Y.

  2. 2

    The node runs on its own when the mesh arrives

    Read the output as the Non-Rigid Fit target, not as the finished asset.

Pins

Pin Type Description
Mesh Mesh The mesh to reflect. Passes straight through until a mesh arrives, then this node runs on its own.
Pin Type Description
Mesh Mesh The reflected mesh. A wrap target, not a finished symmetrised asset.

Settings

Setting Type Description
Axis Choice The axis the mirror plane faces along. X mirrors left to right for a head looking down +Y, which is the app's front. None is refused rather than quietly doing nothing.
Plane Origin Choice Which point the mirror plane passes through.
Plane Offset Vector Nudges the plane off that point, in cm. Only the component along Axis does anything; the other two just slide the plane around inside itself.
Reverse Winding True/False Flip triangle winding after the reflection. Leave this on: a wrap target with inverted faces will not fit.
Recompute Normals True/False Rebuild normals after the reflection.

Studio and Graph

RBF Deformer

  • RBF Deformer: Reshapes a mesh by dropping a few control points on it and dragging them, with the surface falling away smoothly around each one.
  • Landmarks to RBF Points: Turns a set of landmarks into control points the RBF Deformer can drag.

Studio and Graph › RBF Deformer

RBF Deformer

Reshapes a mesh from a handful of control points. Select the node, click on the mesh to drop points where you want a handle, then drag them. The surface between them follows smoothly, so a few poin...

RBF Deformer node

The RBF Deformer node

When to use it

Reshapes a mesh from a handful of control points. Select the node, click on the mesh to drop points where you want a handle, then drag them. The surface between them follows smoothly, so a few points move a lot of mesh.

Points you place are written back to the Controls pin, so they survive a save and you can reuse them. Landmarks to RBF Points builds a set from landmarks instead of by hand.

Pins

Pin Type Description
Mesh Mesh The mesh to reshape.
Controls RBF Points Control points to start with. The tool saves the ones you place here too, so they come back next time.
Reference Mesh Optional mesh drawn in the viewport to eyeball the result against. Nothing happens to it.
Pin Type Description
Mesh Mesh The reshaped mesh.
Controls RBF Points Passes the control points along to the next node.

Learn more

RBF Deformer toolRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/rbf-deformer-tool-in-mesh-morpher
Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses

Studio and Graph › RBF Deformer

Landmarks to RBF Points

Converts landmark pairs into RBF control points, which is how a handful of hand-placed anchors becomes a smooth deformation across the whole surface through the RBF Deformer.

Landmarks to RBF Points node

The Landmarks to RBF Points node

When to use it

Converts landmark pairs into RBF control points, which is how a handful of hand-placed anchors becomes a smooth deformation across the whole surface through the RBF Deformer.

What you get is a soft global warp. If you want the template to land on the target surface rather than be pulled toward it, Non-Rigid Fit is the node.

Side exists for symmetric meshes. Left or Right takes only that half's landmarks, which is what you want when the other half will be mirrored rather than solved.

Pins

Pin Type Description
Landmarks Landmarks The landmarks to convert. Splines give up their control points only, not the points sampled along them.
Pin Type Description
Controls RBF Points One control point per landmark, on the side you picked.

Settings

Setting Type Description
Side Choice Which half of each landmark pair to take. Left gives you the source point, Right gives you the matching target point.

Learn more

RBF Deformer toolRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/rbf-deformer-tool-in-mesh-morpher
Modify MetaHuman RBF posesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/modify-metahuman-rbf-poses

Studio and Graph

Sculpt

  • Sculpt Mesh: Sculpt the mesh by hand. Pick a brush from the side panel, work in the viewport, then press Accept to get the sculpted mesh and a record of everything you moved.
  • Sculpt Animation Sequence (Experimental): Scrub to a frame where the animation goes wrong, sculpt the fix on the posed mesh, and bake it back into the sequence as a morph target that fires on exactly those frames.
  • Sculpt Geometry Cache (Experimental): Scrub to a frame of a cached animation, sculpt the fix straight onto the deformed mesh, and bake it back into the cache. Experimental.

Studio and Graph › Sculpt

Sculpt Mesh

Sculpt a mesh by hand in the viewport. Select the node and the brushes appear; deselect it and they go away.

Sculpt Mesh node

The Sculpt Mesh node

When to use it

Sculpt a mesh by hand in the viewport. Select the node and the brushes appear; deselect it and they go away.

Wire the unsculpted mesh into Original as well. That is what the Restore brush paints back toward, and what Delta is measured against.

How to use it

  1. 1

    Wire a mesh into Mesh and select the node

  2. 2

    Pick a brush from the side panel and work in the viewport

  3. 3

    Press Accept

    Mesh carries the result; Delta carries what you moved.

Pins

Pin Type Description
Mesh Mesh The mesh you want to sculpt on.
Original Mesh The same mesh before you sculpted it. Delta is measured against this, and the Restore brush paints back toward it.
Weights Weight Map Where the brushes are allowed to bite: 1 is full strength, 0 is frozen, in between feathers. Leave it unconnected to sculpt the whole mesh.
Reference Mesh The surface the Project brush pushes vertices onto. The other brushes ignore it.
Pin Type Description
Mesh Mesh The sculpted mesh, once you press Accept.
Delta Deltas How far each vertex moved from the original. Feed it to Apply Deltas to put the same change on a different mesh.

Learn more

Mesh Morpher StudioRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/mesh-morpher-studio

Studio and Graph › Sculpt

Sculpt Animation Sequence (Experimental)

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Sculpt Animation Sequence (Experimental) node

The Sculpt Animation Sequence (Experimental) node

When to use it

Sculpt corrective shapes directly on a playing animation, frame by frame, then bake them into the sequence as animation-driven morph targets. Editor only.

How to use it

  1. 1

    Connect an Animation input (from a Load Animation node) and a rest-pose mesh that comes from skeletal mesh import data

  2. 2

    Select the node, pick a frame range, sculpt, Accept

  3. 3

    Click Save to bake morph targets into the sequence

Pins

Pin Type Description
Animation Animation The animation to sculpt on, from a Load Animation node. This is also the sequence Save writes the morph curves into.
Mesh Mesh The rest-pose mesh. It has to come from a skeletal mesh import, because that is the asset the baked morph targets land on.

Settings

Setting Type Description
Capture Baseline From GPU True/False Take the posed shape from what the renderer actually draws, so anything a post-process Anim Blueprint, a deformer graph or a morph curve adds is already in the mesh you sculpt on. Needs a live sequence on the Animation input. Turn it off to pose from the raw keyframes instead: exact and instant, but blind to everything those three add.
Name Text What the morph targets get called. They come out numbered from this, one per processed frame, so keep it short and recognisable in the asset.
Apply To LODs True/False Push the shapes down onto the lower LODs too, so they do not pop away as the character gets further from camera.
LOD Vertex Threshold Number Same distance rule as the main projection, but for landing the shape on the lower LODs.
LOD Smooth Type Choice How the shape gets smoothed on the lower LODs.
LOD Smooth Strength Number How hard each LOD smoothing pass pulls. Does nothing while LOD Smooth Iterations is 0.
LOD Smooth Iterations Whole number How many smoothing passes to run on the lower LODs. Coarse LODs usually need a pass or two where LOD0 needs none.
Use Dual Quaternion Skinning True/False Dual quaternion skinning instead of linear blend. Keeps volume on a twisted forearm or wrist, where linear blend pinches the mesh into a candy wrapper.
Use Linear Interpolation True/False Ramp each morph target's weight in and out with linear keys instead of switching it on and off at full strength. Off, the correction pops the frame it starts on.
Transition Frames Whole number How many frames that ramp takes at each end. 1 fades in over a single frame; raise it for a softer hand-off on a slow take. Only read when Use Linear Interpolation is on.
Fade In Frames Whole number Frames at the start of the selected range over which the correction ramps up from nothing. 0 makes it pop on fully at the first frame.
Fade Out Frames Whole number Frames at the end of the selected range over which the correction ramps back down to nothing. 0 makes it cut off at the last frame.

Learn more

Mesh Morpher StudioRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/mesh-morpher-studio

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Sculpt

Sculpt Geometry Cache (Experimental)

Sculpts a fix onto one frame of an Alembic or USD cache and bakes it back into the cache, spread across a frame range you choose.

Sculpt Geometry Cache (Experimental) node

The Sculpt Geometry Cache (Experimental) node

When to use it

Sculpts a fix onto one frame of an Alembic or USD cache and bakes it back into the cache, spread across a frame range you choose.

A cache has no rig to correct through: it is baked geometry, and whatever went wrong in it went wrong for good. This is the way to fix it anyway - scrub to the bad frame, push the surface back where it belongs, and let the correction ride along on the frames either side.

Frames stream off disk as you scrub, so a long cache never has to fit in memory. Still experimental.

How to use it

  1. 1

    Wire a cache into Streaming Cache and select the node

  2. 2

    Scrub to the bad frame, pick a frame range, sculpt, press Accept

  3. 3

    Set the fades so the correction ramps in and out instead of popping

Pins

Pin Type Description
StreamingCache Streaming Geometry Cache The Alembic or USD cache to sculpt on. Frames load off disk as you scrub, so the whole animation never has to fit in memory.
Pin Type Description
StreamingCache Streaming Geometry Cache The same cache with your sculpt baked in. Get Frame and the export nodes pick it up on their own.

Settings

Setting Type Description
Fade In Frames Whole number Frames at the start of the selected range over which the sculpt ramps up from nothing. 0 makes it pop on fully at the first frame.
Fade Out Frames Whole number Frames at the end of the selected range over which the sculpt ramps back down to nothing. 0 makes it cut off at the last frame.
Rotate Deltas True/False Turn each sculpted offset with the surface as it moves through the range. Off, a bump you sculpted on a straight arm keeps pointing the same way in space and slides off the arm the moment it bends.
Smoothing Iterations Whole number How much the surface is smoothed before it works out which way each vertex has turned. More passes give a steadier answer where the mesh folds hard, which is exactly where a sculpt otherwise starts to swim. 10 to 40 is the usual range, and 0 turns it off.
Num Rings Whole number How far out from each vertex that turn is measured, in rings of neighbours. 1 uses only the vertices touching it, 2 also uses their neighbours, and so on. A wider ring gives a steadier answer on a dense mesh.
Smoothing Strength Number How far each smoothing pass moves a vertex toward its neighbours. Higher settles faster and keeps less fine detail. It stops at 0.5, and that ceiling is not arbitrary: past roughly 0.72 the smoothing starts amplifying exactly the wobble it is meant to remove, and the iteration count turns that into a mesh full of invalid positions. A saved file carrying a bigger number is pulled back into range when it loads.

Learn more

Mesh Morpher StudioRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/mesh-morpher-studio

Studio and Graph

Geometry Cache

Studio and Graph › Geometry Cache

Apply Deltas to Geometry Cache

One shape change, stamped onto every frame of a geometry cache, so a fix you sculpt once follows the whole take.

Apply Deltas to Geometry Cache node

The Apply Deltas to Geometry Cache node

When to use it

One shape change, stamped onto every frame of a geometry cache, so a fix you sculpt once follows the whole take.

The output is a Streaming Cache pin, so it chains with Sculpt (deltas accumulate) and is persisted by feeding an Export node. Nothing is written to disk here.

How to use it

  1. 1

    Connect a streaming cache

    From Load Geometry Cache, Load Alembic File or Load USD File.

  2. 2

    Connect the rest Mesh and the edited Target

    The two must share vertex order.

Pins

Pin Type Description
StreamingCache Streaming Geometry Cache The cache to change. Every frame in it picks up the same edit.
Mesh Mesh The reference mesh before you sculpted it.
Target Mesh The same mesh after sculpting. Whatever moved between the two is what every frame gets, so the vertex counts have to match or the node errors and passes the cache straight through.
Pin Type Description
StreamingCache Streaming Geometry Cache Same cache, now with the edit folded into every frame. Chain another one of these on to stack a second fix.

Studio and Graph › Geometry Cache

Get Streaming Geometry Cache Frame

Grabs one frame out of a streaming geometry cache as an ordinary mesh, so any static mesh node can work on a single moment of an animation. The archive opens once and stays open, so stepping frames...

Get Streaming Geometry Cache Frame node

The Get Streaming Geometry Cache Frame node

When to use it

Grabs one frame out of a streaming geometry cache as an ordinary mesh, so any static mesh node can work on a single moment of an animation. The archive opens once and stays open, so stepping frames costs one read each.

Per-frame sculpt deltas set upstream by Geometry Cache Sculpt are folded in automatically, so what you get is the edited frame rather than the raw archive sample.

Pins

Pin Type Description
StreamingCache Streaming Geometry Cache The cache to read from. The file stays on disk and is only opened when a frame is asked for.
Pin Type Description
Mesh Mesh The mesh at the frame you picked.

Settings

Setting Type Description
Frame Number Whole number Which frame to read. Past Max Frame Number the node errors rather than quietly handing you a different frame.

Studio and Graph

Selection

  • Select: Paint over the mesh in the viewport to mark the part you want. Accept and that region comes out as a weight map and as a trimmed-down mesh.
  • Select Landmarks: Click matching points on two meshes side by side to pair them up, or draw splines along matching curves. The pairs come out on the Landmarks pin as you place them.
  • Invert Landmarks: Swaps the two sides of a landmark set, so what was the source becomes the target. Splines swap with them.
  • Auto Face Landmarks: Places 478 MediaPipe facial landmarks on a head scan. Wire a second head into Target to get a source-to-target correspondence for Non-Rigid Fit or Elastic Conformer instead of a self-paired set.
  • Save Landmarks: Writes one side of a landmark set out to a .mmlmk file, so another graph or another mesh can load the same points back in.

Studio and Graph › Selection

Select

Mark triangles by hand with the viewport's selection brush, then accept to emit the selection and the clipped mesh. When the region is a judgement call rather than something measurable, this beats ...

Select node

The Select node

When to use it

Mark triangles by hand with the viewport's selection brush, then accept to emit the selection and the clipped mesh. When the region is a judgement call rather than something measurable, this beats deriving one with Weight Map To Selection.

How to use it

  1. 1

    Connect a mesh and select the node to pick up the brush

  2. 2

    Paint the triangles you want in the viewport

  3. 3

    Press Accept

    Weights carries the mask, Mesh carries the trimmed geometry.

Pins

Pin Type Description
Mesh Mesh The mesh you paint on.
Pin Type Description
Mesh Mesh Just the triangles you painted, cut out as their own mesh. Passes the whole mesh through when nothing is selected.
Weights Weight Map The painted mask, brush falloff and all: 1 is fully selected, 0 is untouched. These line up with the input mesh's vertices, not with the trimmed Mesh output, which gets renumbered. Selection Threshold cuts the Mesh output only, never these weights.

Settings

Setting Type Description
Selection Threshold Number A painted vertex counts as selected once its weight reaches this. The cut keeps or drops whole triangles, so the soft brush edge has to become a yes or no somewhere, and this is where. At 0 the faintest touch of the falloff drags a triangle in. It trims the Mesh output only; the Weights output keeps its falloff either way. Two catches. There is only a falloff to cut when Full Strength Mask is off, under Masking > Draw. With the default on, the brush stamps a hard 1.0 and the marquee and Sections list seed exactly 1.0, so every value above 0 picks the same triangles. And the viewport never previews the cut: hide-unselected isolates anything you have painted at all, so a feathered mask accepts tighter than the region you were looking at.
Occlusion Test Method Choice How hidden geometry is judged. Fast winding is quick and catches sealed pockets inside a closed mesh; ray visibility fires rays out of each face and is the safer choice on an open or messy mesh.
Triangle Sampling Choice Where on each triangle the hidden-or-not test is taken.
Winding Iso Value Number The cutoff that separates inside from outside for the winding test. 0.5 is standard; raise it to select less, lower it to select more.
Add Random Rays Whole number Extra rays in random directions on top of the six axis rays. Raise it when the ray test leaves slivers of hidden surface unselected.
Add Triangle Samples Whole number Extra sample points scattered over each triangle. Raise it when a big triangle is missed because only a corner of it happens to be hidden.
Grow Shrink Whole number Reach the selection outward (+) by a ring or two to catch the rim around a cavity, or pull it inward (-) to keep clear of the visible surface. Counts in rings of vertices.
Invert True/False Flip it: select everything you can see from outside instead of what you cannot.

Studio and Graph › Selection

Select Landmarks

Place and pair landmark correspondences by hand across a source and a target mesh, splines included for edges like a lip line or a jaw. Landmarks are the constraints Non-Rigid Fit and Elastic Confo...

Select Landmarks node

The Select Landmarks node

When to use it

Place and pair landmark correspondences by hand across a source and a target mesh, splines included for edges like a lip line or a jaw. Landmarks are the constraints Non-Rigid Fit and Elastic Conformer solve against, so this is where a wrap either becomes accurate or stays approximate.

On a head scan, run Auto Face Landmarks first and refine here rather than placing every point yourself. When both meshes have albedo and you want hundreds of pairs instead of dozens, Texture Flow Landmarks is the faster route in.

A spline is sampled into individual pairs, and Spline Segment Samples says how many. A dense spline is a strong constraint, so too many samples on a badly placed spline will fight the rest of the fit instead of helping it.

Pins

Pin Type Description
Mesh Mesh The mesh shown in the left pane. Points you click get snapped onto its surface.
Target Mesh Optional. The mesh shown in the right pane, where you click the matching points.
Landmarks Landmarks Optional. A landmark set to start from - its points and splines come in as your editable selection so you can nudge, add or delete them instead of placing every one by hand. Wire Auto Face Landmarks here. Leave it unwired to start blank.
Pin Type Description
Landmarks Landmarks The paired points and splines, updated every time you place or move one. A point with no partner yet is held back until you pair it.

Settings

Setting Type Description
Spline Segment Samples Whole number How many points get generated between each pair of spline control points. Higher gives a smoother curve and more landmarks downstream. Splines you already finished keep the density they were drawn with. Each Select Landmarks node has its own setting.

Studio and Graph › Selection

Invert Landmarks

Swaps the source and target sides of a Landmarks wire, splines included. One node, one job: a single hand-placed correspondence set can then drive a fit in either direction without being re-authored.

Invert Landmarks node

The Invert Landmarks node

When to use it

Swaps the source and target sides of a Landmarks wire, splines included. One node, one job: a single hand-placed correspondence set can then drive a fit in either direction without being re-authored.

Drop it in when the wrap has to go the other way, template onto scan instead of scan onto template.

Whatever consumes the landmarks has Mesh and Target wires that need swapping too. Invert only the landmarks and the fit pulls exactly the wrong way.

Pins

Pin Type Description
Landmarks Landmarks The landmark set to flip.
Pin Type Description
Landmarks Landmarks The same landmarks with each pair's two sides swapped over.

Studio and Graph › Selection

Auto Face Landmarks

Places all 478 MediaPipe facial landmarks on a head scan without you clicking them on by hand.

Auto Face Landmarks node

The Auto Face Landmarks node

When to use it

Places all 478 MediaPipe facial landmarks on a head scan without you clicking them on by hand.

It needs the Face Landmarks model pack to run at all, and without it the node reports the missing pack and does nothing. It also needs the mesh to carry colour or texture detail: MediaPipe reads a rendered image of the head, and a bare grey scan is refused outright rather than guessed at.

With nothing wired into Target, it places all 478 points on Mesh alone, each one paired with itself: save that set with Save Landmarks, or load it into Select Landmarks to refine by hand. Wire a second head into Target and it detects independently on both meshes, then pairs every point that landed on both sides into a source-to-target correspondence, ready to drive Non-Rigid Fit or Elastic Conformer with nothing hand-placed on either side.

For a correspondence that lives in a mole or a printed seam rather than a standard face point, Texture Flow Landmarks is still the better start.

How to use it

  1. 1

    Wire the scan into Mesh

    Check that Up Axis and Front Axis match how the scan is actually sitting. The defaults are the app's own, front +Y, up +Z.

  2. 2

    Press Detect Landmarks

    Read LastRun and Detector Used.

  3. 3

    For a full correspondence, also wire a second head into Target, then press again

  4. 4

    Send the Landmarks output into Non-Rigid Fit or Elastic Conformer, or into Select Landmarks to nudge any of them by hand. Needs the Face Landmarks model pack (Help > AI Model Packs). There is no geometry-only fallback: without the pack this node cannot run at all

Pins

Pin Type Description
Mesh Mesh The head scan to place landmarks on.
Target Mesh Optional. A second head to pair every landmark against. Wire this to get a proper source-to-target correspondence instead of a self-paired set.
Pin Type Description
Landmarks Landmarks The landmarks that were placed. With no Target wired in, each pair's two sides are the same point, since there is only one mesh. With a Target, the Mesh side is the source and the Target side is where it lands, which is what Non-Rigid Fit and Elastic Conformer want.

Settings

Setting Type Description
Up Axis Choice Which world axis points from the chin to the crown.
Front Axis Choice Which world axis the face looks along. The app's own convention is +Y, which with Up +Z puts the subject's left at -X.
ML Albedo Source Choice Which colour MediaPipe reads the mesh through. Same source Texture Flow Landmarks resolves from.
ML Render Resolution Whole number How big the internal render MediaPipe reads is. A landmark can only land as precisely as one pixel is wide on the model.
ML Min Detection Score Number MediaPipe's own detector confidence floor. Below this the rendered view is treated as having found no face at all.

Studio and Graph › Selection

Save Landmarks

Writes one side of a Landmarks wire out to a Graph Landmarks asset on disk, the way the classic Mesh Morpher wrapper saved control points. A hand-placed set that took real time to author is worth k...

Save Landmarks node

The Save Landmarks node

When to use it

Writes one side of a Landmarks wire out to a Graph Landmarks asset on disk, the way the classic Mesh Morpher wrapper saved control points. A hand-placed set that took real time to author is worth keeping, so a later graph can start from it instead of from nothing.

Side picks whether the source or the target points get stored. The pairs are not symmetric, so saving the wrong side leaves you with a file of points that belong to the other mesh.

Saving happens from the node, not from a wire changing.

How to use it

  1. 1

    Connect the mesh and the landmarks

  2. 2

    Select the side to save

    Left is the source, Right is the target.

  3. 3

    Toggle the Save property to write the file

Pins

Pin Type Description
Mesh Mesh Optional, but worth wiring. Each landmark records where it sits in this mesh's UVs, which is what lets the saved set be placed by UV later.
Landmarks Landmarks The landmarks to write out.

Settings

Setting Type Description
Side Choice Which half of each pair gets saved. Left is the source side, Right is the target side.

Studio and Graph

Skeleton

  • Fit Skeleton: Moves a rig's joints to follow a reshaped version of the same mesh, so the skeleton still sits inside the body.
  • Pose: Pose a rigged mesh by dragging its joints in the viewport. Accept to send the posed mesh on.
  • Remove Bones: Deletes joints from a rig and hands their skin weights up to the nearest surviving parent.
  • Transfer Weights: Gives an unrigged mesh the skeleton and skin weights of a rigged one, so a new garment or a retopo picks up the body's rig. Press Transfer Weights to run it.
  • Copy Bones Transforms: Copies a skeleton's pose from one mesh onto another, matching bones by name.
  • Paint Skin Weights: Brush skin weights onto a rigged mesh by hand, one bone at a time, with locking and left/right mirroring.
  • Retarget Pose: Puts one character's pose onto another character built on a completely different rig, keeping the second one's own proportions.
  • Skeleton Edit: Build or fix a skeleton by hand: place joints on the surface, drag them, rename, reparent, mirror, delete. Skin weights follow every edit.

Studio and Graph › Skeleton

Fit Skeleton

The geometry is right and the skeleton is still sitting where the original character's joints were. This moves the bones to match. It is the step after a body-shape change, a wrap or a non-rigid fit.

Fit Skeleton node

The Fit Skeleton node

When to use it

The geometry is right and the skeleton is still sitting where the original character's joints were. This moves the bones to match. It is the step after a body-shape change, a wrap or a non-rigid fit.

How to use it

  1. 1

    Connect the rigged mesh and its reshaped version

  2. 2

    Set Start Bone, and list anything that should stay put

  3. 3

    The output updates on its own as the meshes or settings change

Pins

Pin Type Description
Mesh Mesh The rigged mesh whose joints get moved.
Target Mesh The reshaped version of that same mesh. Same vertex count and order.
Bones Bone Selection Optional. Wire a bone list here to fit only those and leave the rest alone.
Pin Type Description
Mesh Mesh The mesh with its joints moved to fit.

Settings

Setting Type Description
Start Bone Text The first bone that gets fitted. Anything ahead of it in the skeleton stays put. Usually "root", which fits the whole rig. Point it at the pelvis to leave the root and its motion bones alone.
End Bone Text Nothing reads this. The fit runs from Start Bone to the end of the skeleton, so to spare a bone put it in Ignore Bones or wire the Bones pin instead.
Ignore Bones Text Bones to leave exactly where they are, one per row. Names have to match exactly. Shift+Enter adds a row.
Ignore String Text Leave alone any bone whose name contains one of these, one per row. Quickest way to skip every twist or corrective joint at once. Keep the fragments long enough to be specific: "l_" catches half the rig.
Orient Bones Text Bones that also get re-aimed at their child once the fit has moved everything, one per row. Limb bones want this. Without it a forearm whose wrist has moved keeps its old rotation, and the twist shows up as a pinched elbow.
Orient Bones Above Bone Text Re-aim every bone that comes after this one in the skeleton's bone order too, on top of the list above. Leave it empty to use the list alone.
Bone To Vertex Threshold Number How far a vertex can sit from a joint and still be used to work out where that joint should move to. Only comes into play for joints the surface itself could not guide.
Bone To Bone Threshold Number How close a joint has to sit to the line between two other joints before it counts as riding on that segment. Only used when Preserve Relative Bone Transforms is on.
Max Distance To Surface Number How far from the surface a joint can be and still be moved by the surface right underneath it. Joints deeper than this fall back to averaging nearby vertices, which is looser. Raise it on a chunky character whose spine sits well inside the body.
Use Vertex Weights True/False Use the mesh's skin weights to decide which vertices belong to a joint that sits too deep for the surface to guide. On a mesh with junk weights this drags joints toward whatever happens to be weighted to them, so turn it off there.
Preserve Relative Bone Transforms True/False Keep a joint that sat on top of another bone's segment stuck to that segment after the fit, instead of letting it drift off the line.
Vertex Sample Size Whole number How many nearby vertices to average when a joint has to fall back to proximity. Small numbers make the joint chase one lump of geometry.
Always Match Geometry True/False After fitting, snap the output vertices onto Target so the shape matches exactly. Turn it off and you get whatever the skinning produced, which drifts from Target.
Advanced Skeleton Fitting True/False Adds a solver pass that works the joints out from the skin weights rather than just sliding them to follow the surface. Slower, and only bones with vertices actually weighted to them use its result.
Global Iterations Whole number Passes the solver spends building its starting guess before the main loop.
Iterations Whole number Main solver passes. More costs time and settles closer, then stops helping.
Transformation Iterations Whole number Passes spent on the bone transforms inside each main pass.
Affinity Whole number Strength of the solver's soft affinity constraint.
Affinity Normalization Number How that affinity constraint is normalised.

Learn more

Morph full body MetaHumans and skeletonsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/morph-full-body-meta-humans-and-skeletons

Studio and Graph › Skeleton

Pose

Opens a viewport for posing the skeleton by hand and outputs the deformed mesh. Select the node to get the gizmos; deselect it and they go away.

Pose node

The Pose node

When to use it

Opens a viewport for posing the skeleton by hand and outputs the deformed mesh. Select the node to get the gizmos; deselect it and they go away.

Use it to check a rig at extreme angles before shipping it, to build the corrected pose Set DNA Expression or Set DNA RBF Pose will record, or simply to pose a character for a render.

How to use it

  1. 1

    Connect a skeletal mesh

  2. 2

    Pose the skeleton in the viewport

  3. 3

    The output is the posed mesh

Pins

Pin Type Description
Mesh Mesh The rigged mesh to pose. Its skeleton is what you grab in the viewport.
Highlight Bone Selection Bones to have picked already when the tool opens.
Reference Mesh Optional second mesh drawn alongside, to pose against.
Bind Pose Mesh Optional: the same mesh at its bind or neutral pose. Wire it only if you want the skinning solved from the T-pose while the gizmos start on an already-posed Mesh. Leave it unwired to treat Mesh as the rest pose - Get DNA RBF Pose's Mesh is already a matching vertices-and-bones pair.
Pin Type Description
Mesh Mesh The mesh in its new pose, skeleton and all.
Bones Bone Selection The bones you had selected, plus their mirror partners when mirroring was on.

Learn more

Morph full body MetaHumans and skeletonsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/morph-full-body-meta-humans-and-skeletons

Studio and Graph › Skeleton

Remove Bones

Deletes named bones and redistributes their vertex weights onto the bones that remain, so the mesh stays fully skinned. Stripping twist bones, facial joints or an IK chain a target engine will not ...

Remove Bones node

The Remove Bones node

When to use it

Deletes named bones and redistributes their vertex weights onto the bones that remain, so the mesh stays fully skinned. Stripping twist bones, facial joints or an IK chain a target engine will not accept, without hand-editing weights.

Remove Children is the surprise. Off, a removed bone's children get re-parented and survive. On, naming a limb's root makes the whole limb disappear.

Weights go to the parent, so removing a chain piles all of that influence onto one joint and the deformation there stiffens up. Check the result at extreme angles, not at rest.

How to use it

  1. 1

    Connect the rigged mesh

  2. 2

    List the bones to remove, one per line

  3. 3

    The output carries the smaller skeleton

Pins

Pin Type Description
Mesh Mesh The rigged mesh to strip bones from.
Pin Type Description
Mesh Mesh The mesh with a smaller skeleton. Weights from the deleted joints move up to the nearest surviving parent.

Settings

Setting Type Description
Bones Text Bones to delete, one per line. Names have to match exactly, so a typo silently leaves that bone in place, and the root is never deleted whatever you type here. Shift+Enter adds a row.
Remove Children True/False Also delete every joint parented under the ones you named.

Learn more

Morph full body MetaHumans and skeletonsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/morph-full-body-meta-humans-and-skeletons

Studio and Graph › Skeleton

Transfer Weights

Copies a rigged mesh's skeleton and its per-vertex skin weights onto a mesh that has neither, matching the two by position or through their UVs.

Transfer Weights node

The Transfer Weights node

When to use it

Copies a rigged mesh's skeleton and its per-vertex skin weights onto a mesh that has neither, matching the two by position or through their UVs.

This is how anything new gets rigged without hand-painting: a garment modelled over a body, a retopologised head, a piece appended onto a character. The recipient comes out skinned to the same skeleton and poses with it.

Whatever skeleton the target already had is replaced by the source's, so run it before you start editing the recipient's rig rather than after.

How to use it

  1. 1

    Connect the rigged mesh and the mesh that needs rigging

  2. 2

    Pick UV matching if both share a layout, otherwise set the search radius

  3. 3

    Press Transfer Weights

Pins

Pin Type Description
Mesh Mesh The rigged mesh to take the skeleton and weights from.
Target Mesh The mesh that gets rigged. Whatever skeleton it had is replaced by the source's.
Pin Type Description
Target Mesh That mesh, now skinned to the source's skeleton.

Settings

Setting Type Description
Transfer By UV Match True/False Match by UV instead of by position. Turn it on when both meshes share a UV layout - it beats proximity around fingers, armpits and anywhere two surfaces nearly touch.
Radius Percentage Number How far to look for a source point, as a fraction of the target's bounding box diagonal. Too small and whole regions find nothing and drop back to plain nearest-point weights. Use a negative number to search the entire source mesh.
Normal Threshold Number How far a source normal may point away from the target's and still count as a match, in degrees. Use a negative number to ignore normals altogether.
Layered Mesh Support True/False When a match fails the normal test, try again with the normal flipped. Helps on layered meshes where an inner and an outer surface sit close together facing opposite ways, like a jacket lining over a shirt.
Num Smoothing Iterations Whole number How many smoothing passes to run over the weights the solver had to guess. Too many and a tight area like the jaw blurs into its neighbours.
Smoothing Strength Number How much each of those passes moves the weights.
Max Num Influences Whole number The most bones allowed to influence any one vertex.

Learn more

Morph full body MetaHumans and skeletonsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/morph-full-body-meta-humans-and-skeletons

Studio and Graph › Skeleton

Copy Bones Transforms

Bone transforms from one mesh's skeleton onto another's, matched by bone name, with an option to re-skin the target geometry to the new pose while it is there.

Copy Bones Transforms node

The Copy Bones Transforms node

When to use it

Bone transforms from one mesh's skeleton onto another's, matched by bone name, with an option to re-skin the target geometry to the new pose while it is there.

How to use it

  1. 1

    Connect the mesh holding the pose, and the mesh that should receive it

  2. 2

    Turn Apply Skinning on if the geometry should move too

  3. 3

    The output carries the copied skeleton pose

Pins

Pin Type Description
Mesh Mesh The mesh holding the pose you want to copy. Bones are matched by name.
Target Mesh The rigged mesh that receives the pose. Bones with no match by name stay where they are.
Pin Type Description
Target Mesh That same mesh, now holding the source's pose.

Settings

Setting Type Description
Apply Skinning True/False Also move the vertices to follow the new bone poses. It needs skin weights on the mesh to do anything, so leave it off when the mesh has none, or when something further down the graph does the skinning.

Learn more

Morph full body MetaHumans and skeletonsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/morph-full-body-meta-humans-and-skeletons

Studio and Graph › Skeleton

Paint Skin Weights

Paints per-vertex skin weights onto a skeletal mesh by hand, one bone at a time. Select the node to get the brush; deselect it and the tool goes away.

Paint Skin Weights node

The Paint Skin Weights node

When to use it

Paints per-vertex skin weights onto a skeletal mesh by hand, one bone at a time. Select the node to get the brush; deselect it and the tool goes away.

This is the fix for the places an automatic bind gets wrong - a shoulder that collapses, a jaw that drags the neck with it. For a first pass across the whole character, Auto-Skin or Transfer Weights get you most of the way there first.

The mesh has to arrive with a skeleton and skin weights already on it. A static mesh or a plain file import has nothing to paint into.

How to use it

  1. 1

    Connect a skinned mesh

  2. 2

    Pick a bone in the tool and paint its weights in the viewport

  3. 3

    The output is the mesh with the updated weights

Pins

Pin Type Description
Mesh Mesh The mesh to paint on. It needs a skeleton and skin weights already.
Highlight Bone Selection The bone, or bones, to have active when the tool opens.
Pin Type Description
Mesh Mesh The mesh carrying the weights you painted.
Bones Bone Selection The bone you were painting, plus any you locked.

Learn more

Morph full body MetaHumans and skeletonsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/morph-full-body-meta-humans-and-skeletons

Studio and Graph › Skeleton

Retarget Pose

Takes the articulation of one rigged mesh - a Body Pose Detection result, an animation frame, any posed rig - and puts it onto a different skeleton entirely: a MetaHuman, the UE Mannequin, a Mixamo...

Retarget Pose node

The Retarget Pose node

When to use it

Takes the articulation of one rigged mesh - a Body Pose Detection result, an animation frame, any posed rig - and puts it onto a different skeleton entirely: a MetaHuman, the UE Mannequin, a Mixamo character, a rig of your own. The recipient keeps its own proportions; only the pose crosses over.

Pins

Pin Type Description
Mesh Mesh The posed character you want to copy from: a Body Pose Detection result, an animation frame, any posed rig. Shown as Source Pose on the node.
Target Mesh The character that gets posed, a MetaHuman body for instance. It needs a skeleton and skin weights.
SourceRest Mesh The same source character un-posed. Leave it empty for a Body Pose Detection source, where the rest pose is reconstructed for you; connect it for anything else or nothing will move. Shown as Source Rest on the node.
Pin Type Description
Target Mesh That character in the new pose, skinned.

Settings

Setting Type Description
Rotation Mode Choice How a target chain takes its rotation from the source chain when the two have different bone counts. Interpolated copes with most rigs.
Apply Root Rotation True/False Carry the source's body facing and torso lean across. Turn it off to keep the target pointing the way it was authored.
Apply Root Translation True/False Move the target's pelvis by the source's root motion, scaled to the target's height.
Recompute Normals True/False Rebuild the vertex normals after skinning. Off, the shading keeps the creases of the rest pose and every new bend lights wrong.
Enable IK True/False A second pass over the arm and leg chains that pins hands and feet onto a goal worked out from the source. The plain bone transfer already gives you a correct static pose; this tightens up where the hands and feet land when the two characters are built very differently. It only fires on chains the source marks as limbs, which today means a Body Pose Detection source. On anything else it changes nothing either way.
IK Alpha Number 0 leaves the pose where the bone transfer put it, 1 puts the hand or foot right on the goal.
Allow Stretch True/False Let a limb stretch past its rest length to reach a goal it cannot otherwise get to, instead of stopping at full extension. Watch for rubbery forearms.
Retarget IK Bones True/False Keep the rig's marker bones (ik_foot_l, ik_hand_r, ik_hand_gun and the rest) following their real bones after the transfer, so foot planting and weapon setups still work on the new pose. Leave it on for UE5 Mannequin and MetaHuman skeletons.

Learn more

Morph full body MetaHumans and skeletonsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/morph-full-body-meta-humans-and-skeletons

Studio and Graph › Skeleton

Skeleton Edit

Authors and edits a mesh's skeleton by hand. Click to select joints, Ctrl-click the surface to add one, drag to move them, and use the panel to rename, reparent, mirror or delete. Skin weights are ...

Skeleton Edit node

The Skeleton Edit node

When to use it

Authors and edits a mesh's skeleton by hand. Click to select joints, Ctrl-click the surface to add one, drag to move them, and use the panel to rename, reparent, mirror or delete. Skin weights are preserved through every edit.

It works on an unrigged mesh too: build a skeleton from scratch here, then Auto-Skin or Paint Skin Weights downstream.

For one joint sitting in the wrong place this is the right tool. When the whole skeleton has to follow a reshaped body, Fit Skeleton does it in one go.

How to use it

  1. 1

    Connect a mesh, rigged or not

  2. 2

    Edit the skeleton in the viewport

  3. 3

    The output carries the edited skeleton, weights remapped

Pins

Pin Type Description
Mesh Mesh The mesh to work on. It does not need a rig - an unrigged mesh starts you from nothing.
Pin Type Description
Mesh Mesh The mesh with your edited skeleton, weights remapped to match.

Learn more

Morph full body MetaHumans and skeletonsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/morph-full-body-meta-humans-and-skeletons

Studio and Graph

Wrapper

  • Rigid Fit: Moves, rotates and scales one mesh onto another without bending it. Run it before any wrap so the two meshes start out roughly on top of each other.
  • Elastic Conformer: Stretches one mesh onto the shape of another while keeping its own vertex count and layout. Built for getting a garment to sit on a body without crumpling it.
  • Apply Rigid Transform: Bakes a move, a rotation and a scale into a mesh's vertex positions. Normally fed by the Transform pin of a Rigid Fit so a second mesh follows the first.
  • Non-Rigid Fit: Bends one mesh until it matches another's shape, keeping its own vertex count and layout. Rigid Fit first, then this.
  • Texture Flow Landmarks: Works out where the same patch of colour sits on two meshes and hands the answer to Non-Rigid Fit as landmark pairs.

Studio and Graph › Wrapper

Rigid Fit

Aligns one mesh to another using nothing but a move, a turn and a scale. No vertex moves relative to any other, so the shape is exactly what it was - it is just somewhere else.

Rigid Fit node

The Rigid Fit node

When to use it

Aligns one mesh to another using nothing but a move, a turn and a scale. No vertex moves relative to any other, so the shape is exactly what it was - it is just somewhere else.

This is the first step of every wrap. Non-Rigid Fit and Elastic Conformer both work by looking for the nearest bit of target surface, and that only means anything once the two meshes already sit on top of each other. Feed them two shapes standing in different places and the very first pass matches the wrong things.

The Transform output is the move it worked out. Send it through Apply Rigid Transform to put that same move on the clothing, the landmarks mesh, anything that has to travel with the body. Solving each part separately is what makes the parts drift apart.

How to use it

  1. 1

    Connect the mesh to move and the target to align it to

  2. 2

    Decide whether rotation and scale are allowed

  3. 3

    Click Apply

Pins

Pin Type Description
Mesh Mesh The mesh being moved.
Target Mesh The mesh being aligned to. It stays where it is.
Landmarks Landmarks Optional. Landmarks wired in here ride along with the move so they still sit on the surface afterwards. They do not steer the alignment itself.
Pin Type Description
Mesh Mesh The moved mesh.
Transform Transform The move it worked out. Send it to Apply Rigid Transform to put the same move on other meshes.
Landmarks Landmarks The landmarks you wired in, shifted onto the moved mesh.

Settings

Setting Type Description
Use Rotation True/False Let the fit turn the mesh as well as move and scale it. Off leaves the orientation exactly as you had it.
Preserve Up Axis True/False Keep the mesh upright and let it only spin around the vertical. Turn this off and the fit is free to pick any orientation, which on a roughly symmetric body means it can come back lying on its side or upside down.
Use Scale True/False Resize the mesh so it matches the target's size.
Non-Uniform Scale True/False Allow a different amount of scale on each axis, matching the target's bounding box rather than its overall size. Useful for a body that is the right height but the wrong width. Leave it on by accident and it will squash a head to fit.
Align Floor Level True/False After aligning, slide the result up or down so its lowest point sits at the target's lowest point. For anything that stands on a floor, matching the feet beats matching the middle.

Learn more

3D wrap MetaHuman conform meshesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/how-to-3d-wrap-metahuman-conform-meshes-in-unreal-engine-with-mesh-morpher-graph
Wrapper with MH and DAZ charactersRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/mesh-morpher-wrapper-with-mh-and-daz-characters

Studio and Graph › Wrapper

Elastic Conformer

Wraps a source mesh onto a target surface by stretching it elastically, so it takes the target's shape while keeping its own topology: same vertex count, same order, same UVs, same skin weights.

Elastic Conformer node

The Elastic Conformer node

When to use it

Wraps a source mesh onto a target surface by stretching it elastically, so it takes the target's shape while keeping its own topology: same vertex count, same order, same UVs, same skin weights.

That is what makes it a garment tool rather than a remesher. A jacket conformed onto a new body is still the same jacket underneath - everything already rigged and textured against those vertices survives the wrap. Non-Rigid Fit does the same job with a stiffness schedule and a much larger set of controls; this one is the faster, simpler route when the two shapes already sit close together.

Landmarks are optional but they are what keeps a collar on the collar. Without them the wrap only knows about nearest surface, and a sleeve near a ribcage will happily grab the ribcage.

How to use it

  1. 1

    Connect the source mesh, the target, and landmarks if you have them

  2. 2

    Set the iterations, stiffness and search range

  3. 3

    Click Apply

Pins

Pin Type Description
Mesh Mesh The mesh that gets pulled onto the target. Its vertex count and layout survive.
Target Mesh The surface being wrapped onto. It does not move.
Landmarks Landmarks Optional. Point and curve pairs that pin parts of the source to known places on the target.
Pin Type Description
Mesh Mesh The wrapped mesh, same vertex count and layout as it went in.
Landmarks Landmarks The landmarks you wired in, moved onto the wrapped mesh.

Settings

Setting Type Description
Iterations Whole number How many passes to make. More gets closer to the target and takes longer.
Setting Type Description
Stiffness Number How much the mesh holds together as it travels. High and it moves as one piece. Low and each vertex goes its own way, which is where the crumpling and the jagged spikes come from.
Smoothing Iterations Whole number How many smoothing passes run after each main pass.
Adaptive Smoothing Iterations True/False Taper those smoothing passes off as the run goes on, so it tidies hard early and leaves the detail alone at the end.
Smoothing Neighbors Whole number How many nearby vertices each vertex is smoothed against.
Neighbor Radius Number How far the smoothing reaches, measured against typical vertex spacing. Higher lets distant neighbours have a say and rounds the result off. Lower keeps it local.
Setting Type Description
Vertex Range Number How far a vertex will look for somewhere to land on the target. Too small and patches of the mesh never find the surface and just sit where they started. Too large and a sleeve grabs the ribcage underneath it.
Projection: Max Displacement Scale Number How far a single vertex is allowed to travel in one pass, counted in average edge lengths. Lower reins in the spikes; higher lets the mesh cross a bigger gap in fewer passes.
Projection Type Choice How a vertex travels to its match. Point to Point heads straight for the nearest point on the target. Point to Plane slides along the target surface instead, which settles far more calmly once you are close.
Setting Type Description
Landmark Weight Number How hard the landmarks pull. Higher pins them tighter and lets the surface around them distort more to obey.
Adaptive Landmark Weight True/False Fade the landmark pull out as the run goes on, so they place the mesh early and then let the surface settle onto the target on its own.
Influence Decay Number How far a landmark's grip reaches into the vertices around it. Higher freezes a wider patch of surface around each one.
Propagation Duration Number What share of the run that grip keeps spreading for. Higher reaches further and costs more.
Mobility Dampening Number How stubbornly the area near a landmark resists being smoothed. Higher keeps it rigid.
Influence Falloff Number How abruptly that grip stops. Higher gives a tighter frozen patch with a harder edge to it.
Setting Type Description
Use GPU Acceleration True/False Do the hunting for matches on the GPU. Much faster once the mesh passes a few thousand vertices, and it falls back to the CPU on its own when the GPU cannot take it.
Setting Type Description
Visualization Mode Choice What gets painted on the mesh in the diagnostic window that opens beside the app while the wrap runs. Displacement colours by how far each vertex has come, Iteration Delta by how far it moved this pass, Correspondence Weight by how much the fit trusts its match. It is a tuning aid for watching the solver work, not a preview. Disabled opens no window and is the quickest.
Preview Update Interval Whole number How many passes go by between redraws of that window. Higher redraws less often and steals less time from the wrap. 1 redraws every pass.
Preview: Max Displacement Scale Number Has no effect at present. The colours in that window are scaled from the Max Displacement Scale setting under Projection instead.

Learn more

3D wrap MetaHuman conform meshesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/how-to-3d-wrap-metahuman-conform-meshes-in-unreal-engine-with-mesh-morpher-graph
Wrapper with MH and DAZ charactersRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/mesh-morpher-wrapper-with-mh-and-daz-characters

Studio and Graph › Wrapper

Apply Rigid Transform

Applies a rigid transform that Rigid Fit Mesh already solved.

Apply Rigid Transform node

The Apply Rigid Transform node

When to use it

Applies a rigid transform that Rigid Fit Mesh already solved.

The point is reuse. Solve the alignment once against the geometry you trust, then move everything else with that same motion: the body, its clothing, the mesh its landmarks were placed on. Solving separately for each part is what makes the parts drift apart.

Points move and nothing else does. Vertex count, order, weights and attributes come through untouched.

How to use it

  1. 1

    Connect the mesh and the rigid transform

  2. 2

    The output is that mesh, moved

Pins

Pin Type Description
Mesh Mesh The mesh to move.
Transform Transform The move, rotation and scale to apply. Comes straight off a Rigid Fit node's Transform pin.
Pin Type Description
Mesh Mesh The mesh with that move baked into its vertex positions.

Learn more

3D wrap MetaHuman conform meshesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/how-to-3d-wrap-metahuman-conform-meshes-in-unreal-engine-with-mesh-morpher-graph
Wrapper with MH and DAZ charactersRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/mesh-morpher-wrapper-with-mh-and-daz-characters

Studio and Graph › Wrapper

Non-Rigid Fit

Performs non-rigid mesh fitting using icp and ARAP.

Non-Rigid Fit node

The Non-Rigid Fit node

Performs non-rigid mesh fitting using icp and ARAP.

Deforms a source mesh to match a target mesh using landmark correspondences and iterative closest point algorithms.

How to use it

  1. 1

    Connect source mesh, target mesh, and landmarks

  2. 2

    Configure fitting parameters

  3. 3

    Click Apply to deform source to match target

Pins

Pin Type Description
Mesh Mesh The mesh that gets bent. Its vertex count and layout survive.
Target Mesh The shape to match. It does not move.
Landmarks Landmarks Optional. Point and curve pairs pinning parts of the source to known places on the target. This is what keeps an eye corner on the eye corner instead of near it.
Protect Weight Map Optional. Paint the parts that should stay free - a mouth bag, an eye socket, anything with no match on the target. Painted areas are not pulled onto the target; they keep their shape and ride along with the surface around them. Unpainted areas fit normally.
Pin Type Description
Mesh Mesh The fitted mesh, same vertex count and layout as it went in.
Landmarks Landmarks The landmarks you wired in, moved onto the fitted mesh.

Settings

Setting Type Description
Stiffness Steps Whole number How many stages the fit works through on its way from stiff to floppy. The mesh is allowed to settle at each one before the next. Too few and it lurches between stages, picking up creases it never irons back out.
Landmark Strength Whole number How hard the landmarks pull compared to the general surface matching. Too low and a landmark drifts off the feature you put it on. Too high and the surface puckers into a dimple around each one.
Decay Landmark Strength True/False Fade the landmark pull out as the fit progresses, so they steer the early rough alignment and then hand over to the surface matching.
Point-to-Plane Weight Number How much a vertex may slide along the target surface instead of being pulled straight at its match. Sliding closes gaps faster across broad flat areas. 0 pulls every vertex straight at the nearest point.
Setting Type Description
Starting Stiffness Number How rigid the mesh is at the start. High values keep it moving as one piece while it finds the target's overall shape.
Ending Stiffness Number How loose the mesh is by the last stage. Lower lets it press into fine detail, and past a point it starts following the target's lumps and noise as well.
Decay Power Number The shape of the curve between the starting and ending stiffness. 1 is a steady run. Higher goes soft early and spends most of the fit loose.
Rotation-Invariant Stiffness True/False Let the mesh rotate freely where it needs to, instead of the stiffness fighting the turn and pinching or flattening the surface. Leave on; turn off only to compare.
Setting Type Description
Max Search Distance Number How far a vertex will look for its match on the target. Too small and whole patches find nothing and sit unmoved. Too large and a vertex grabs across a gap onto the wrong side of a fold, so lips get pulled into teeth.
Use Bi-Directional True/False Check every match from both meshes before trusting it. This is what stops the inside of a mouth latching onto the lips sitting in front of it.
Use Normal Compatibility True/False Only match surfaces that face roughly the same way. Without it the underside of a chin will happily grab the chest below it.
Normal Angle Threshold Number How far apart two surfaces can face and still be matched. Matches fade out as they approach this angle and are dropped past it. 55 is the crease-safe default; raise it only when facing surfaces really should match.
Boundary Aware True/False Trust matches less around open edges, where the surface simply stops and the nearest point on the target usually means nothing.
Boundary Weight Number How much pull the vertices along an open edge keep. 0 leaves the border to follow its neighbours instead of chasing the target, 1 treats it like any other vertex.
Use Spatial Coherence True/False Even out how much each vertex trusts its match by looking at the vertices around it. Stops one vertex being yanked at while the surface next to it stays put, which is where puckers come from.
Coherence Blend Number How much say a vertex's neighbours get in how far it trusts its own match. 0 leaves every vertex to itself. 1 hands the decision entirely to the neighbourhood.
Max Correspondence Pull Number How far a vertex's match may pull it in one solver pass, measured in average rest-edge lengths. 0 leaves the pull unclamped. A crease jump is a short residual the robust kernel trusts; this still caps how far a long wrong pull can move the mesh in one step.
Prevent Self-Intersections True/False Stop the mesh from passing through itself while it fits. Parts that meet slide along each other instead of stopping, so the fit still reaches the target; anything that does cross is pushed back until it just touches. Crossings already present in the source mesh are left as they are.
Self-Intersection Clearance Number Extra gap held between two parts of the mesh when they meet, in average edge lengths. Leave at 0 to only block crossings without adding any gap. Raise it slightly if surfaces that land exactly on each other cause shading artifacts. Capped at 0.2: every guard distance (stand-off, release, band) scales with this, so a large gap inflates thin features to the gap thickness and holds surfaces visibly apart.
Self-Intersection Neighbor Rings Whole number How many rings of connected neighbors around each point are ignored by the self-intersection check. Raise this if a tight crease is wrongly held back; keep it at 1 on thin parts like lips so real contacts are still caught.
Self-Intersection Slide Along Contact True/False Keep a held point moving. When a point is stopped by another part of the mesh, aim its match along that surface instead of straight through it, so the area keeps sliding toward the target instead of freezing where it touched. Turn off to only block crossings.
Self-Intersection Heal Crossings True/False Remember which side of a contact each point belongs on and push a point found on the wrong side back out over the following iterations. Turn off to only stop new crossings and leave anything that already slipped through where it is.
Setting Type Description
Use Geodesic Correspondence True/False Measure distance by walking across the surface rather than straight through the air, so two points that nearly touch across a gap are still understood to be far apart. Earns its keep around ears, nostrils, fingers and folds. Does nothing unless you have landmarks wired in.
Landmark Mismatch Weight Number How hard to cut a match that disagrees with your landmarks. 0 leaves every match as the surface search found it. 1 fully trusts the landmark test, so a nose cannot keep a grip on an ear. Halfway is the usual setting. A match that agrees with the landmarks is never reduced.
Use Signature Filtering True/False Throw out matches where the two points sit differently relative to your landmarks. This is what stops a nose matching an ear, or a left hand matching a right.
Signature Similarity Threshold Number How alike two points have to look before a match survives. Raising it throws out more. Push it too high and it starts discarding perfectly good matches, leaving patches of surface that never move.
Setting Type Description
Smoothing Strength Number How much the mesh is relaxed between solver passes. Enough of it irons out the ripples a hard pull leaves behind. Too much and the fit never gets close enough to pick up the target's detail.
Smoothing Passes Whole number How many relaxing passes to run between solver passes.
Adaptive Smoothing True/False Relax harder on the passes where the mesh travels a long way, and ease off once it has settled down.
Smooth Landmark Vertices True/False Let the relaxing passes touch the vertices your landmarks sit on. Turn it off when landmarks keep getting smoothed away from their marks.
Smooth Boundary Vertices True/False Let the relaxing passes touch open edges. Turn it off to stop a border creeping inwards a little more on every pass.
Setting Type Description
Use Multi-Resolution True/False Fit a coarse copy of the mesh first and work up to the real one. The big travel happens on the cheap copy, so the last pass has only detail left.
Multi-Res Mode Choice How the coarser and finer copies get built.
Multi-Res Levels Whole number How many extra copies to build. More of them survives a bigger difference between the two shapes, and costs you the time.
Simplification Ratio Number How much of the mesh survives at each coarser copy. 0.5 halves it each time.
Subdivision Levels Whole number How many copies denser than your own mesh to build. Only worth it when your mesh is too coarse to reach the detail on the target.
Split Stiffness Per Level True/False Give each copy its own slice of the stiffness range, so the coarse ones stay rigid and only the finest is allowed to go soft.
Setting Type Description
Min Iterations Per Step Whole number How many passes each stiffness stage runs before the fit is even allowed to call it settled.
Convergence Threshold Number How little the mesh has to move, measured against its own size, before a stage counts as settled and the fit moves on. Raise it to cut the fit short.
Stall Patience Whole number How many iterations the solver keeps trying after progress flattens out before it moves on to the next step. Lower ends steps sooner; higher gives a slow fit more room to keep creeping forward.
Stall Threshold (%) Number How much the fit error has to drop over that stretch to count as still making progress, as a percent of the current error. Below this the step is considered finished. 0 only stops once the error truly stops falling.
Max Iterations Per Step Whole number A hard ceiling on passes per stage, so a fit that will never settle still finishes rather than grinding all afternoon.
Setting Type Description
Use GPU Acceleration True/False Work out the matches on the graphics card. Much quicker on dense meshes, and it drops back to the processor on its own when the card cannot help.
Use GPU Iterative Solver True/False Solve the deformation on the graphics card as well, by closing in on the answer rather than computing it outright. Pays off on heavy meshes.
GPU Solver Max Iterations Whole number How many passes that solve gets before it hands back whatever it has reached. Raise it if the fit looks like it stopped short.
GPU Solver Tolerance Number How close that solve has to get before it calls it done. Below about 0.0001 the graphics card's solver cannot get any closer on a stiff mesh, so going lower just spends extra passes for no sharper result. The processor's exact solve ignores this.
Setting Type Description
Visualization Mode Choice What gets painted on the mesh in the diagnostic window that opens beside the app while the fit runs. It is a tuning aid for watching the solver work, not a preview. Disabled opens no window and is the quickest.
Preview Update Interval Whole number How many solver passes go by between redraws of that window. Higher redraws less often and steals less time from the fit.
Max Displacement Scale Number The distance that reads as full colour in that window. 0 picks a scale from the size of the mesh. Affects the colours only, never the fit.

Learn more

3D wrap MetaHuman conform meshesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/how-to-3d-wrap-metahuman-conform-meshes-in-unreal-engine-with-mesh-morpher-graph
Wrapper with MH and DAZ charactersRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/mesh-morpher-wrapper-with-mh-and-daz-characters

Studio and Graph › Wrapper

Texture Flow Landmarks

Matches two meshes by their albedo rather than their shape. Both get rasterised to matching views, dense optical flow finds the pairs, and every confident 2D match is lifted back onto both surfaces.

Texture Flow Landmarks node

The Texture Flow Landmarks node

When to use it

Matches two meshes by their albedo rather than their shape. Both get rasterised to matching views, dense optical flow finds the pairs, and every confident 2D match is lifted back onto both surfaces.

How to use it

  1. 1

    Wire the mesh being wrapped into Mesh and the scan into Target

    Both need albedo - vertex colours or an embedded base-colour texture.

  2. 2

    Pick the view that shows the region you care about, then press Find Texture Correspondences

  3. 3

    Read Pairs Emitted and Albedo Contrast

    Zero pairs on a featureless albedo is the correct answer, not a failure.

  4. 4

    Wire Landmarks into Non-Rigid Fit (or Elastic Conformer)

    Chain a second node through Extra Landmarks for another view.

Pins

Pin Type Description
Mesh Mesh The mesh being wrapped. It supplies the source end of every pair, and it needs colour on it: vertex colours or a base-colour texture. Passes straight through to the Mesh output.
Target Mesh The mesh being wrapped onto. It supplies the target end of every pair, and it needs colour too. Rigid Fit the two first: this can follow a feature that moved a few dozen pixels, not a mesh sitting somewhere else entirely.
ExtraLandmarks Landmarks Optional. Landmarks the detected pairs merge into, so you can stack a second view or keep a hand-placed set. Whatever is already there wins. For several views, Multi View Fusion beats chaining nodes.
MinConfidence Number Overrides the confidence floor. Leave it unwired to use the value in the details panel.
SampleSpacing Whole Number Overrides the sample spacing. Leave it unwired to use the value in the details panel.
Pin Type Description
Mesh Mesh The source mesh, untouched. This node never changes geometry.
Target Mesh The target mesh, untouched.
Landmarks Landmarks The pairs it found, plus anything wired into Extra Landmarks. Each pair is a point on the Mesh surface and the place on the Target surface where that colour turned up. Wire this into Non-Rigid Fit or Elastic Conformer.
PairsEmitted Whole Number How many pairs this node contributed to the Landmarks output after merging with Extra Landmarks. A pair that collides on source position with an inherited one is dropped, so this can read lower than what the matching found. Zero on a mesh with no colour variation is the right answer, not a failure.
MeanConfidence Number Average confidence across the pairs that came out. With Multi View Fusion on, this is already discounted for how squarely each view saw the surface.
LowestConfidence Number The weakest pair that survived. Branch a batch graph on this rather than the average: one wrong pair drags the fit, and a healthy average will not save you from it.

Settings

Setting Type Description
View Preset Choice Which side the two meshes are looked at from. One view only sees the surface facing it, so pick the side the region you care about is on. Chain nodes through Extra Landmarks for more angles, or turn on Multi View Fusion to sweep several in one run. With fusion on, this is the middle of the sweep.
Multi View Fusion True/False Sweep several views around the model instead of using one, then keep only what they agree on. A pair two views found independently beats a single view's more confident guess, and a region where two views disagree is thrown out rather than guessed at. Costs a full pass per view. The sweep goes around the up axis, so it needs a side-on middle view. Pick Top or Bottom and it refuses.
Num Views Whole number How many views on the sweep. 5 across 180 degrees gives you side, three-quarter, front, three-quarter, side, which is the usual wrap camera set. The views sit symmetrically about the middle with one on each end, so an even count skips the middle view itself. Use an odd count when the View Preset direction has to be one of the cameras.
View Arc Degrees Number How wide the sweep is, centred on View Preset. 360 spreads the views evenly all the way round instead.
Min View Facing Number Throw away a pair where the surface is turned away from the camera at either end. 1 means dead-on, 0 means edge-on. Matches found on a steeply angled surface land in the wrong place, and the confidence score will not warn you: squashed texture looks like sharper texture, so those matches score higher, not lower. On a curved test surface the pairs below 0.5 carried about nine times the error of the face-on ones. 0 turns the check off.
Custom View Direction Vector Which way the camera points when View Preset is Custom. This is the direction it looks, not where it sits.
Resolution Whole number How big the internal render is. A match can only be as precise as one pixel is wide on the model, so this is the main quality dial: a 30 cm head at 512 lands within roughly 0.6 mm. Doubling it quadruples the cost.
Cull Backfaces True/False Ignore triangles facing away from the camera. Right for a closed scan, and the reason the inside of a nostril does not draw over the nose. Turn it off for a single-sided patch whose triangles happen to face the wrong way; the giveaway is a run that reports no coverage at all.
Albedo Source Choice Where the colour is read from. The two meshes are handled separately, so a textured scan can be matched against a vertex-coloured template.
UV Layer Whole number Which UV layer the textures are read through. Layer 0 unless the asset was authored with its colour on a second channel.
Sample Spacing Whole number One candidate every this many pixels, taking the best one in each cell. This is how many pairs you get, not how good they are. Asking for more will not improve a single one of them.
Min Confidence Number Matches scoring below this are thrown away. The score asks two things: was there anything here to match, and did the match hold up. A flat cheek scores near zero however tidy the answer looks there, and that is the right answer. The MinConfidence pin overrides this when wired.
Forward Backward Check True/False Match again in the opposite direction and drop anything that does not come back to where it started. This is what catches a match that is confident and wrong: a feature hidden behind something else, or the left eye matched to the right. Costs a second pass. Leave it on.
Max Reprojection Error Number How far, in pixels, the return trip is allowed to miss where it set off from.
Max Pair Distance Fraction Number Drop a pair whose two ends are further apart than this fraction of the two meshes' size. This node exists to remove small sliding errors, so a pair claiming a quarter of a head of movement has matched the wrong feature.
Max Landmarks Whole number Ceiling on how many pairs come out; the most confident survive. Every pair is something the fit then has to obey exactly, so more is not better.
Pyramid Levels Whole number How many progressively coarser passes the matcher makes. This is what lets it follow a feature that moved further than the feature is wide. Set it to 1 and it can only track about a pixel of movement.
Flow Smoothness Number How much the matcher smooths its answer. Higher is tidier but starts inventing movement in areas with no texture; lower is noisier and stays closer to what the colour actually says. Tuned for this app's numbers, so textbook values quoted elsewhere are hundreds of times too big here.
Illumination Robust Matching True/False Strip out local brightness and local contrast before matching, so the two meshes are compared on texture rather than on how light or dark they are. A scan usually has shading baked into its texture and a clean template does not. That is not noise you can average out: no answer satisfies the matcher at all, and it drifts towards whichever nearby patch has the weakest texture. On a head with a directional bake, mean error against a known deformation was 113 pixels with this off and 0.44 pixels with it on. It costs nothing when both albedos already match: on the same head with identical colour on both sides it still improved the result. Leave it on.

Learn more

3D wrap MetaHuman conform meshesRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/how-to-3d-wrap-metahuman-conform-meshes-in-unreal-engine-with-mesh-morpher-graph
Wrapper with MH and DAZ charactersRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/mesh-morpher-wrapper-with-mh-and-daz-characters

Studio and Graph

Stream

  • Mesh Stream: Pushes the mesh out to another application, Blender for instance, and takes back whatever it sends home when you stop the stream.

Studio and Graph › Stream

Mesh Stream

Hands the mesh on the input off to another application over a local connection, Blender being the intended partner, so you can sculpt or model on it there and see the result update live in the prev...

Mesh Stream node

The Mesh Stream node

When to use it

Hands the mesh on the input off to another application over a local connection, Blender being the intended partner, so you can sculpt or model on it there and see the result update live in the preview here as you work. Press Start Stream to send it out; nothing round-trips back to the Mesh output until you press Stop Stream, which is also the point where whatever the other application sent back gets written there.

Good for iteration, not for anything you mean to keep, because a stream has no file behind it. Load File Mesh for that.

Subject Name has to match exactly what the other application connects under. Get it wrong and there is no error and no geometry, just a node that never updates. Check the name, and check the stream was actually started, before you go looking at the graph.

How to use it

  1. 1

    Set Subject Name to match the other application

  2. 2

    Press Start Stream to send the mesh out

  3. 3

    Model there; the preview here follows along live

  4. 4

    Press Stop Stream to write the result to the Mesh output

Pins

Pin Type Description
Mesh Mesh The mesh to send out, under the Subject Name you set below.
Pin Type Description
Mesh Mesh Whatever the other application sent back. It only updates when you stop the stream.

Settings

Setting Type Description
Subject Name Text The name the other application connects to. It has to match on both ends, and changing it mid-stream does nothing until you stop and start again.

Learn more

Mesh syncing with Mesh StreamRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/mesh-syncing-with-mesh-stream

Studio and Graph

Texture

  • Load Texture: Reads an image off disk (PNG, JPG, TGA, BMP, EXR, HDR) and hands it to the graph on the Texture pin.
  • Transfer Texture: Rebuilds a texture that belongs to one mesh so it fits a second mesh's UV layout, with one output per UDIM tile on the target.
  • Bake Maps: Bakes the detail of a dense sculpt into flat maps laid out on a game-res mesh's UVs: normal, ambient occlusion, curvature, height, position and material ID. One UV tile only, so no UDIM.
  • Bake VDM Brush: Bakes a sculpted canvas's displacement into a vector displacement map, in the stamp-space convention the Displace tool's Vector Displacement mode reads.
  • Load Texture from Asset: Pulls a texture asset out of your project and into the graph, and lists it in the tool dropdowns that offer textures. Editor only.
  • Project Texture: Lifts the colour off a scan and lays it into a texture on your retopologised mesh's UVs. The Coverage output shows which parts are real and which were filled in. One UV tile only, so no UDIM.
  • Tension Map Generator: Compares a rest pose against a posed version of the same mesh and paints where the surface is stretching and where it is bunching up into a map you can drive wrinkles with.
  • Load ZBrush Brush: Reads a ZBrush .zbp brush and publishes baked Native VDMs and non-alpha 2D slots (texture, optional icon) into this graph's texture registry so tools like Displace can pick them.

Studio and Graph › Texture

Load Texture

Reads an image off disk (PNG, JPG, TGA, BMP, EXR, HDR) and puts it on the Texture output. This one works in the standalone app, so it is the way in whenever the image is not a project asset. In the...

Load Texture node

The Load Texture node

When to use it

Reads an image off disk (PNG, JPG, TGA, BMP, EXR, HDR) and puts it on the Texture output. This one works in the standalone app, so it is the way in whenever the image is not a project asset. In the editor, Load Texture (Asset) is the better route for one that already is.

How to use it

  1. 1

    Browse to the image file

  2. 2

    Set the compression type and sRGB to match what the image is for

  3. 3

    The Texture output carries the loaded image

Pins

Pin Type Description
Texture Asset The image you loaded.

Settings

Setting Type Description
File File path Image file to read.
Texture Name Suffix Text Tacked onto the end of the name this texture shows up under in tool dropdowns. Handy when you load several maps that share a file name.
Compression Type Choice How the image should be read. Normal Map for normals, HDR for float images, Default for everything else.
SRGB True/False Treat the file as colour rather than data. Turn it off for masks, roughness and anything else that is not meant to be looked at.

Learn more

Texture transfer with Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/texture-transfer-with-mesh-morpher-graph

Studio and Graph › Texture

Transfer Texture

Resamples one mesh's textures into another mesh's UV layout by spatial correspondence, and it is the UDIM-aware one. Multiple source and target tiles work here, which Bake Maps and Project Texture ...

Transfer Texture node

The Transfer Texture node

When to use it

Resamples one mesh's textures into another mesh's UV layout by spatial correspondence, and it is the UDIM-aware one. Multiple source and target tiles work here, which Bake Maps and Project Texture deliberately do not do. The target's tiles each get their own output pin.

How to use it

  1. 1

    Connect the textured source mesh and the target mesh

  2. 2

    Set the resolution and the two UV channels

  3. 3

    Click Apply

Pins

Pin Type Description
Mesh Mesh The mesh the incoming texture belongs to.
Target Mesh The mesh you want the texture rebuilt for. Its UVs decide the output layout.
Texture Asset The source mesh's texture. If the mesh is laid out across several UDIM tiles this covers the lowest one, and a pin appears for each of the others.

Settings

Setting Type Description
Texture Resolution Whole number Size of each output tile, in pixels.
Source UV Channel Whole number Which UV channel on the source mesh the incoming texture is laid out in.
UV Channel Whole number Which UV channel on the target mesh the result is written into.
Max Distance Number How far a point on the target may sit from the source surface and still pick up colour, in world units. Too low and whole regions come out empty. Too high and a texel reaches across a gap and grabs the colour off the wrong side of a fold.
Filter Quality Choice How the source texture is sampled.
Bicubic Sharpness Number Shapes the bicubic filter. Despite the name, low values are the sharp end and can ring along hard edges; high values are the soft end.
Fill Gaps True/False Bleeds colour outward into empty pixels so UV seams do not show a dark edge.
Gap Fill Iterations Whole number How far the bleed reaches, in pixels.

Learn more

Texture transfer with Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/texture-transfer-with-mesh-morpher-graph

Studio and Graph › Texture

Bake Maps

Projects a dense sculpt (High Poly) onto a game-resolution mesh through that mesh's UVs and produces tangent-space normal, ambient occlusion, curvature, height, position and material-ID textures, e...

Bake Maps node

The Bake Maps node

When to use it

Projects a dense sculpt (High Poly) onto a game-resolution mesh through that mesh's UVs and produces tangent-space normal, ambient occlusion, curvature, height, position and material-ID textures, each on its own output.

How to use it

  1. 1

    Connect the low-poly (with UVs) to Mesh and the sculpt to High Poly

  2. 2

    Tick the maps you want, set the resolution and the projection distance

  3. 3

    Press Bake Maps - each map appears on its own texture output pin

Pins

Pin Type Description
Mesh Mesh The game-res mesh the maps are baked into. It needs UVs.
HighPoly Mesh The sculpt or scan carrying the detail. Leave it empty to bake the low-poly against itself.
Pin Type Description
Mesh Mesh The same low-poly, untouched. Baking never changes geometry.
NormalMap Asset The high poly's surface detail as a tangent-space normal map.
AOMap Asset Ambient occlusion, traced against the high poly.
CurvatureMap Asset How sharply the high poly bends. Feed it to a cavity or edge-wear mask.
HeightMap Asset How far the high poly floats above or sinks below the low-poly surface.
PositionMap Asset Where each point sits inside the high poly's bounding box, written as colour.
MaterialIDMap Asset A flat colour for each material ID on the high poly.

Settings

Setting Type Description
Normal (Tangent Space) True/False The normal map. If your low-poly has no tangents, they get worked out from its normals and UVs just for the bake; the mesh itself is left alone. Green reads above mid-grey where the high poly tilts towards increasing V, and red above mid-grey where it tilts towards increasing U. That is the same basis the engine's own bakers use and the same one the MikkTSpace tangents on import produce, so a map baked here shades correctly in the viewport as-is. Anything downstream that expects the opposite green direction needs that channel inverted on the way out.
Ambient Occlusion True/False Ambient occlusion, traced against the high poly. Much the slowest map here: it fires Occlusion Rays rays for every sample in every texel.
Bake Curvature True/False How sharply the high poly bends. This is what you feed a cavity or edge-wear mask.
Height / Displacement True/False How far the high poly floats above or sinks below the low-poly surface, remapped into the Inner and Outer range below. Also called displacement.
Position (Object Space) True/False Where each point sits inside the high poly's bounding box, written out as colour.
Material ID True/False A flat colour per material ID on the high poly. Handy as an ID mask when you assign materials later.
Resolution Choice Size of every map this run produces.
Samples Per Pixel Choice How many samples land inside each texel. More samples means smoother edges and a longer bake.
Filter Choice How the samples inside a texel get blended into the final pixel.
Gutter Size Whole number How many texels of bleed get painted outside each UV island. Set it to 0 and every seam shows a dark hairline as soon as the texture is filtered or mipped.
Target UV Channel Whole number Which UV channel on the low-poly the maps are laid out in.
Projection Distance (Cage Offset) Number How far above the low-poly surface each ray starts, in centimetres. It has to clear the widest gap between the two meshes. Too small and raised detail goes missing. Too large and rays shoot right through the model and pick up whatever is behind it, so the inside of an arm bakes the ribcage. There is no separate cage mesh to edit. Every ray starts this same distance out along the surface normal, so one number covers the whole model: where the gap varies a lot, set it by the widest part and expect skewed detail where the two meshes lean apart the most.
Fall Back To Nearest Point True/False When a ray hits nothing, take the closest point on the high poly instead of leaving the texel blank. On, a texel that missed takes the nearest high-poly point within the projection distance, in whatever direction that happens to be. It closes the small gaps a slightly tight distance leaves behind, and it can also quietly pull colour and detail in from the side. Off, only detail found along the ray counts. Anything the rays did not reach stays at the flat neutral value, so you can see exactly where your projection distance is too tight instead of getting a plausible answer from somewhere else.
Occlusion Rays Whole number Rays fired per sample. Cutting the grain in half costs four times as many rays, so this is where the bake time goes.
Occlusion Max Distance Number Anything further away than this stops casting shadow, in centimetres. 0 means no limit. Set a small value and you get contact shadows in the creases instead of the whole model darkening itself.
Occlusion Spread Angle Number How wide the rays fan out from the surface, in degrees. 180 is the full hemisphere.
Occlusion Bias Angle Number Rays that leave within this angle of the surface get thrown away. Drop it to 0 and a dense sculpt starts shadowing itself, so the map comes back speckled and dirty.
Curvature Type Choice Which measure of bending gets written into the map.
Color Mapping Choice How cavities and raised edges are turned into colours.
Clamping Choice Keep only the raised edges, only the cavities, or both.
Color Range Multiplier Number Scales the contrast range the node works out for itself. Above 1 flattens the map, below 1 pushes it harder.
Min Range Multiplier Number Anything weaker than this fraction of the range is flattened to neutral. Raise it to kill the fine speckle a scan leaves behind.
Height Range Mode Choice Whether the two distances below are read as centimetres or as a fraction of the mesh's size.
Inner Distance Number How far below the low-poly surface counts as black. Keep it negative.
Outer Distance Number How far above the low-poly surface counts as white. Keep it positive.

Learn more

Texture transfer with Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/texture-transfer-with-mesh-morpher-graph

Studio and Graph › Texture

Bake VDM Brush

Turns a sculpt-on-a-plane into a vector displacement map any brush stamp can reuse at any size, on any surface. Overhangs are fine - that is the whole reason to reach for this over a height map.

Bake VDM Brush node

The Bake VDM Brush node

When to use it

Turns a sculpt-on-a-plane into a vector displacement map any brush stamp can reuse at any size, on any surface. Overhangs are fine - that is the whole reason to reach for this over a height map.

There is no separate Rest input: the flat state is read straight off the canvas's own UV layout, fitted back out from the sculpt itself.

How to use it

  1. 1

    Create a flat plane and sculpt a shape on it

    Use Sculpt Mesh. Overhangs and undercuts are fine.

  2. 2

    Wire the sculpted Mesh here and press Bake VDM Brush

  3. 3

    Wire the Texture output into the Displace tool

    Vector Displacement mode.

Pins

Pin Type Description
Mesh Mesh The sculpted canvas. There is no separate Rest input - the flat state is fitted straight out of this mesh's own UV layout.
Weights Weight Map Optional. Bakes only the weighted region, and a feathered selection feathers the stamp. Leave it unwired to bake the whole mesh.
Pin Type Description
Texture Asset The baked vector displacement map. Feed it to the Displace tool's Vector Displacement mode.
Mesh Mesh The mesh that was baked, passed through unchanged.

Settings

Setting Type Description
Resolution Choice Size of the baked map.
UV Channel Whole number Which UV channel on Mesh supplies the texel layout, and in Auto Frame Mode the stamp's U axis.
Gutter Size Whole number Texels of bleed painted outside the UV island, so bilinear sampling at the island edge does not pull in black from outside it.
Border Feather Number Radial falloff to zero at the inscribed circle of the canvas, so a square UV island bakes to a map a circular brush stamp can use without a hard seam at the corners.
Frame Mode Choice How the stamp's tangent frame is derived. Auto is correct for the overwhelming majority of canvases; Explicit exists for a plane whose UV layout does not run where you want the frame to.
Frame U Vector World-space direction that becomes the stamp's U (right) axis.
Frame Normal Vector World-space direction that becomes the stamp's outward normal.
Normalization Mode Choice How a world-space offset is scaled into the file's footprint-diameter units. Auto is correct unless Mesh is not the actual canvas - a tiny reference swatch cut from a larger sheet, for instance.
Footprint Size Number The stamp footprint diameter, in Mesh's own world units.
Save To Library True/False Also write the baked map as an EXR into your brush library, so it shows up in every project's Displace tool, not just this graph.
Library Name Text File name, without extension, that the library copy is written under. Existing files with the same name are overwritten.

Learn more

Texture transfer with Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/texture-transfer-with-mesh-morpher-graph

Studio and Graph › Texture

Load Texture from Asset

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Load Texture from Asset node

The Load Texture from Asset node

When to use it

Exposes a project texture asset to the graph. For an image sitting on disk rather than in the project, Load Texture is the one, and it works in the standalone app too.

The asset is also published into the session's texture list, so tools like Displace offer it in their texture dropdown exactly like a file-loaded texture.

How to use it

  1. 1

    Pick a texture asset in the details panel

  2. 2

    Wire the Texture output into whatever consumes it

Pins

Pin Type Description
Texture Asset The texture you picked. Feeds Transfer Texture, Displace and the material nodes.

Settings

Setting Type Description
Texture Asset Asset The texture you want in the graph.

Learn more

Texture transfer with Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/texture-transfer-with-mesh-morpher-graph

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Texture

Project Texture

Projects a scan's surface colour into a texture laid out on a clean mesh's UVs. This closes the scan loop, when a retopologised or wrapped mesh has good UVs and no albedo.

Project Texture node

The Project Texture node

When to use it

Projects a scan's surface colour into a texture laid out on a clean mesh's UVs. This closes the scan loop, when a retopologised or wrapped mesh has good UVs and no albedo.

Detail from a sculpt is Bake Maps. Texture to texture with UDIM is Transfer Texture.

How it samples sets the quality ceiling. From a source texture or embedded materials it is real texture projection, limited by the source image's own resolution. From vertex colours it is interpolated between scan vertices, so a 500k photogrammetry scan into a 2k map is faithful while a 5k mesh into a 2k map is a smooth blur no matter how large you make the output. Result Summary says which path ran.

Coverage says which texels are real: white where colour was projected, mid-grey where the nearest-valid fill invented it, black where neither happened. Mark Unfilled Texels paints what could not be reached at all. Single UV tile only.

How to use it

  1. 1

    Connect the scan to Mesh (labelled Source) and the retopologised mesh (with UVs) to Target - the house donor/recipient shape every transfer node in the app uses

  2. 2

    Press Project Texture

  3. 3

    Albedo carries the colour; Coverage says which texels are real

Pins

Pin Type Description
Mesh Mesh The scan carrying the colour. It only needs UVs if that colour lives in a texture.
Target Mesh The clean mesh you want textured. It needs UVs.
SourceTexture Asset Optional colour map for the scan. Overrides whatever texture the scan arrived with. Its own sRGB setting is respected on the way in, but its alpha is not carried through to the Albedo.
Pin Type Description
Target Mesh The same mesh, untouched. Projecting never changes geometry.
Albedo Asset The projected colour, laid out in your target's UVs. It comes out as a colour texture (sRGB) and fully opaque - any see-through parts of the source are flattened out.
Coverage Asset Where the colour came from. White is real, taken straight off the scan. Mid-grey was filled in from neighbouring texels. Black got nothing. Use it as a mask when you paint over the invented parts.
NormalMap Asset The scan's fine detail as a normal map, when Also Project Normal Map is on.

Settings

Setting Type Description
Color Source Choice Where the colour is read from. Leave it on Auto unless the scan carries both a texture and vertex colours and you want the other one.
Source UV Channel Whole number Which UV channel the scan's texture is laid out in. Ignored when the colour comes from vertex colours.
Resolution Choice Size of every map this node produces.
Samples Per Pixel Choice How many samples land inside each texel. More samples means smoother edges and a longer run.
Filter Choice How the samples inside a texel get blended into the final pixel.
Target UV Channel Whole number Which UV channel on the target the colour is painted into.
Also Project Normal Map True/False Also produce a normal map of the scan's fine detail. It rides along on the same pass, so it costs far less than a separate Bake Maps run.
Setting Type Description
Projection Distance (Cage Offset) Number How far above the target surface each ray starts, in centimetres. It has to clear the widest gap between your retopo mesh and the scan. Too small and you get holes. Too large and rays pass clean through to the far side of the model and bring back the wrong colour, which is worse than a hole because nothing downstream can tell it is wrong.
Fall Back To Nearest Point True/False When a ray hits nothing, take the closest point on the scan instead, as long as it falls within Max Nearest Point Distance. Leave it on for production. It closes the small gaps a slightly tight projection distance leaves in creases and around the silhouette. Switch it off to see exactly where that distance is too tight, because those texels then show as holes on Coverage instead of being quietly rescued.
Max Nearest Point Distance (cm) Number How far the rescue may reach off the ray before the result stops counting as real data, in centimetres. Without a limit the rescue answers everything: a texel over a part of your mesh the scan never covered just takes the colour of the nearest scan geometry, however far away, and Coverage calls it real. The default of 1 cm is a third of the default projection distance, which is about right for closing the millimetre gaps between a retopo mesh and the scan it came from. Set it to 0 and only an exact ray hit counts.
Setting Type Description
Fill Radius (texels) Whole number How far, in texels, colour is smeared out of the regions that found the scan. Every empty texel takes the colour of the nearest projected one. That is right for the small holes you actually get in practice, UV seams and a few dropped samples, and it is a visible smear across anything large the scan never saw: under the chin, inside the nostrils, behind the ears. It also does the job of a bake gutter, so 0 leaves every UV island edge showing a seam once the texture is filtered.
Mark Unfilled Texels True/False Stamp the marker colour on any texel inside a UV island that got neither a projection nor a fill. Without it those texels come out black, which you cannot tell apart from a genuinely black surface. Turn it off only when something automated downstream is reading Coverage instead.
Unfilled Marker Color Colour Colour stamped on the texels that got nothing. Magenta by default, because the whole point is that it cannot be mistaken for skin.

Learn more

Texture transfer with Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/texture-transfer-with-mesh-morpher-graph

Studio and Graph › Texture

Tension Map Generator

Compares a rest-pose mesh to a deformed one and bakes the per-vertex strain into a texture. Stretch where the surface is pulled apart at an outer elbow, compression where it is squeezed at an inner...

Tension Map Generator node

The Tension Map Generator node

When to use it

Compares a rest-pose mesh to a deformed one and bakes the per-vertex strain into a texture. Stretch where the surface is pulled apart at an outer elbow, compression where it is squeezed at an inner elbow or a furrowed brow, and optionally the principal strain direction for anisotropic effects. Drive a material that wrinkles or flushes with the pose.

Both meshes need the same vertex count and order. Strain is measured per vertex against its rest counterpart.

Generate and Export PNG are two separate actions on purpose. Generate computes the map and publishes it on the TensionMap pin without touching the disk or asking a question. Export PNG writes whatever Generate last produced, all UDIM tiles. Press only Export and you have exported nothing new.

How to use it

  1. 1

    Connect the rest-pose mesh and the deformed-pose mesh

  2. 2

    Configure the output settings

  3. 3

    Click Generate

    The TensionMap pin now carries a live texture.

  4. 4

    Optionally click Export PNG

    Writes the map, all UDIM tiles, to disk.

Pins

Pin Type Description
RestPose Mesh The mesh at rest, before anything pulls on it.
DeformedPose Mesh The same mesh in a pose. Vertex count and order have to match the rest pose.
Pin Type Description
TensionMap Asset The finished tension map. Linear, not sRGB, because it is data rather than colour.
Strain Weight Map The same per-vertex strain as a 0 to 1 weight map instead of a texture: 0.5 is neutral, higher is stretched, lower is compressed. Handy for driving a shader parameter or another node directly off the mesh, no UVs required.

Settings

Setting Type Description
Resolution Whole number Size of the output map, per UDIM tile.
Format Choice Which channels the map uses.
UV Channel Whole number Which UV channel the strain gets painted through.
Enable UDIM True/False Handle UVs that run outside the 0-1 square by making one image per tile.
Max UDIM Tiles Whole number How many tiles across to look at. Anything past this gets folded back into the last tile, so set it high enough to cover your layout.
Texture File Base Name Text File name Export PNG writes under. The UDIM number is added for you.
Overwrite Existing True/False Let Export PNG replace a file that is already there.
Setting Type Description
Computation Method Choice How the stretching gets measured.
Sensitivity Number Multiplies whatever strain was measured. Raise it to make small movement register; push it too far and every pose reads as a full stretch.
Threshold Number Strain weaker than this counts as zero. Nudge it up when the map is speckled in places nothing is actually moving.
Max Stretch Number Stretch this strong reads as fully white. Lower it to make gentle stretching visible; raise it if the map blows out to solid white.
Max Compression Number Compression this strong reads as fully white. Same trade as Max Stretch, for the bunching side.
Setting Type Description
Fill Gaps True/False Bleeds colour into pixels no triangle covered. Without it, dense areas leave pinholes where a triangle was too small to land on a pixel.
Gap Fill Iterations Whole number How far the bleed reaches, in pixels.
Use Gaussian Blur True/False Blur with a Gaussian instead of a box. Softer falloff, no boxy edges.
Blur Passes Whole number How many times the blur runs over the finished map.
Blur Radius Whole number How wide each blur pass reaches, in pixels.
Vertex Smoothing Method Choice How the strain is smoothed across the mesh before anything gets drawn.
Vertex Smoothing Iterations Whole number How many smoothing passes run on the mesh. One or two calms noisy strain. Too many and the sharp crease at an inner elbow spreads into a soft wash.

Learn more

Texture transfer with Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/texture-transfer-with-mesh-morpher-graph

Studio and Graph › Texture

Load ZBrush Brush

Reads a ZBrush .zbp brush and publishes baked Native VDMs and non-alpha 2D slots (texture, optional icon) into this graph's texture registry so tools like Displace can pick them from a dropdown. Br...

Load ZBrush Brush node

The Load ZBrush Brush node

When to use it

Reads a ZBrush .zbp brush and publishes baked Native VDMs and non-alpha 2D slots (texture, optional icon) into this graph's texture registry so tools like Displace can pick them from a dropdown. Brush alpha is the stamp mask for the VDM bake, not a dropdown texture, unless the file has no bakeable canvas. If the alpha is a regular grid of stamps matching the mesh-part count, each tile masks the matching bake. It has no texture pin: nothing is wired, the images show up as named entries the same way a Load Texture From File image does in that dropdown. Dropdown names come from the brush file's named parts (and the .zbp basename).

Settings

Setting Type Description
File File path ZBrush brush file to read.
Texture Name Suffix Text Tacked onto the basename in tool dropdowns when several brushes share a name.
Include Icon True/False Also publish the 96x96 Icon preview. Off by default: it is not a stamp.
Bake Meshes True/False Bake plane-canvas meshes (subdiv planes or parts with quads/UVs) to Native VDMs.
VDM Resolution Choice Output size of each baked VDM.

Learn more

Texture transfer with Mesh Morpher GraphRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/texture-transfer-with-mesh-morpher-graph

Studio and Graph

Materials

  • Set Materials: Swaps the material on each of a mesh's slots and lets you rename them. The names carry through to the sections list, to everything downstream, and to the slot names you get on export.
  • Create Material from Textures: Builds a material out of the textures you plug in, so a map you baked or painted can actually be seen on the mesh.
  • Load Material: Grabs a material from your project so you can drop it on a mesh slot. Editor only.
  • Set Material Blend: Forces a material slot to render solid or see-through when the import guessed wrong, like hair cards that come in opaque or a stylised eye that comes in transparent.

Studio and Graph › Materials

Set Materials

Overrides which material sits in each of a mesh's material slots, and renames the sections.

Set Materials node

The Set Materials node

When to use it

Overrides which material sits in each of a mesh's material slots, and renames the sections.

The renaming is the part worth knowing. Section names flow onward to the sections list, to nodes that address a slot by name such as Replace Geometry, and to Convert To Static Mesh's slot names. Naming a section here is how a part of the mesh becomes addressable later.

Feed the material inputs from Load Material or Create Material from Textures. Both emit the same wire type, so they are interchangeable here.

Setting a slot the mesh does not have does nothing. When an override looks ignored, check the mesh's real section count.

How to use it

  1. 1

    Connect the mesh

  2. 2

    Configure the material slot overrides

  3. 3

    The output mesh carries the updated materials

Pins

Pin Type Description
Mesh Mesh The mesh whose material slots you want to change.
Pin Type Description
Mesh Mesh The same mesh with your material choices applied.

Studio and Graph › Materials

Create Material from Textures

Builds a live material instance from the texture wires you connect - base colour, metallic, normal and roughness - and publishes it for Set Materials to assign.

Create Material from Textures node

The Create Material from Textures node

When to use it

Builds a live material instance from the texture wires you connect - base colour, metallic, normal and roughness - and publishes it for Set Materials to assign.

When the textures were produced inside the graph by Bake Maps, Project Texture or Transfer Texture, there is no project material to point at and this fills the gap. When there already is one, use Load Material.

The parent material has to expose parameters with the expected names. A slot left unconnected keeps the parent's default, and for a normal map that default is flat, which makes surfaces look suspiciously smooth rather than obviously broken.

Nothing is written to disk, so it works in the packaged app as well as the editor. Press Create Material to build or refresh it.

How to use it

  1. 1

    Set the parent material

    It must expose matching texture parameters.

  2. 2

    Connect the texture inputs

    Base colour, metallic, normal, roughness - whichever you have.

  3. 3

    Click Apply to create or refresh the material instance

Pins

Pin Type Description
BaseColor Asset The colour map.
Metallic Asset The metallic mask.
Normal Asset The normal map.
Roughness Asset The roughness map.
Pin Type Description
Material Asset The finished material. Wire it into a Set Materials slot.

Studio and Graph › Materials

Load Material

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Editor-only node. Runs only in Mesh Morpher Graph inside the Unreal Editor, because it reads or writes Unreal Engine assets. Not available in the standalone Mesh Morpher Studio app.

Load Material node

The Load Material node

When to use it

Exposes a project material asset to the graph, on the same wire type Create Material from Textures produces, so Set Materials consumes either one the same way.

It is editor only because picking an asset out of the content browser is an authoring operation. When there is no project material to point at - because the textures were made inside the graph - use Create Material from Textures instead.

How to use it

  1. 1

    Pick a material or material instance asset

  2. 2

    Wire the Material output into a Set Materials slot pin

Pins

Pin Type Description
Material Asset The material you picked. Wire it into a Set Materials slot.

Settings

Setting Type Description
Material Asset The material you want to use.

Available in Mesh Morpher Graph only. Compare the products.

Studio and Graph › Materials

Set Material Blend

Forces a mesh's embedded materials to opaque or translucent per slot, over the top of whatever the importer guessed.

Set Material Blend node

The Set Material Blend node

When to use it

Forces a mesh's embedded materials to opaque or translucent per slot, over the top of whatever the importer guessed.

Hair or eyelashes that came in opaque and look like cardboard, a body slot that came in translucent and shows through itself: that is what this fixes. Transparency only. Swapping the material itself is Set Materials.

Auto is not off. It means keep what the importer decided from the source file and the mostly-opaque heuristic, and the panel shows you what Auto currently resolves to. Leave slots you have no opinion about on Auto rather than pinning them to Opaque.

Pins

Pin Type Description
Mesh Mesh The mesh whose material slots you want to fix.
Pin Type Description
Mesh Mesh The same mesh with your solid / see-through choices applied.

Studio and Graph

Morph Targets

  • Create Morph Target: Records what moved between a base mesh and a sculpted copy of it, and stores that as a named morph target (blendshape / blend shape) riding on the Mesh output.
  • Load Morph Target: Dials one of the mesh's morph targets (blendshapes / blend shapes) in at a weight, and in the editor it finds the ones stored on a Skeletal Mesh asset too.
  • Transfer Morph Targets: Copies morph targets (blendshapes / blend shapes) off one mesh onto another built from completely different geometry.
  • List Morph Targets: Tells you which morph targets a mesh is carrying. A mesh holding fifty of them looks exactly like a mesh holding none, so the names and the count come out as pins and get printed on the node card.
  • Retarget Morph Targets: Moves a whole set of morph targets (blendshapes / blend shapes) off one character's neutral onto another's, bending each shape to follow the new surface so it rotates and scales where the face does.

Studio and Graph › Morph Targets

Create Morph Target

Captures the difference between two meshes as a named morph target that rides along on the mesh wire. No asset anywhere, so it travels through the graph and through saves.

Create Morph Target node

The Create Morph Target node

When to use it

Captures the difference between two meshes as a named morph target that rides along on the mesh wire. No asset anywhere, so it travels through the graph and through saves.

Pins

Pin Type Description
Mesh Mesh The mesh before you sculpted it.
Target Mesh The same mesh after sculpting. Vertex counts have to match, or the node errors and passes the base mesh through.
Pin Type Description
Mesh Mesh Same base mesh, now carrying the new shape. It looks unchanged - Load Morph Target is what makes it visible.

Settings

Setting Type Description
Morph Target Name Text What to call the shape. Leave it blank and nothing is captured; the base mesh still passes through.
Skeletal Mesh Asset The Skeletal Mesh asset the write button targets. Editor only.
LOD Index Whole number Which LOD the shape is written into. Leave it at 0 unless you have a reason not to: the LOD settings below only run for LOD 0, and picking a LOD the asset does not have refuses the write.
Use Dual Quaternion Skinning True/False Un-pose the shape back onto the asset's bind pose with dual quaternion skinning instead of linear blend. Only the asset write uses this.
Apply To LODs True/False Push the shape down onto the lower LODs too, so it does not pop away as the character gets further from camera.
Vertex Threshold Number How far a LOD vertex can sit from the LOD0 surface and still pick the shape up. Too low and parts of the LOD stay flat; too high and the shape jumps a gap onto the wrong side of a fold.
Normal Incompatibility Threshold Number Throws away a match when the two surfaces face too differently. This is what keeps triangles from flipping inside out on the projected LOD.
Smooth Type Choice How the projected LOD shape gets smoothed.
Smooth Strength Number How hard each smoothing pass pulls. Does nothing while Smooth Iterations is 0.
Smooth Iterations Whole number How many smoothing passes to run over the projected LOD shape. 0 leaves it exactly as projected. Raise it when a coarse LOD comes out lumpy.

Learn more

Organize and categorize morph targetsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/organize-and-categorize-morph-targets-with-mesh-morpher-classic
Generate DNA bone expressions from morph targetsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/automatically-generate-mh-dna-bone-driven-expressions-from-morph-targets

Studio and Graph › Morph Targets

Load Morph Target

Applies one of the morph targets the incoming mesh already carries, at whatever Weight you dial in. No asset needed: the dropdown lists what is on the wire, and the deltas are already in that mesh'...

Load Morph Target node

The Load Morph Target node

When to use it

Applies one of the morph targets the incoming mesh already carries, at whatever Weight you dial in. No asset needed: the dropdown lists what is on the wire, and the deltas are already in that mesh's own space.

In the editor, when the mesh came from Load Skeletal Mesh, the asset's own morph targets show up too, posed onto the current skeleton. Names carried on the wire always win, which is what keeps a graph behaving identically in the packaged app.

An empty dropdown means nothing upstream put a morph target on the mesh. Add a Create Morph Target, or import through a path that carries them.

How to use it

  1. 1

    Connect a mesh that carries morph targets

  2. 2

    Pick a morph target name from the dropdown

  3. 3

    The output is the morphed mesh

Pins

Pin Type Description
Mesh Mesh A mesh that already carries morph targets. Wire List Morph Targets in first if you are not sure it does.
Pin Type Description
Mesh Mesh The mesh with the chosen shape dialled in. It still carries the whole set, so you can chain a second one after it.

Settings

Setting Type Description
Morph Target Name Text Which shape to apply. The list is whatever the connected mesh is carrying.
Weight Number How much of the shape to apply. 1 is full, 0 is none. Push past 1 to exaggerate the pose, or go negative to run it backwards.
Use Dual Quaternion Skinning True/False Pose the asset's deltas with dual quaternion skinning instead of linear blend. Only matters for shapes read off a Skeletal Mesh asset; ones carried on the mesh are already in the right space and need no posing.

Learn more

Organize and categorize morph targetsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/organize-and-categorize-morph-targets-with-mesh-morpher-classic
Generate DNA bone expressions from morph targetsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/automatically-generate-mh-dna-bone-driven-expressions-from-morph-targets

Studio and Graph › Morph Targets

Transfer Morph Targets

Moves named morph targets onto a mesh with a different vertex count, by closest point or by UV, with optional subdivision and smoothing. This is the node for a retopologised or re-densified mesh th...

Transfer Morph Targets node

The Transfer Morph Targets node

When to use it

Moves named morph targets onto a mesh with a different vertex count, by closest point or by UV, with optional subdivision and smoothing. This is the node for a retopologised or re-densified mesh that needs its blendshapes back.

Pins

Pin Type Description
Mesh Mesh The mesh you are taking the shapes from.
Target Mesh The mesh receiving the shapes. Its vertex count and layout can be completely different - a retopo, a denser head, another body.
Pin Type Description
Target Mesh Same destination mesh, now carrying the copied shapes. It looks unchanged until Load Morph Target applies one.

Settings

Setting Type Description
Morph Target(s) Text Which shapes to copy, one name per row. Shift + Enter adds a row. Leave it empty and everything the source carries comes across.
Automatically Overwrite True/False Replace a shape the target already has. Turn it off and the existing one is kept, and the node names what it skipped.
Auto Scale True/False Scale the copied movement by the size difference between the two meshes. Turn it on when the target is the same character built at another scale. Leave it off when the two already share units.
Delta Method Choice Whether each target vertex is moved onto the sculpted source surface, or just pushed by the same amount the source moved.
Vertex Threshold Number How far apart two vertices can sit and still count as the same spot. This is the setting that decides quality. Too low and patches of the target never move at all. Too high and a shape jumps a gap onto the wrong side of a fold, so lips pull into teeth and eyelids stick shut.
Normal Incompatibility Threshold Number Throws away a match when the two surfaces face too differently. This is what keeps triangles from flipping inside out during the projection.
Match Material IDs True/False Only let a vertex take its shape from source geometry with the same material. Useful where eyes, teeth and skin nearly touch and keep stealing each other's movement.
Subdivision Whole number Split the source triangles this many times before sampling, so a dense target has more points to land on. Raise it when a fine target picks up a blocky, low-resolution version of the shape. Costs memory and time.
Match By UV True/False Match the two meshes through their UVs instead of by distance, so vertex count and order stop mattering. Far more reliable around lips, eyelids and anywhere two surfaces nearly touch, as long as both share a UV layout. Do not use it on welded meshes - welding wrecks their UVs.
Smooth Type Choice How the copied shape gets smoothed after projection.
Smooth Strength Number How hard each smoothing pass pulls. Does nothing while Smooth Iterations is 0.
Smooth Iterations Whole number How many smoothing passes to run. 0 leaves the shape exactly as projected. Raise it when the result comes out speckled or lumpy.
Apply To LODs True/False Push the shapes down onto the lower LODs too, so they do not pop away as the character gets further from camera.
LOD Vertex Threshold Number Same distance rule as above, but for landing the shape on the lower LODs.
LOD Smooth Type Choice How the shape gets smoothed on the lower LODs.
LOD Smooth Strength Number How hard each LOD smoothing pass pulls. Does nothing while LOD Smooth Iterations is 0.
LOD Smooth Iterations Whole number How many smoothing passes to run on the lower LODs. Coarse LODs usually need a pass or two where LOD0 needs none.

Learn more

Organize and categorize morph targetsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/organize-and-categorize-morph-targets-with-mesh-morpher-classic
Generate DNA bone expressions from morph targetsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/automatically-generate-mh-dna-bone-driven-expressions-from-morph-targets

Studio and Graph › Morph Targets

List Morph Targets

Tells you which morph targets a mesh is carrying, and passes the mesh through untouched.

List Morph Targets node

The List Morph Targets node

When to use it

Tells you which morph targets a mesh is carrying, and passes the mesh through untouched.

This is what you reach for the moment a morph question turns into "did that actually do anything". Morph targets live inside the mesh as vertex deltas, so a mesh carrying fifty of them and a mesh carrying none look identical in the viewport, on the wire and in a thumbnail. The names go on the node card and out on Names, one per line, with Count for the graph to branch on.

It never writes the mesh output, so dropping one into a working chain cannot change what flows down it. To actually see a shape rather than confirm it exists, apply it with Load Morph Target.

How to use it

  1. 1

    Connect any mesh

  2. 2

    Read the names off the card, or wire Names / Count into the graph

Pins

Pin Type Description
Mesh Mesh The mesh you want to look inside.
Pin Type Description
Mesh Mesh The same mesh that came in, untouched. Safe to drop this node into the middle of a chain.
Names Text The names on the mesh, one per line, sorted. Blank when it carries none.
Count Whole Number How many the mesh carries. A zero means none; a blank pin means no mesh reached the node at all.

Learn more

Organize and categorize morph targetsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/organize-and-categorize-morph-targets-with-mesh-morpher-classic
Generate DNA bone expressions from morph targetsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/automatically-generate-mh-dna-bone-driven-expressions-from-morph-targets

Studio and Graph › Morph Targets

Retarget Morph Targets

Moves a whole blendshape set from one character's neutral onto another's. Mesh (labelled Source) carries the donor neutral and its shapes, Target carries the recipient neutral, and the Target outpu...

Retarget Morph Targets node

The Retarget Morph Targets node

When to use it

Moves a whole blendshape set from one character's neutral onto another's. Mesh (labelled Source) carries the donor neutral and its shapes, Target carries the recipient neutral, and the Target output is that neutral now carrying the retargeted set. Same pin shape as Transfer Morph Targets, so the two swap in and out of a chain.

How to use it

  1. 1

    Connect the source character (carrying the morph targets) to Mesh ("Source")

  2. 2

    Connect the recipient neutral to Target

  3. 3

    Leave Morph Targets empty to move the whole set, or name a subset one per line

  4. 4

    The Target output carries them; it recomputes whenever an input changes

Pins

Pin Type Description
Mesh Mesh The character you are taking the shapes from, in its neutral pose, with the set riding on it.
Target Mesh The character receiving the shapes, in its neutral pose. Same vertex count and triangles as the source; its own positions are never moved.
Pin Type Description
Target Mesh The recipient neutral, now carrying the retargeted set. It looks identical in the viewport - wire List Morph Targets in to see what actually arrived.

Settings

Setting Type Description
Morph Target(s) Text Which shapes to move, one name per line. Leave it empty to move the whole set, which is what you usually want and the reason this node exists rather than running Transfer Morph Targets two hundred times.
Method Choice How each shape is bent onto the new character. Auto picks Delta Copy when the two neutrals turn out to be the same shape and Local Frame when they do not, which is the right call almost always.
Overwrite Existing True/False Replace a shape the recipient already has. Turn it off and the existing one is kept, and the node names what it skipped.

Learn more

Organize and categorize morph targetsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/organize-and-categorize-morph-targets-with-mesh-morpher-classic
Generate DNA bone expressions from morph targetsRead the walkthrough on meshmorpher.comhttps://meshmorpher.com/blog/automatically-generate-mh-dna-bone-driven-expressions-from-morph-targets

Studio and Graph

Voxel

The voxel branch turns meshes into signed-distance fields you can combine, carve, warp and re-mesh, then convert back to geometry. Nodes here build fields (shapes, noise, patterns), combine them (C...

The voxel branch turns meshes into signed-distance fields you can combine, carve, warp and re-mesh, then convert back to geometry. Nodes here build fields (shapes, noise, patterns), combine them (CSG), modify them (domain warps, sculpting) and read them back out.

Every voxel node is available in both Mesh Morpher Graph and Mesh Morpher Studio.

See also Mesh Morpher Graph 2.0 on the Mesh Morpher blog.

Studio and Graph › Voxel

Input

Sources that feed a voxel graph: coordinates, constants, meshes brought into the field, and the values other voxel nodes read from.

Studio and Graph › Voxel › Input

Cellular Distance

Emits a cellular distance metric for Cellular Noise: Euclidean, Manhattan or Chebyshev.

Cellular Distance node

The Cellular Distance node

When to use it

Emits a cellular distance metric for Cellular Noise: Euclidean, Manhattan or Chebyshev.

The metric changes the shape of the cells, not just the numbers in them. Manhattan gives you diamonds and Chebyshev gives you squares, which is how a Voronoi pattern is made to look man-made instead of organic.

Pins

Pin Type Description
DistanceFunction Choice The way of measuring you picked. Wire it into a Cellular node.

Settings

Setting Type Description
Value Choice Which way of measuring this node asks for.

Studio and Graph › Voxel › Input

Cellular Return

Emits a cellular return type. This is the setting that decides what Cellular Noise's output actually means, so it deserves more attention than most dropdowns.

Cellular Return node

The Cellular Return node

When to use it

Emits a cellular return type. This is the setting that decides what Cellular Noise's output actually means, so it deserves more attention than most dropdowns.

Pins

Pin Type Description
ReturnType Choice Which of the two answers you picked. Wire it into a Cellular node.

Settings

Setting Type Description
Value Choice Which of the two answers this node asks for.

Studio and Graph › Voxel › Input

Chunk Coord X

The X index of the chunk being generated. Constant for every sample inside that chunk.

Chunk Coord X node

The Chunk Coord X node

When to use it

The X index of the chunk being generated. Constant for every sample inside that chunk.

That constancy is what makes it useful: a per-chunk seed, a per-chunk pattern choice.

It is also what makes it dangerous. A value that jumps at chunk boundaries puts a visible seam exactly there, running the full height of the volume, and nothing downstream will hide it.

Pins

Pin Type Description
X Number Which chunk you are in, counting along X.

Studio and Graph › Voxel › Input

Chunk Coord Y

The Y index of the chunk being generated.

Chunk Coord Y node

The Chunk Coord Y node

When to use it

The Y index of the chunk being generated.

Same use and same warning as Chunk Coord X. Fine for seeding per-chunk variation. Seam-producing the moment it reaches the density.

Pins

Pin Type Description
Y Number Which chunk you are in, counting along Y.

Studio and Graph › Voxel › Input

Chunk Coord Z

The Z index of the chunk being generated, which is an altitude band rather than an altitude.

Chunk Coord Z node

The Chunk Coord Z node

When to use it

The Z index of the chunk being generated, which is an altitude band rather than an altitude.

Useful for varying behaviour by band. For anything continuous, use Position Z, which does not step at chunk boundaries.

Pins

Pin Type Description
Z Number Which chunk you are in, counting upwards.

Studio and Graph › Voxel › Input

Compare Op

Emits a comparison operator for the Comparison pin on Compare and Branch.

Compare Op node

The Compare Op node

When to use it

Emits a comparison operator for the Comparison pin on Compare and Branch.

Placing one instead of an integer literal makes the graph say which test is being made. Greater and GreaterOrEqual look identical as numbers and behave differently right at the boundary.

Pins

Pin Type Description
Comparison Choice The test you picked. Wire it into a Compare or Branch node.

Settings

Setting Type Description
Value Choice Which test this node asks for.

Studio and Graph › Voxel › Input

Float Input

A fixed float fed into other nodes. Radii, thresholds, strengths.

Float Input node

The Float Input node

When to use it

A fixed float fed into other nodes. Radii, thresholds, strengths.

Worth placing instead of typing the same number into three pins. One editable field then drives them all, and the shared value sits on the canvas rather than hidden in three places.

Pins

Pin Type Description
Value Number The number you typed in the panel.

Settings

Setting Type Description
Value Number The number this node hands out. It shows on the card, so you can read it without opening the panel.

Studio and Graph › Voxel › Input

Fractal Type

Emits a fractal shape for the generic Fractal Noise nodes: FBM, Ridged, Billow or Turbulence.

Fractal Type node

The Fractal Type node

When to use it

Emits a fractal shape for the generic Fractal Noise nodes: FBM, Ridged, Billow or Turbulence.

There is a None at the top of the list too. It drops you back to a single octave with no layering at all, and it is where an integer 0 lands, so a hand-typed number is an easy way to lose all your detail without touching the octave count. Pick the shape here instead.

Pins

Pin Type Description
FractalType Choice The stacking style you picked. Wire it into a by-type fractal node.

Settings

Setting Type Description
Value Choice Which stacking style this node asks for.

Studio and Graph › Voxel › Input

Hash

A cheap deterministic random built from the sample position and a seed. Same position and seed, same value, every run and every machine.

Hash node

The Hash node

When to use it

A cheap deterministic random built from the sample position and a seed. Same position and seed, same value, every run and every machine.

Neighbouring voxels are completely uncorrelated, which is why this is no substitute for noise. There is no smoothness in it, so it can never make a surface.

Quantise the position first and it becomes per-cell variation. Feed it raw positions and every voxel inside a cell gets its own answer. The Random Float (Stable) family is the same idea with a named range.

Pins

Pin Type Description
Seed Whole Number Changes the pattern. The same seed at the same spot always gives the same answer.
Pin Type Description
Result Number A number between -1 and 1. It never changes for a given spot and seed.

Studio and Graph › Voxel › Input

Hash Random Float01

A deterministic random float between 0 and 1, hashed from the sample position and a seed. Same position and seed, same value, every run and every machine.

Hash Random Float01 node

The Hash Random Float01 node

When to use it

A deterministic random float between 0 and 1, hashed from the sample position and a seed. Same position and seed, same value, every run and every machine.

This is the randomness that is safe to drive density, colour or anything else the mesher sees. The non-stable Random Float exists only for one-shot uses.

Change the seed to get a different pattern. Changing the position changes what you are asking about, not how random the answer is.

Pins

Pin Type Description
Seed Whole Number Changes the pattern. The same seed at the same spot always gives the same answer.
Pin Type Description
Result Number A number between 0 and 1 that never changes for a given spot and seed.

Studio and Graph › Voxel › Input

Hash Random Int

A deterministic random integer up to 16777215, hashed from position and seed.

Hash Random Int node

The Hash Random Int node

When to use it

A deterministic random integer up to 16777215, hashed from position and seed.

Good for picking per-cell variants. Quantise the position first, or every voxel inside a cell gets a different answer and the variation turns into static.

Hashed values have no correlation between neighbours, so this is not a smooth signal and never will be.

Pins

Pin Type Description
Seed Whole Number Changes the pattern. The same seed at the same spot always gives the same answer.
Pin Type Description
Result Whole Number A whole number up to about 16.7 million that never changes for a given spot and seed.

Studio and Graph › Voxel › Input

Hash Random Int In Range

A deterministic random integer between Min and Max, both inclusive, hashed from position and seed. The stable way to choose one of several variants per cell.

Hash Random Int In Range node

The Hash Random Int In Range node

When to use it

A deterministic random integer between Min and Max, both inclusive, hashed from position and seed. The stable way to choose one of several variants per cell.

Quantise the position before hashing. Feed it raw and the choice changes within a single cell, which is not a choice at all.

Pins

Pin Type Description
Seed Whole Number Changes the pattern. The same seed at the same spot always gives the same answer.
Min Whole Number The smallest number you might get.
Max Whole Number The largest number you might get.
Pin Type Description
Result Whole Number A whole number between Min and Max that never changes for a given spot and seed.

Studio and Graph › Voxel › Input

Int Input

A fixed integer. Seeds, octave counts, any whole-number parameter you want driven from one place.

Int Input node

The Int Input node

When to use it

A fixed integer. Seeds, octave counts, any whole-number parameter you want driven from one place.

When the value is conceptually an integer, this beats a float plus a Float to Int, because nothing then depends on which way the conversion rounds.

Pins

Pin Type Description
Value Whole Number The whole number you typed in the panel.

Settings

Setting Type Description
Value Whole number The whole number this node hands out.

Studio and Graph › Voxel › Input

Latitude

Latitude relative to the world XY plane, in radians. 0 at the equator, plus or minus pi/2 at the poles. North-south biome shifts on a spherical world.

Latitude node

The Latitude node

When to use it

Latitude relative to the world XY plane, in radians. 0 at the equator, plus or minus pi/2 at the poles. North-south biome shifts on a spherical world.

Latitude alone says nothing about whether you are inside the planet or out in space above it. Pair it with Radius From Origin, which is the part that decides solid from empty.

Pins

Pin Type Description
Result Number How far north or south you are, in radians. 0 at the equator, plus or minus pi/2 at the poles.

Studio and Graph › Voxel › Input

Longitude

The angle around the world Z axis at the sample point, in radians. East-west variation for planet-scale generation.

Longitude node

The Longitude node

When to use it

The angle around the world Z axis at the sample point, in radians. East-west variation for planet-scale generation.

It wraps, so a pattern built straight on it has a seam along one meridian. Fold it through a cosine to close the loop.

Pins

Pin Type Description
Result Number How far round the vertical axis you are, in radians, between -pi and pi.

Studio and Graph › Voxel › Input

Noise Type

Emits a noise basis for the Noise Type pin on the generic noise nodes. Three choices: Perlin, Simplex, Value.

Noise Type node

The Noise Type node

When to use it

Emits a noise basis for the Noise Type pin on the generic noise nodes. Three choices: Perlin, Simplex, Value.

White and Cellular are not on the list. Those two have their own nodes and cannot be reached through this pin at all.

The numbering behind it is internal and not a promise, so drive that pin from here rather than typing a number into an Int Input. A readable dropdown also tells the next person which basis they are looking at.

Pins

Pin Type Description
NoiseType Choice The noise you picked. Wire it into a by-type noise or fractal node.

Settings

Setting Type Description
Value Choice Which noise this node asks for.

Studio and Graph › Voxel › Input

Position X

World-space X of the point being evaluated. Every position-dependent pattern starts here or at one of its siblings.

Position X node

The Position X node

When to use it

World-space X of the point being evaluated. Every position-dependent pattern starts here or at one of its siblings.

To move a whole subgraph, Domain Translate, Rotate and Scale keep the transform in one readable place. Doing the arithmetic on these coordinates by hand works, and then six nodes later nobody can find where the offset came from.

Pins

Pin Type Description
X Number Where along X the voxel being sampled sits.

Studio and Graph › Voxel › Input

Position Y

World-space Y of the point being evaluated.

Position Y node

The Position Y node

When to use it

World-space Y of the point being evaluated.

Paired with Position X it drives every planar pattern. Paired with Atan2 it gives you a bearing, which is where polar work starts.

Pins

Pin Type Description
Y Number Where along Y the voxel being sampled sits.

Studio and Graph › Voxel › Input

Position Z

World-space Z, the height, of the point being evaluated. The most used input in terrain work, because heightmap minus Z is what turns a 2D noise into a 3D field.

Position Z node

The Position Z node

When to use it

World-space Z, the height, of the point being evaluated. The most used input in terrain work, because heightmap minus Z is what turns a 2D noise into a 3D field.

It is also the natural control for Select and for a Height Gradient when you are layering biomes by altitude.

On a spherical world it stops being up. Radius From Origin takes over there.

Pins

Pin Type Description
Z Number How high up the voxel being sampled sits.

Studio and Graph › Voxel › Input

Radius From Origin

Distance from the world origin to the sample point. The basis of a spherical planet, where solid-below-radius-R replaces the usual height test.

Radius From Origin node

The Radius From Origin node

When to use it

Distance from the world origin to the sample point. The basis of a spherical planet, where solid-below-radius-R replaces the usual height test.

Combine it with Latitude and Longitude for banded biomes.

On a planet, Position Z is no longer up. Reaching for it out of habit gives you a field that is correct at the north pole and wrong everywhere else.

Pins

Pin Type Description
Result Number How far the voxel being sampled is from the world origin.

Studio and Graph › Voxel › Input

Random Float01

A fresh random float between 0 and 1 on every single evaluation. Non-deterministic by design.

Random Float01 node

The Random Float01 node

When to use it

A fresh random float between 0 and 1 on every single evaluation. Non-deterministic by design.

Keep it out of density. The same point evaluates differently every time it is sampled, so there is no stable surface: the mesh flickers, re-chunks, and never settles.

Random Float (Stable) is the one to reach for whenever the value has to come back the same, which for anything shaping geometry is always.

Pins

Pin Type Description
Result Number A number between 0 and 1, different every pass. Wire it into density and the surface will crawl.

Studio and Graph › Voxel › Input

Random Int

A fresh random integer up to 16777215 on every evaluation. Non-deterministic.

Random Int node

The Random Int node

When to use it

A fresh random integer up to 16777215 on every evaluation. Non-deterministic.

Same warning as the float version. Never into density.

Random Integer (Stable) for anything the mesher will see.

Pins

Pin Type Description
Result Whole Number A whole number up to about 16.7 million, different every pass. Wire it into density and the surface will crawl.

Studio and Graph › Voxel › Input

Random Int In Range

A fresh random integer between Min and Max, both inclusive, on every evaluation. Non-deterministic.

Random Int In Range node

The Random Int In Range node

When to use it

A fresh random integer between Min and Max, both inclusive, on every evaluation. Non-deterministic.

The range is all this adds over Random Integer. The stability problem is unchanged, so the Stable variant is the default choice unless the value really is one-shot.

Pins

Pin Type Description
Min Whole Number The smallest number you might get.
Max Whole Number The largest number you might get.
Pin Type Description
Result Whole Number A whole number between Min and Max, different every pass. Wire it into density and the surface will crawl.

Studio and Graph › Voxel › Input

Surface Attributes

These outputs read zero. All six of them, everywhere in the app.

Surface Attributes node

The Surface Attributes node

When to use it

These outputs read zero. All six of them, everywhere in the app.

The node was built for a mesh spawner that could ask "does this surface face up" before scattering grass. That spawner was removed, and nothing fills in surface normals or painted colour any more. Drop one into a density graph and the compiler posts a warning saying exactly that.

If you came here to vary something by height, Position Z into a Select does the job, and Height Gradient does it for colour.

Pins

Pin Type Description
NormalX Number How far the surface leans along X.
NormalY Number How far the surface leans along Y.
NormalZ Number How much the surface faces up. Near 1 is flat ground, near 0 is a cliff face. This is the one you want for slope tests.
ColorR Number Red in the paint at this spot, 0 to 1.
ColorG Number Green in the paint at this spot, 0 to 1.
ColorB Number Blue in the paint at this spot, 0 to 1.

Studio and Graph › Voxel › Input

Vector3 Input

A fixed 3D vector broken out into separate X, Y and Z output pins. Offsets, centres, axis directions.

Vector3 Input node

The Vector3 Input node

When to use it

A fixed 3D vector broken out into separate X, Y and Z output pins. Offsets, centres, axis directions.

The three pins are the point. Take just the component you need without another node in between.

Pins

Pin Type Description
X Number The X you typed in the panel.
Y Number The Y you typed in the panel.
Z Number The Z you typed in the panel.

Settings

Setting Type Description
Value Vector The position or direction. It comes out on three pins, one per axis.

Studio and Graph › Voxel › Input

World Up

The world-up direction (0, 0, 1) broken out into components. Saves hard-coding a vector for slope masks and alignment maths.

World Up node

The World Up node

When to use it

The world-up direction (0, 0, 1) broken out into components. Saves hard-coding a vector for slope masks and alignment maths.

Dot a normalised direction against it and you get the slope term every grass-on-the-flat, rock-on-the-cliffs rule is built from. Skip the normalise and you get a height instead.

Pins

Pin Type Description
X Number Always 0.
Y Number Always 0.
Z Number Always 1. Up is up.

Studio and Graph › Voxel

Output

Where a voxel graph ends: the field is evaluated and handed back as geometry.

Studio and Graph › Voxel › Output

Output

Left over from an older voxel pipeline. Nothing in the app compiles from it any more, so wiring a density into it has no effect on anything you generate.

Output node

The Output node

When to use it

Left over from an older voxel pipeline. Nothing in the app compiles from it any more, so wiring a density into it has no effect on anything you generate.

Density to Mesh is the endpoint now. It walks back through its own Density pin and compiles whatever it finds. Voxel Sculpt and Voxel Paint do the same for the live preview. When a branch of your graph seems to do nothing, check that it reaches one of those three rather than this node.

Pins

Pin Type Description
Density Number The finished shape. Negative means inside the solid, positive means empty air, and zero is exactly where the surface lands.

Studio and Graph › Voxel

Variables

Named values you set once and reuse across the voxel graph.

Studio and Graph › Voxel › Variables

Declare Value

Saves an intermediate value under a name so you can read it back elsewhere without dragging a wire across the graph.

Declare Value node

The Declare Value node

When to use it

Saves an intermediate value under a name so you can read it back elsewhere without dragging a wire across the graph.

Wire it in line the way you normally would; the input passes straight through. Then read it anywhere with a Use Value node carrying the same name.

Worth it for a value that genuinely feeds several branches. For anything local, a wire is easier to follow. Leave the Name empty and it warns you, because nothing can read it.

Pins

Pin Type Description
Value Number The value to put the name on.
Pin Type Description
Value Number The same value, untouched. Keep wiring from here as normal.

Settings

Setting Type Description
Name Text What to call it. A Use Value node with the same name reads it back. Leave it blank and nothing can find it.

Studio and Graph › Voxel › Variables

Get Variable (disabled)

This node cannot work. Graph variables have no authoring surface yet, so there is no value anywhere for it to read, and placing one fails the compile with a message saying so.

Get Variable (disabled) node

The Get Variable (disabled) node

When to use it

This node cannot work. Graph variables have no authoring surface yet, so there is no value anywhere for it to read, and placing one fails the compile with a message saying so.

The hard failure is deliberate. Quietly returning 0 would leave you a graph that looks fine and generates the wrong shape.

Declare Value paired with Use Value covers what this node was meant for: name an intermediate value, read it back somewhere else.

Pins

Pin Type Description
Value Number Nothing comes out of here. There is still no way to create a graph variable, so use Declare Value and Use Value instead.

Settings

Setting Type Description
Variable Name Text Which variable to read. It does nothing while there is still no way to create one.

Studio and Graph › Voxel › Variables

Use Value

Reads a value that a Declare Value node saved earlier.

Use Value node

The Use Value node

When to use it

Reads a value that a Declare Value node saved earlier.

The catch is reachability. The Declare node has to be part of the graph that actually gets compiled, which means it sits somewhere on the path back from Density to Mesh. Declare it on a branch that goes nowhere and the name is never defined, so this node falls back to 0 and posts a warning.

When a Use Value reads zero and you cannot see why, that is the first thing to check.

Pins

Pin Type Description
Value Number Whatever the matching Declare Value node was holding.

Settings

Setting Type Description
Name Text Which name to read. It has to match a Declare Value node upstream, spelling and all.

Studio and Graph › Voxel › Variables

Visualize (compile to sample)

A probe. Drop it in line on any wire and it reads the value passing through at one world position, then prints the number in the node title and the details panel.

Visualize (compile to sample) node

The Visualize (compile to sample) node

When to use it

A probe. Drop it in line on any wire and it reads the value passing through at one world position, then prints the number in the node title and the details panel.

Pins

Pin Type Description
Value Number The wire you want to read.
Pin Type Description
Value Number The same value, untouched.

Settings

Setting Type Description
Sample Point Vector Which spot in the world to read the value at. Starts at the origin.

Studio and Graph › Voxel

Math

Arithmetic, trigonometry, vector operations and comparisons evaluated per sample across the field.

Studio and Graph › Voxel › Math

Abs

Strips the sign, and it does two quite different jobs depending on what you feed it.

Abs node

The Abs node

When to use it

Strips the sign, and it does two quite different jobs depending on what you feed it.

On a coordinate you get free mirror symmetry. Abs of X makes everything symmetric about the YZ plane.

On a distance field you get a shell. The surface now sits wherever the field was plus or minus zero, so a solid ball turns into a hollow skin. Neither of those is obvious from the name.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Add

On a density field, adding a constant moves the whole surface in or out. That is how a noise field becomes solid ground: add enough and the surface swallows everything below it.

Add node

The Add node

When to use it

A plus B.

On a density field, adding a constant moves the whole surface in or out. That is how a noise field becomes solid ground: add enough and the surface swallows everything below it.

It is not a way to combine two shapes. Add two fields together and the result is neither of them. Union, Intersection and Subtraction are the nodes for that.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Atan2

The angle of a 2D vector in radians, over the whole circle rather than half of it.

Atan2 node

The Atan2 node

When to use it

The angle of a 2D vector in radians, over the whole circle rather than half of it.

Pins

Pin Type Description
A Number The Y part of the direction.
B Number The X part of the direction.
Pin Type Description
Result Number The angle in radians, somewhere between -pi and pi.

Studio and Graph › Voxel › Math

Branch

Compares A and B with the operator you pick and forwards True or False accordingly. The comparison and the choice in one node.

Branch node

The Branch node

When to use it

Compares A and B with the operator you pick and forwards True or False accordingly. The comparison and the choice in one node.

Equal and NotEqual read the Tolerance pin, which defaults to 0.00001. That default is doing real work. Two values that came out of any arithmetic almost never land on the same float, so an Equal branch with Tolerance set to 0 takes the false arm over and over and reads as a broken wire.

When the result is a weight rather than a choice, Compare plus a multiply is cleaner. When the boundary should be soft, Select.

Pins

Pin Type Description
A Number The left side of the comparison.
B Number The right side of the comparison.
True Number Passed through when the comparison holds.
False Number Passed through when the comparison does not hold.
Tolerance Number Only matters for Equal and Not Equal. Two values closer together than this count as the same.
Comparison Choice Which test to run. Wire a Compare Op node in here to switch it from the graph.
Pin Type Description
Result Number Whichever of True and False the comparison picked.

Studio and Graph › Voxel › Math

Ceil

Rounds up to the nearest whole number. Floor's counterpart.

Ceil node

The Ceil node

When to use it

Rounds up to the nearest whole number. Floor's counterpart.

The pair gives you the two ends of the cell a value falls in, which is the basis of hand-built interpolation and most cell-index tricks.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Compare

Compares A against B and hands back 1 or 0. A mask you multiply with, not a branch.

Compare node

The Compare node

When to use it

Compares A against B and hands back 1 or 0. A mask you multiply with, not a branch.

When the answer is going to be multiplied anyway, this beats Branch and If. The graph stays flat and you avoid the hard edge a branch puts into the field.

The 0/1 edge is still an edge. Anywhere the transition will be visible as geometry, SmoothStep or a Select with a falloff looks better.

Pins

Pin Type Description
A Number The left side of the comparison.
B Number The right side of the comparison.
Tolerance Number Only matters for Equal and Not Equal. Two values closer together than this count as the same.
Comparison Choice Which test to run. Wire a Compare Op node in here to switch it from the graph.
Pin Type Description
Mask Number 1 when the comparison holds, 0 when it does not.

Studio and Graph › Voxel › Math

Cos

Cosine of the input, in radians.

Cos node

The Cos node

When to use it

Cosine of the input, in radians.

Pair it with Sin on the same angle for circles and spirals. On its own it is Sin shifted a quarter cycle, so picking the one whose value at zero you want, 1 for cos and 0 for sin, saves you an offset node.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Curve

Looks the input up on a Curve asset. The escape hatch for a response that would take five maths nodes to approximate and still not look right.

Curve node

The Curve node

When to use it

Looks the input up on a Curve asset. The escape hatch for a response that would take five maths nodes to approximate and still not look right.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Settings

Setting Type Description
Curve Asset Asset The curve to read. The incoming value picks the spot along the bottom of the curve; what comes out is the height there.

Studio and Graph › Voxel › Math

Distance To Line

Perpendicular distance to an infinite line.

Distance To Line node

The Distance To Line node

When to use it

Perpendicular distance to an infinite line.

Subtract a radius and you have an infinite cylinder along any axis, which is the cheapest way to get a tilted cylinder without rotating the domain.

Infinite is the catch. To cap it, intersect with two Planes, or use the Cylinder and Capsule primitives, which are finite to begin with.

Pins

Pin Type Description
LinePointX Number X of a point the line passes through.
LinePointY Number Y of a point the line passes through.
LinePointZ Number Z of a point the line passes through.
LineDirX Number X of the direction the line runs. All three together must come to length 1.
LineDirY Number Y of the direction the line runs.
LineDirZ Number Z of the direction the line runs.
Pin Type Description
Distance Number How far the voxel being sampled sits from the line, measured square to it. Never negative.

Studio and Graph › Voxel › Math

Distance To Plane

Signed distance to an infinite plane. Positive on the side the normal points, negative on the other.

Distance To Plane node

The Distance To Plane node

When to use it

Signed distance to an infinite plane. Positive on the side the normal points, negative on the other.

The sign is the whole point. It makes an above-or-below test and a half-space cutter the same node.

The Plane primitive is this packaged as a solid. This one hands you the number.

Pins

Pin Type Description
NormalX Number X of the direction the plane faces. Keep all three together at length 1.
NormalY Number Y of the direction the plane faces.
NormalZ Number Z of the direction the plane faces. Straight up by default.
Distance Number How far the plane sits along its own normal.
Pin Type Description
Result Number How far the voxel being sampled is from the plane. Positive on the side the normal points to, negative behind it.

Studio and Graph › Voxel › Math

Distance To Point

Straight-line distance from the sample point to a target point.

Distance To Point node

The Distance To Point node

When to use it

Straight-line distance from the sample point to a target point.

Subtract a radius and you have a sphere. Leave it raw and you have a radial falloff to drive something with.

When you want the shape, the Sphere primitive is fewer nodes. This is for when you want the number.

Pins

Pin Type Description
TargetX Number X of the point you are measuring to.
TargetY Number Y of the point you are measuring to.
TargetZ Number Z of the point you are measuring to.
Pin Type Description
Distance Number How far the voxel being sampled is from Target.

Studio and Graph › Voxel › Math

Divide

A over B. Dividing by zero, or near enough to zero, gives you 0 rather than an infinity, because an infinity reaching the mesher takes the whole chunk with it.

Divide node

The Divide node

When to use it

A over B. Dividing by zero, or near enough to zero, gives you 0 rather than an infinity, because an infinity reaching the mesher takes the whole chunk with it.

That guard has a side effect worth knowing. A suspiciously flat patch of zero in your result might be a division that tripped the guard rather than a shape. Drop a Visualize node on the wire and read the number.

When the divisor never changes, multiplying by the reciprocal is cheaper and reads better.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Exp

e raised to the input, with the exponent clamped to plus or minus 80 so it cannot run away to infinity.

Exp node

The Exp node

When to use it

e raised to the input, with the exponent clamped to plus or minus 80 so it cannot run away to infinity.

It still grows absurdly fast. exp(20) is half a billion. This is a falloff tool, not a scaling tool: exp of a negative squared distance is the Gaussian bump you usually wanted.

A field that has gone flat and enormous is nearly always an exp with a positive argument nobody meant to feed it.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Float To Int

Converts a float to an integer by flooring it, which means it truncates toward negative infinity rather than toward zero. 1.7 becomes 1. -0.3 becomes -1, not 0.

Float To Int node

The Float To Int node

When to use it

Converts a float to an integer by flooring it, which means it truncates toward negative infinity rather than toward zero. 1.7 becomes 1. -0.3 becomes -1, not 0.

That asymmetry only bites when the value can go negative, and then it bites hard: everything below zero shifts a whole step. Add 0.5 first if you wanted nearest.

The usual reason to place one is feeding float maths into an int-typed pin such as a Seed.

Pins

Pin Type Description
Value Number The number to round down.
Pin Type Description
Result Whole Number The whole number below it.

Studio and Graph › Voxel › Math

Floor

Rounds down to the nearest whole number.

Floor node

The Floor node

When to use it

Rounds down to the nearest whole number.

Combined with a multiply and a divide it quantises a smooth value into steps, but Terrace already does that with the step size as one readable number. Come here when you actually want the integer: a cell index, a band number, the input to a hash.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Frac

The fractional part, meaning the input minus its floor. Always lands between 0 and 1.

Frac node

The Frac node

When to use it

The fractional part, meaning the input minus its floor. Always lands between 0 and 1.

Compact way to build repeating ramps and tiling patterns out of a coordinate.

Like Modulo it puts a discontinuity at every whole number. Build a field directly on Frac and the mesher faithfully reproduces that step as a wall.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

If

Picks one of two inputs from a Condition, treating anything at or above 0.5 as true.

If node

The If node

When to use it

Picks one of two inputs from a Condition, treating anything at or above 0.5 as true.

It fits when the condition is already a mask, from a Compare or a thresholded noise. Branch does the comparison and the choice in one node. Select does the same thing with a soft blend.

A hard switch between two fields leaves a discontinuity at the boundary, and the mesher renders that as a step you never modelled.

Pins

Pin Type Description
True Number Passed through when Condition is 0.5 or more.
False Number Passed through when Condition is under 0.5.
Condition Number The 0-or-1 value that picks a side.
Pin Type Description
Result Number Whichever of True and False got picked.

Studio and Graph › Voxel › Math

Int To Float

Converts an integer to a float.

Int To Float node

The Int To Float node

When to use it

Converts an integer to a float.

It is a straight pass-through, since everything is stored as a float underneath. It exists so the conversion is visible on the canvas and the pins downstream stay float-typed. Adding one costs nothing at all.

Pins

Pin Type Description
Value Whole Number The whole number coming in.
Pin Type Description
Result Number The same number, now on a float wire.

Studio and Graph › Voxel › Math

Inverse Lerp

0 at Range Min, 1 at Range Max, linear between, and clamped to 0 to 1 at both ends.

Inverse Lerp node

The Inverse Lerp node

When to use it

0 at Range Min, 1 at Range Max, linear between, and clamped to 0 to 1 at both ends.

The clamp is the whole difference between this and Remap. It is what stops a value from outside the range driving a blend past its endpoints and pushing a colour or a displacement somewhere you never asked for.

Pins

Pin Type Description
RangeMin Number The input that comes out as 0.
RangeMax Number The input that comes out as 1.
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Lerp

Blends A and B by Alpha. 0 gives A, 1 gives B, and Alpha is clamped so you cannot extrapolate past either end.

Lerp node

The Lerp node

When to use it

Blends A and B by Alpha. 0 gives A, 1 gives B, and Alpha is clamped so you cannot extrapolate past either end.

Fine for mixing two parameters or two masks. Select is the one you want when a threshold on a third value drives the blend.

For combining two shapes, Smooth Union. A lerp between two distance fields is not the distance field of anything, and it meshes as a mushy compromise between the two.

Pins

Pin Type Description
A Number What you get at Alpha 0.
B Number What you get at Alpha 1.
Alpha Number How far between A and B you want to land. Held inside 0 to 1.
Pin Type Description
Result Number A blended towards B.

Studio and Graph › Voxel › Math

Log

Natural logarithm. Zero or negative input returns 0 rather than an infinity.

Log node

The Log node

When to use it

Natural logarithm. Zero or negative input returns 0 rather than an infinity.

Good for squashing a range that spans orders of magnitude down to something you can look at.

The guard means the negative half of a signed field collapses to flat zero, and that half is the entire inside of your shape. Log a magnitude, not a density.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Max

The larger of A and B, which is the same operation Intersection performs, since positive means outside.

Max node

The Max node

When to use it

The larger of A and B, which is the same operation Intersection performs, since positive means outside.

Max is for numeric work: max(x, 0) to strip negatives, clamping a value by hand. Intersection is for shapes. Same maths, and a reader can tell them apart at a glance.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Min

The smaller of A and B.

Min node

The Min node

When to use it

The smaller of A and B.

With negative meaning inside, that is exactly what Union does, and both nodes emit the same operation. Union in a boolean chain so the graph says what you meant, Min when you genuinely want the lower of two numbers.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Modulo

The remainder of A divided by B. Stripes, rings and repeating bands built out of a coordinate. A divisor at or near zero returns 0 rather than an error.

Modulo node

The Modulo node

When to use it

The remainder of A divided by B. Stripes, rings and repeating bands built out of a coordinate. A divisor at or near zero returns 0 rather than an error.

When what you want to tile is a whole shape rather than a number, Domain Repeat is the right node. Modulo on a distance field snaps the value at every cell edge, and the mesher renders that snap as a wall.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Multiply

A times B. The workhorse.

Multiply node

The Multiply node

When to use it

A times B. The workhorse.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Negate

Flips the sign. On a density field that swaps solid and empty, so the inside becomes the outside. Quickest way to turn a shape into the hole it would leave.

Negate node

The Negate node

When to use it

Flips the sign. On a density field that swaps solid and empty, so the inside becomes the outside. Quickest way to turn a shape into the hole it would leave.

For carving one shape out of another, Subtraction does the negate and the combine together and keeps the result valid. This node on its own leaves you to get the max() right yourself.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

One Minus

1 minus the input. The standard way to flip a 0 to 1 mask, and easier to read on the canvas than a Subtract wired to a constant.

One Minus node

The One Minus node

When to use it

1 minus the input. The standard way to flip a 0 to 1 mask, and easier to read on the canvas than a Subtract wired to a constant.

It is not how you invert a density field; Negate is. A distance field is not confined to 0 to 1, so 1 - d shifts the surface as well as flipping it and the shape comes out the wrong size.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Power

A raised to the power B, using the absolute value of A so a negative base cannot produce something undefined.

Power node

The Power node

When to use it

A raised to the power B, using the absolute value of A so a negative base cannot produce something undefined.

That guard matters more than it sounds, because a density field is negative half the time. Raise a signed field to a power and the sign quietly disappears, taking the inside of your shape with it. Shape masks with this. Leave signed fields alone.

On a 0 to 1 mask, exponents above 1 push it toward 0 and sharpen the edge. Below 1 pushes toward 1 and softens it.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Remap

Rescales a value from one range to another, linearly.

Remap node

The Remap node

When to use it

Rescales a value from one range to another, linearly.

Most noise comes out around -1 to 1 and most things that consume it expect 0 to 1. Forgetting that is the single most common reason a pattern looks half missing: the negative half is being read as zero.

It does not clamp. Feed it something outside Input Min to Input Max and the output runs straight past Output Min and Output Max. Inverse Lerp is the clamped version, or put a Clamp after this one.

Pins

Pin Type Description
InputMin Number The input value that should come out as Output Min.
InputMax Number The input value that should come out as Output Max.
OutputMin Number What you get when the input sits at Input Min.
OutputMax Number What you get when the input sits at Input Max.
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Round

Rounds to the nearest whole number.

Round node

The Round node

When to use it

Rounds to the nearest whole number.

Pick it over Floor when the quantised value has to stay centred on the original. Flooring biases everything down by half a step, and once that result drives a position you see it as a systematic shift of the whole pattern.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Sign

+1 for positive, -1 for negative, 0 for exactly zero.

Sign node

The Sign node

When to use it

+1 for positive, -1 for negative, 0 for exactly zero.

On a density field that turns a smooth distance into a hard inside-or-outside flag. Occasionally that is what a mask wants. It is always bad input for the mesher, which needs a slope to find the crossing point in. Give it a sign and the surface snaps to voxel corners.

SmoothStep is the soft version.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Sin

Sine of the input, in radians. One full cycle is 2 pi, so a value in degrees oscillates about 57 times faster than you expected and reads as noise.

Sin node

The Sin node

When to use it

Sine of the input, in radians. One full cycle is 2 * pi, so a value in degrees oscillates about 57 times faster than you expected and reads as noise.

When what you want is a ripple running along a direction, Sine Wave already handles the direction, the frequency and the amplitude.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Smooth Step

An S-curve ramp. 0 below Edge0, 1 above Edge1, smooth in between.

Smooth Step node

The Smooth Step node

When to use it

An S-curve ramp. 0 below Edge0, 1 above Edge1, smooth in between.

The standard way to turn any value into a soft mask, and better than Compare for anything that ends up visible, because the slope is continuous at both ends instead of jumping.

Putting Edge0 above Edge1 works and inverts the ramp, which saves a node when you want the mask the other way round.

Pins

Pin Type Description
Edge0 Number Below this the answer is 0.
Edge1 Number Above this the answer is 1.
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Sqrt

Square root, taking the absolute value first so a negative input cannot produce nonsense.

Sqrt node

The Sqrt node

When to use it

Square root, taking the absolute value first so a negative input cannot produce nonsense.

Which also means feeding it a signed density silently throws the sign away. Square-root a squared length, not a field.

Most of the time the Vec2 Length and Vec3 Length nodes are what you were reaching for.

Pins

Pin Type Description
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Subtract

A minus B. Arithmetic, not a boolean cut.

Subtract node

The Subtract node

When to use it

A minus B. Arithmetic, not a boolean cut.

To carve one shape out of another, use the Subtraction node. It computes max(A, -B) and leaves you something that is still a distance field. Plain subtraction does not.

Where this one earns its place is building expressions. noise * amplitude - z is the standard height-based terrain field, and it is exactly what both erosion nodes expect to be handed.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Terrace

Quantises a smooth value into flat plateaus. Rice-paddy terracing on a height field. Step Size is the height of one plateau, in whatever units the input is in.

Terrace node

The Terrace node

When to use it

Quantises a smooth value into flat plateaus. Rice-paddy terracing on a height field. Step Size is the height of one plateau, in whatever units the input is in.

Pins

Pin Type Description
StepSize Number How tall each flat step is, in the same units the input is in.
Input Number The number to work on.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › Math

Vec2 Add

Component-wise A plus B on two 2D vectors.

Vec2 Add node

The Vec2 Add node

When to use it

Component-wise A plus B on two 2D vectors.

The Vec2 family exists for the XY-plane work heightmap terrain needs. Mixing it with the Vec3 family silently drops Z, so a pattern that should climb ends up flat.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
BX Number B X component.
BY Number B Y component.
Pin Type Description
X Number The result's X component.
Y Number The result's Y component.

Studio and Graph › Voxel › Math

Vec2 Cross

The 2D perp-dot product, A.X B.Y - A.Y B.X. It comes out as a single number, not a vector.

Vec2 Cross node

The Vec2 Cross node

When to use it

The 2D perp-dot product, A.X * B.Y - A.Y * B.X. It comes out as a single number, not a vector.

Positive if B is counter-clockwise from A, negative if clockwise. That makes it the 2D handedness test and the sign of the angle between two directions.

Vec3 Cross is the one that gives you a vector back. Do not expect these two to behave alike.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
BX Number B X component.
BY Number B Y component.
Pin Type Description
Result Number Which side of A the vector B falls on. Positive counter-clockwise, negative clockwise.

Studio and Graph › Voxel › Math

Vec2 Dot

Dot product of two 2D vectors. Positive when they point the same way, zero when perpendicular, negative when opposed.

Vec2 Dot node

The Vec2 Dot node

When to use it

Dot product of two 2D vectors. Positive when they point the same way, zero when perpendicular, negative when opposed.

Normalise both inputs first if you want to read the result as a cosine. Unnormalised inputs scale it by their lengths, and the comparison you thought you were making stops meaning what you thought.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
BX Number B X component.
BY Number B Y component.
Pin Type Description
Result Number How much A and B point the same way.

Studio and Graph › Voxel › Math

Vec2 Length

Magnitude of a 2D vector.

Vec2 Length node

The Vec2 Length node

When to use it

Magnitude of a 2D vector.

Planar distances: how far from an axis, ignoring height. That is exactly what turns a position into a cylinder, and it is cheaper than taking a 3D length and then having to ignore a component of it.

Pins

Pin Type Description
X Number X component of the input vector.
Y Number Y component of the input vector.
Pin Type Description
Length Number How long the vector is.

Studio and Graph › Voxel › Math

Vec2 Normalize

Unit-length version of a 2D vector. A zero-length input safely returns (0, 0) rather than an error.

Vec2 Normalize node

The Vec2 Normalize node

When to use it

Unit-length version of a 2D vector. A zero-length input safely returns (0, 0) rather than an error.

That guard is why a direction built from a difference can come out as zero instead of blowing up. When a direction-driven pattern goes blank at one spot, this is usually where it happened.

Pins

Pin Type Description
X Number X component of the input vector.
Y Number Y component of the input vector.
Pin Type Description
NX Number Normalised X component.
NY Number Normalised Y component.

Studio and Graph › Voxel › Math

Vec2 Scale

Multiplies a 2D vector by a scalar. Uniform scale only.

Vec2 Scale node

The Vec2 Scale node

When to use it

Multiplies a 2D vector by a scalar. Uniform scale only.

For a per-axis scale, build it from the components. This node cannot express one.

Pins

Pin Type Description
VX Number V X component.
VY Number V Y component.
Scale Number One number that multiplies every part of the vector.
Pin Type Description
X Number The result's X component.
Y Number The result's Y component.

Studio and Graph › Voxel › Math

Vec2 Subtract

Component-wise A minus B on two 2D vectors.

Vec2 Subtract node

The Vec2 Subtract node

When to use it

Component-wise A minus B on two 2D vectors.

Usually the offset from one point to another, which then goes into Vec2 Length for a planar distance or Vec2 Normalize for a direction.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
BX Number B X component.
BY Number B Y component.
Pin Type Description
X Number The result's X component.
Y Number The result's Y component.

Studio and Graph › Voxel › Math

Vec3 Add

Component-wise A plus B on two 3D vectors. The usual way to offset a position before feeding it to a pattern.

Vec3 Add node

The Vec3 Add node

When to use it

Component-wise A plus B on two 3D vectors. The usual way to offset a position before feeding it to a pattern.

To move an entire subgraph's sample point, Domain Translate does it in one place instead of one node per pattern.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
AZ Number A Z component.
BX Number B X component.
BY Number B Y component.
BZ Number B Z component.
Pin Type Description
X Number The result's X component.
Y Number The result's Y component.
Z Number The result's Z component.

Studio and Graph › Voxel › Math

Vec3 Cross

Cross product. The vector perpendicular to both inputs.

Vec3 Cross node

The Vec3 Cross node

When to use it

Cross product. The vector perpendicular to both inputs.

Use it to build a frame, like a tangent from a normal and an up vector.

The result is zero when the inputs are parallel, which is exactly what happens at the poles of any up-based frame. Whatever you built on that frame goes undefined there.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
AZ Number A Z component.
BX Number B X component.
BY Number B Y component.
BZ Number B Z component.
Pin Type Description
X Number The result's X component.
Y Number The result's Y component.
Z Number The result's Z component.

Studio and Graph › Voxel › Math

Vec3 Dot

Dot product of two 3D vectors. +1 parallel, 0 perpendicular, -1 opposite, but only when both inputs are unit length.

Vec3 Dot node

The Vec3 Dot node

When to use it

Dot product of two 3D vectors. +1 parallel, 0 perpendicular, -1 opposite, but only when both inputs are unit length.

That condition is the trap. Dot a raw position against World Up and what comes back is a height, not a slope, and it keeps growing the higher you go. Normalise first whenever you want an angle.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
AZ Number A Z component.
BX Number B X component.
BY Number B Y component.
BZ Number B Z component.
Pin Type Description
Result Number How much A and B point the same way.

Studio and Graph › Voxel › Math

Vec3 Length

Magnitude of a 3D vector.

Vec3 Length node

The Vec3 Length node

When to use it

Magnitude of a 3D vector.

Length of position minus centre, minus a radius, is a sphere, and the Sphere primitive already computes that for you. Come here when you want the distance itself as a control value.

Pins

Pin Type Description
X Number X component of the input vector.
Y Number Y component of the input vector.
Z Number Z component of the input vector.
Pin Type Description
Length Number How long the vector is.

Studio and Graph › Voxel › Math

Vec3 Normalize

Unit-length version of a 3D vector. Zero length safely returns (0, 0, 0).

Vec3 Normalize node

The Vec3 Normalize node

When to use it

Unit-length version of a 3D vector. Zero length safely returns (0, 0, 0).

Do this before any dot product you intend to read as an angle.

The zero guard means a degenerate direction goes quietly to nothing rather than poisoning the whole field with a value the mesher cannot use.

Pins

Pin Type Description
X Number X component of the input vector.
Y Number Y component of the input vector.
Z Number Z component of the input vector.
Pin Type Description
NX Number Normalised X component.
NY Number Normalised Y component.
NZ Number Normalised Z component.

Studio and Graph › Voxel › Math

Vec3 Scale

Multiplies a 3D vector by a scalar. Uniform scale.

Vec3 Scale node

The Vec3 Scale node

When to use it

Multiplies a 3D vector by a scalar. Uniform scale.

Non-uniform scaling has to be built from the components, or done with Domain Scale when it is the sample point you want scaled.

Pins

Pin Type Description
VX Number V X component.
VY Number V Y component.
VZ Number V Z component.
Scale Number One number that multiplies every part of the vector.
Pin Type Description
X Number The result's X component.
Y Number The result's Y component.
Z Number The result's Z component.

Studio and Graph › Voxel › Math

Vec3 Subtract

Component-wise A minus B on two 3D vectors, usually to get the offset from a centre to the sample point.

Vec3 Subtract node

The Vec3 Subtract node

When to use it

Component-wise A minus B on two 3D vectors, usually to get the offset from a centre to the sample point.

Follow it with Vec3 Length for a distance, or Vec3 Normalize for a direction.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
AZ Number A Z component.
BX Number B X component.
BY Number B Y component.
BZ Number B Z component.
Pin Type Description
X Number The result's X component.
Y Number The result's Y component.
Z Number The result's Z component.

Studio and Graph › Voxel › Math

Vec4 Add

Component-wise A plus B on two 4D vectors.

Vec4 Add node

The Vec4 Add node

When to use it

Component-wise A plus B on two 4D vectors.

The Vec4 family is here for colour with alpha more than for geometry. For positions, Vec3 is what the rest of the graph speaks.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
AZ Number A Z component.
AW Number A W component.
BX Number B X component.
BY Number B Y component.
BZ Number B Z component.
BW Number B W component.
Pin Type Description
X Number The result's X component.
Y Number The result's Y component.
Z Number The result's Z component.
W Number The result's W component.

Studio and Graph › Voxel › Math

Vec4 Dot

Dot product of two 4D vectors.

Vec4 Dot node

The Vec4 Dot node

When to use it

Dot product of two 4D vectors.

Rarely a geometric question at four components. Most often it is a weighted sum, with one input acting as the weights.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
AZ Number A Z component.
AW Number A W component.
BX Number B X component.
BY Number B Y component.
BZ Number B Z component.
BW Number B W component.
Pin Type Description
Result Number Every pair of components multiplied, then all four added up.

Studio and Graph › Voxel › Math

Vec4 Length

Magnitude of a 4D vector.

Vec4 Length node

The Vec4 Length node

When to use it

Magnitude of a 4D vector.

On an RGBA colour this pulls alpha into the magnitude, so what comes back is not a brightness. Take the RGB as a Vec3 if brightness is what you wanted.

Pins

Pin Type Description
X Number X component of the input vector.
Y Number Y component of the input vector.
Z Number Z component of the input vector.
W Number W component of the input vector.
Pin Type Description
Length Number How long the vector is.

Studio and Graph › Voxel › Math

Vec4 Normalize

Unit-length version of a 4D vector. Zero length safely returns zero.

Vec4 Normalize node

The Vec4 Normalize node

When to use it

Unit-length version of a 4D vector. Zero length safely returns zero.

As with Vec4 Scale, normalising an RGBA colour drags alpha into the calculation. Normalise the RGB separately when that matters.

Pins

Pin Type Description
X Number X component of the input vector.
Y Number Y component of the input vector.
Z Number Z component of the input vector.
W Number W component of the input vector.
Pin Type Description
NX Number Normalised X component.
NY Number Normalised Y component.
NZ Number Normalised Z component.
NW Number Normalised W component.

Studio and Graph › Voxel › Math

Vec4 Scale

Multiplies a 4D vector by a scalar.

Vec4 Scale node

The Vec4 Scale node

When to use it

Multiplies a 4D vector by a scalar.

On an RGBA colour that scales the alpha too, which is almost never what anyone meant. Halve a colour and it comes back half transparent as well as half as bright. Scale the RGB as a Vec3 and carry alpha separately.

Pins

Pin Type Description
VX Number V X component.
VY Number V Y component.
VZ Number V Z component.
VW Number V W component.
Scale Number One number that multiplies every part of the vector.
Pin Type Description
X Number The result's X component.
Y Number The result's Y component.
Z Number The result's Z component.
W Number The result's W component.

Studio and Graph › Voxel › Math

Vec4 Subtract

Component-wise A minus B on two 4D vectors.

Vec4 Subtract node

The Vec4 Subtract node

When to use it

Component-wise A minus B on two 4D vectors.

Most useful on colours. Subtracting positions in 4D means carrying a W you probably do not want.

Pins

Pin Type Description
AX Number A X component.
AY Number A Y component.
AZ Number A Z component.
AW Number A W component.
BX Number B X component.
BY Number B Y component.
BZ Number B Z component.
BW Number B W component.
Pin Type Description
X Number The result's X component.
Y Number The result's Y component.
Z Number The result's Z component.
W Number The result's W component.

Studio and Graph › Voxel

CSG

Constructive solid geometry: union, intersection and subtraction of distance fields, with smooth (blended) variants that round the seam instead of creasing it.

Studio and Graph › Voxel › CSG

Intersection

Keeps only what is solid in both inputs. max(A, B), since positive means outside.

Intersection node

The Intersection node

When to use it

Keeps only what is solid in both inputs. max(A, B), since positive means outside.

The everyday use is trimming. Intersect a detailed shape with a Box or a Plane and it gets cut to size without you modelling the cut.

Smooth Intersection is the filleted version of the same thing.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › CSG

Smooth Intersection

Keeps the overlap of A and B, with the seam blended rather than creased.

Smooth Intersection node

The Smooth Intersection node

When to use it

Keeps the overlap of A and B, with the seam blended rather than creased.

Reach for it when trimming should leave a fillet where the cutter meets the surface. Plain Intersection when the sharp edge is the point of the cut.

Pins

Pin Type Description
Radius Number How wide the blend runs, in world units.
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › CSG

Smooth Subtraction

Carves B out of A with a rounded seam instead of a sharp edge. The difference between a cut that looks machined and one that looks eroded.

Smooth Subtraction node

The Smooth Subtraction node

When to use it

Carves B out of A with a rounded seam instead of a sharp edge. The difference between a cut that looks machined and one that looks eroded.

Same radius rules as Smooth Union. World units, and it needs real distance fields on both sides to blend evenly.

Pins

Pin Type Description
Radius Number How wide the blend runs, in world units.
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › CSG

Smooth Union

A Union whose seam is blended over a radius instead of meeting at a crease. This is what makes boolean-built forms read as grown rather than assembled.

Smooth Union node

The Smooth Union node

When to use it

A Union whose seam is blended over a radius instead of meeting at a crease. This is what makes boolean-built forms read as grown rather than assembled.

Pins

Pin Type Description
Radius Number How wide the blend runs, in world units.
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › CSG

Subtraction

Carves B out of A. Solid where A is solid and B is not, computed as max(A, -B).

Subtraction node

The Subtraction node

When to use it

Carves B out of A. Solid where A is solid and B is not, computed as max(A, -B).

Holes, windows, caves and doorways all come from this node. It is also why you should not reach for the arithmetic Subtract, which leaves you a field that is no longer a distance to anything and makes everything downstream worse.

The cut edge is sharp. Smooth Subtraction rounds it.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel › CSG

Union

Solid wherever either input is solid. The add of boolean modelling.

Union node

The Union node

When to use it

Solid wherever either input is solid. The add of boolean modelling.

Under this graph's convention, where negative means inside, that comes out as min(A, B).

The join is a crease. Smooth Union gives you a fillet instead. And do not reach for the arithmetic Add here: adding two fields gives you a shape that is neither of them.

Pins

Pin Type Description
A Number The first number.
B Number The second number.
Pin Type Description
Result Number The answer.

Studio and Graph › Voxel

Shape

Primitive distance fields - spheres, boxes, cylinders and friends - used as building blocks for CSG.

Studio and Graph › Voxel › Shape

Box

An axis-aligned box, negative inside. As often a cutter as a shape: intersect to crop a field down to a region, subtract to punch a rectangular hole.

Box node

The Box node

When to use it

An axis-aligned box, negative inside. As often a cutter as a shape: intersect to crop a field down to a region, subtract to punch a rectangular hole.

Axis-aligned by construction. To tilt it, rotate the domain.

For anything that will be smooth-unioned, Rounded Box is the better start. Sharp corners give Smooth Union nothing even to blend against and the fillets come out uneven around them.

Pins

Pin Type Description
ExtentX Number Half the width of the box, so 5 gives you a box 10 across.
ExtentY Number Half the depth of the box.
ExtentZ Number Half the height of the box.
CenterX Number Where the box sits along X.
CenterY Number Where the box sits along Y.
CenterZ Number Where the box sits along Z.
Pin Type Description
Distance Number The shape as a field. Negative inside it, positive outside, zero on the skin.

Studio and Graph › Voxel › Shape

Capsule

A vertical capsule: a cylinder with hemispherical caps. Limbs, balloons, rounded pillars.

Capsule node

The Capsule node

When to use it

A vertical capsule: a cylinder with hemispherical caps. Limbs, balloons, rounded pillars.

Radius sets both the tube and the caps. Half Height covers only the straight middle section, so the total length works out at twice Half Height plus twice Radius.

For a shape going into a Smooth Union this beats Cylinder every time. Round caps blend where flat caps crease.

Pins

Pin Type Description
Radius Number How fat the pill is. Also the size of the domed ends.
HalfHeight Number Half the length of the straight middle bit. The domes are on top of this.
CenterX Number Where the pill sits along X.
CenterY Number Where the pill sits along Y.
CenterZ Number Where the pill sits along Z.
Pin Type Description
Distance Number The shape as a field. Negative inside it, positive outside, zero on the skin.

Studio and Graph › Voxel › Shape

Cone

A vertical cone. The base sits at the centre point and the apex is Height above it. Mountain peaks, spikes, stylised trees.

Cone node

The Cone node

When to use it

A vertical cone. The base sits at the centre point and the apex is Height above it. Mountain peaks, spikes, stylised trees.

The field is built from three flat tests rather than a true distance, and near the very tip all three go slack. Smooth Union around the apex pinches oddly because of it.

Blend at the base instead, or cut the tip off with an Intersection against a Plane and blend there.

Pins

Pin Type Description
BaseRadius Number How wide the cone is where it meets the ground.
Height Number How tall the cone is, base to tip.
CenterX Number Where the cone sits along X.
CenterY Number Where the cone sits along Y.
CenterZ Number Where the base of the cone sits along Z.
Pin Type Description
Distance Number The shape as a field. Negative inside it, positive outside, zero on the skin.

Studio and Graph › Voxel › Shape

Cylinder

A cylinder, negative inside. Pipes, columns, and a drill bit for Subtraction.

Cylinder node

The Cylinder node

When to use it

A cylinder, negative inside. Pipes, columns, and a drill bit for Subtraction.

Its axis runs along Y, the same axis the Torus hole uses, so a fresh one lies on its side rather than standing up. Rotate the domain to aim it anywhere else. Capsule, Cone and Hex Prism are all built along Z instead, which is worth knowing before you swap one for another and watch the shape fall over.

The caps are flat and sharp. When the ends are heading into a Smooth Union, Capsule blends far more cleanly.

Pins

Pin Type Description
Radius Number How fat the cylinder is.
Height Number How long the cylinder is, end to end along its Y axis.
CenterX Number Where the cylinder sits along X.
CenterY Number Where the cylinder sits along Y.
CenterZ Number Where the cylinder sits along Z.
Pin Type Description
Distance Number The shape as a field. Negative inside it, positive outside, zero on the skin.

Studio and Graph › Voxel › Shape

Ellipsoid

A sphere stretched or squashed independently on each axis. Eggs, pebbles, elongated blobs.

Ellipsoid node

The Ellipsoid node

When to use it

A sphere stretched or squashed independently on each axis. Eggs, pebbles, elongated blobs.

A non-uniformly scaled sphere is only an approximate distance field, so a strongly stretched ellipsoid blends slightly unevenly under Smooth Union. A Sphere inside a scaled domain has the same problem, so at least here it is visible on the node.

Pins

Pin Type Description
RadiusX Number How far the shape reaches along X.
RadiusY Number How far the shape reaches along Y.
RadiusZ Number How far the shape reaches along Z.
CenterX Number Where the shape sits along X.
CenterY Number Where the shape sits along Y.
CenterZ Number Where the shape sits along Z.
Pin Type Description
Distance Number The shape as a field. Negative inside it, positive outside, zero on the skin.

Studio and Graph › Voxel › Shape

Hex Prism

A vertical six-sided prism. Honeycombs, basalt columns, stylised rock.

Hex Prism node

The Hex Prism node

When to use it

A vertical six-sided prism. Honeycombs, basalt columns, stylised rock.

Radius is measured to the middle of each flat side, not to a corner, so the prism is a little wider than Radius suggests at the points.

Pair it with Domain Repeat and one node becomes a whole field of columns. Vary their heights with a noise-driven Intersection against a Plane.

Pins

Pin Type Description
Radius Number How wide the pillar is, measured to the middle of a flat side.
HalfHeight Number Half the height of the pillar, so 5 gives you one 10 tall.
CenterX Number Where the pillar sits along X.
CenterY Number Where the pillar sits along Y.
CenterZ Number Where the pillar sits along Z.
Pin Type Description
Distance Number The shape as a field. Negative inside it, positive outside, zero on the skin.

Studio and Graph › Voxel › Shape

Plane

An infinite half-space. Everything on one side is inside, everything on the other is outside.

Plane node

The Plane node

When to use it

An infinite half-space. Everything on one side is inside, everything on the other is outside.

It is rarely a shape and nearly always a knife. Intersect with it to slice a model flat. Subtract it to remove everything below a level.

Because it is infinite, unioning it with anything fills the entire world on one side. That is a fast way to fill your whole Search Extent with solid by accident and then wonder why the bake is taking ten minutes.

Pins

Pin Type Description
NormalX Number Which way the plane faces, along X.
NormalY Number Which way the plane faces, along Y.
NormalZ Number Which way the plane faces, along Z.
Distance Number How far the plane sits from the origin.
Pin Type Description
Result Number Negative on the solid side of the plane, positive on the empty side.

Studio and Graph › Voxel › Shape

Rounded Box

A box with softly rounded corners, and the primitive most boolean modelling should start from. The corner radius gives Smooth Union something even to work with, which a sharp Box does not.

Rounded Box node

The Rounded Box node

When to use it

A box with softly rounded corners, and the primitive most boolean modelling should start from. The corner radius gives Smooth Union something even to work with, which a sharp Box does not.

A small Round Radius reads as machined. A large one reads as a pill.

The radius eats into the extents rather than adding to them, so a rounded box is never bigger than the box you asked for.

Pins

Pin Type Description
ExtentX Number Half the width of the box, measured before the corners are rounded off.
ExtentY Number Half the depth of the box.
ExtentZ Number Half the height of the box.
CenterX Number Where the box sits along X.
CenterY Number Where the box sits along Y.
CenterZ Number Where the box sits along Z.
RoundRadius Number How much to take off the corners. Push it up to half the smallest extent and the box turns into a ball.
Pin Type Description
Distance Number The shape as a field. Negative inside it, positive outside, zero on the skin.

Studio and Graph › Voxel › Shape

Sphere

A sphere as a distance field. Negative inside, positive outside. Most boolean chains start here.

Sphere node

The Sphere node

When to use it

A sphere as a distance field. Negative inside, positive outside. Most boolean chains start here.

Wire it straight into Density for a solid ball, or into a Union or Subtraction to combine it with something else.

Ellipsoid is the version whose three axes can differ. Radial Gradient is a different animal entirely: it gives you a distance, not a shape.

Pins

Pin Type Description
Radius Number How big the ball is, in world units.
CenterX Number Where the ball sits along X.
CenterY Number Where the ball sits along Y.
CenterZ Number Where the ball sits along Z.
Pin Type Description
Distance Number The shape as a field. Negative inside it, positive outside, zero on the skin.

Studio and Graph › Voxel › Shape

Torus

A torus, negative inside the ring. Rings, tubes, the start of a handle.

Torus node

The Torus node

When to use it

A torus, negative inside the ring. Rings, tubes, the start of a handle.

The hole runs along Y, not Z, so it stands up like a wheel rather than lying flat. Rotate the domain to lay it down.

The two radii are independent, and a Minor Radius at or above Major Radius closes the hole completely. What you get then is a lumpy blob, not a torus.

Pins

Pin Type Description
MajorRadius Number How wide the ring is, measured to the middle of the tube.
MinorRadius Number How fat the tube is. Push it past the ring width and the hole closes up.
CenterX Number Where the doughnut sits along X.
CenterY Number Where the doughnut sits along Y.
CenterZ Number Where the doughnut sits along Z.
Pin Type Description
Distance Number The shape as a field. Negative inside it, positive outside, zero on the skin.

Studio and Graph › Voxel

Noise

Procedural noise fields for roughening surfaces, driving displacement and breaking up regularity.

Studio and Graph › Voxel › Noise

Cellular Noise

Cellular, or Worley, noise. Voronoi-like cells for rocks, cracked ground, scales and biome boundaries.

Cellular Noise node

The Cellular Noise node

When to use it

Cellular, or Worley, noise. Voronoi-like cells for rocks, cracked ground, scales and biome boundaries.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
DistanceFunction Choice How cell edges are measured. Changes whether the cells look rounded or angular.
ReturnType Choice What the node hands back: distance to the nearest cell centre, the gap between the two nearest, and so on.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Noise

Cellular Noise 2D

2D cellular noise. Voronoi cells in the XY plane, the standard way to lay out biome regions or a cracked-ground pattern on terrain.

Cellular Noise 2D node

The Cellular Noise 2D node

When to use it

2D cellular noise. Voronoi cells in the XY plane, the standard way to lay out biome regions or a cracked-ground pattern on terrain.

As with the 3D one, Return Type changes what the output means. Distance gives you something smooth to shape with. Cell Value gives you a flat label per cell. Pick it on purpose.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
DistanceFunction Choice How cell edges are measured. Changes whether the cells look rounded or angular.
ReturnType Choice What the node hands back: distance to the nearest cell centre, the gap between the two nearest, and so on.
Pin Type Description
Result Number The noise here. Roughly -1 to 1, and the same at every height.

Studio and Graph › Voxel › Noise

Noise 2D

2D noise with the basis picked at runtime through the Noise Type pin.

Noise 2D node

The Noise 2D node

When to use it

2D noise with the basis picked at runtime through the Noise Type pin.

Worth it when a selector is driving the choice. The fixed-variant nodes are clearer on the canvas when it is not.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
NoiseType Choice Which flavour of noise to use.
Pin Type Description
Result Number The noise here. Roughly -1 to 1, and the same at every height.

Studio and Graph › Voxel › Noise

Noise 3D

3D noise whose basis is picked at runtime through the Noise Type pin. Wire a Noise Type selector, or any int source, and swap between Perlin, Simplex and Value without rewiring anything.

Noise 3D node

The Noise 3D node

When to use it

3D noise whose basis is picked at runtime through the Noise Type pin. Wire a Noise Type selector, or any int source, and swap between Perlin, Simplex and Value without rewiring anything.

Those three are the whole list. White Noise and Cellular Noise are separate nodes and this pin cannot reach them.

Worth it when the basis is genuinely data-driven or you are comparing two of them side by side. When it is not, the fixed nodes say on the canvas which noise you are getting, and six months later that matters.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
NoiseType Choice Which flavour of noise to use. Wire a Noise Type node in to swap it from the graph.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Noise

Perlin Noise

Classic Perlin. Smoothly varying pseudo-random values, good for soft bumps and gentle organic detail. Output sits roughly between -1 and 1, so remap before treating it as a mask.

Perlin Noise node

The Perlin Noise node

When to use it

Classic Perlin. Smoothly varying pseudo-random values, good for soft bumps and gentle organic detail. Output sits roughly between -1 and 1, so remap before treating it as a mask.

One octave only. For the layered detail that actually reads as terrain, Perlin FBM.

Perlin has mild axis-aligned artefacts, faint grid lines you notice once you know they are there. Simplex is the better default for that reason.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Noise

Perlin Noise 2D

Perlin sampled in the XY plane only, so the same value comes back at every height.

Perlin Noise 2D node

The Perlin Noise 2D node

When to use it

Perlin sampled in the XY plane only, so the same value comes back at every height.

That is exactly what a heightmap wants and exactly wrong for caves or overhangs, which need the value to change as you go up.

Build terrain as height minus Z with the 2D family. Switch to the 3D family the moment you need real volume. The 2D version is cheaper too, which is another reason to choose deliberately.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Pin Type Description
Result Number The noise here. Roughly -1 to 1, and the same at every height.

Studio and Graph › Voxel › Noise

Simplex Noise

Simplex noise. Like Perlin but smoother in the detail and without the directional artefacts, and the sensible pick for a single octave.

Simplex Noise node

The Simplex Noise node

When to use it

Simplex noise. Like Perlin but smoother in the detail and without the directional artefacts, and the sensible pick for a single octave.

Simplex FBM for multi-octave terrain. Value noise only when you specifically want the blockier, cheaper look.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Noise

Simplex Noise 2D

2D Simplex. Usually the best default for a terrain heightmap: smooth, cheap, no directional artefacts.

Simplex Noise 2D node

The Simplex Noise 2D node

When to use it

2D Simplex. Usually the best default for a terrain heightmap: smooth, cheap, no directional artefacts.

Constant with height, so it cannot produce an overhang no matter what you do to it. The 3D family is where those come from.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Pin Type Description
Result Number The noise here. Roughly -1 to 1, and the same at every height.

Studio and Graph › Voxel › Noise

Value Noise

Value noise. Blockier than Perlin or Simplex, cheaper to evaluate, with visible cell structure.

Value Noise node

The Value Noise node

When to use it

Value noise. Blockier than Perlin or Simplex, cheaper to evaluate, with visible cell structure.

Choose it on purpose, for a chunky stylised look or somewhere the cost genuinely matters. For anything meant to read as natural, Simplex is the better basis.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Noise

Value Noise 2D

2D Value noise. The chunky, cheap alternative to Perlin in the XY plane.

Value Noise 2D node

The Value Noise 2D node

When to use it

2D Value noise. The chunky, cheap alternative to Perlin in the XY plane.

Pick it for a stylised look. Its cell structure is plainly visible at low octave counts.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Pin Type Description
Result Number The noise here. Roughly -1 to 1, and the same at every height.

Studio and Graph › Voxel › Noise

White Noise

Pure random per sample. No smoothing at all.

White Noise node

The White Noise node

When to use it

Pure random per sample. No smoothing at all.

Never wire it into density. Neighbouring voxels are completely uncorrelated, so there is no surface anywhere for the mesher to find and what you get back is static.

Good for stippling and scatter masks. When the same position has to give the same answer twice, Hash and the Stable random nodes are the ones.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Noise

White Noise 2D

2D white noise. Per-sample random with no smoothing.

White Noise 2D node

The White Noise 2D node

When to use it

2D white noise. Per-sample random with no smoothing.

Same rule as the 3D version: never into a density. Scatter masks and stippling only. When the value has to be stable for a given position, Hash or a Stable random node.

Pins

Pin Type Description
Frequency Number How tight the pattern is. Higher numbers give you finer, busier detail.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Pin Type Description
Result Number The noise here. Roughly -1 to 1, and the same at every height.

Studio and Graph › Voxel

Fractal Noise

Layered noise: octaves of a base noise summed into fractal detail, with the usual lacunarity and gain controls.

Studio and Graph › Voxel › Fractal Noise

Fractal Noise

Fractal noise with both the basis and the fractal shape chosen at runtime through pins. The most flexible noise node here and the least self-documenting.

Fractal Noise node

The Fractal Noise node

When to use it

Fractal noise with both the basis and the fractal shape chosen at runtime through pins. The most flexible noise node here and the least self-documenting.

Reach for it when a selector is genuinely driving the choice. Otherwise Simplex FBM, Perlin Ridged and the rest of the named nodes leave a graph someone can read.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
NoiseType Choice Which flavour of noise to use.
FractalType Choice How the layers get folded together: plain, ridged, puffy or churning.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Fractal Noise 2D

2D fractal noise with both the basis and the fractal shape chosen at runtime. The most flexible and least readable of the 2D noise nodes.

Fractal Noise 2D node

The Fractal Noise 2D node

When to use it

2D fractal noise with both the basis and the fractal shape chosen at runtime. The most flexible and least readable of the 2D noise nodes.

A named variant is the better default unless the choice really is data-driven.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
NoiseType Choice Which flavour of noise to use.
FractalType Choice How the layers get folded together: plain, ridged, puffy or churning.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Perlin Billow

Multi-octave Perlin with puffy rounded features. Clouds, foam, lumpy surfaces.

Perlin Billow node

The Perlin Billow node

When to use it

Multi-octave Perlin with puffy rounded features. Clouds, foam, lumpy surfaces.

It is Ridged folded the other way, so it biases the field downward by about as much as Ridged biases it up. Expect to re-tune your offset when swapping between them.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Perlin Billow 2D

2D Perlin Billow. Rounded, lumpy heightmap noise.

Perlin Billow 2D node

The Perlin Billow 2D node

When to use it

2D Perlin Billow. Rounded, lumpy heightmap noise.

Ridged's counterpart, for rolling hills and dunes rather than peaks.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Perlin FBM

Multi-octave Perlin. The default for natural-looking terrain, because real landscapes have detail at every scale and one octave does not.

Perlin FBM node

The Perlin FBM node

When to use it

Multi-octave Perlin. The default for natural-looking terrain, because real landscapes have detail at every scale and one octave does not.

Octaves cost linearly. Any octave finer than your voxel size is invisible work that also makes the mesher noisier, so match the highest frequency to the resolution you will actually bake at.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Perlin FBM 2D

2D multi-octave Perlin. The default terrain noise for heightmap-style generation.

Perlin FBM 2D node

The Perlin FBM 2D node

When to use it

2D multi-octave Perlin. The default terrain noise for heightmap-style generation.

Pair it with Position Z to make a field: amplitude * noise - z. That is the shape both erosion nodes expect to be handed.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Perlin Ridged

Multi-octave Perlin folded to emphasise sharp ridges. Mountain ranges, cracked earth, anything where FBM looks too rounded.

Perlin Ridged node

The Perlin Ridged node

When to use it

Multi-octave Perlin folded to emphasise sharp ridges. Mountain ranges, cracked earth, anything where FBM looks too rounded.

Ridged noise is biased toward its maximum. Swap it in for an FBM at the same amplitude and the whole field sits higher than it did, so the offset that used to put the surface at ground level now buries it.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Perlin Ridged 2D

2D Perlin Ridged. Sharp ridges for mountain ranges in heightmap terrain.

Perlin Ridged 2D node

The Perlin Ridged 2D node

When to use it

2D Perlin Ridged. Sharp ridges for mountain ranges in heightmap terrain.

Biased toward its maximum like every ridged fractal, so the terrain sits higher than the equivalent FBM at the same amplitude.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Perlin Turbulence

Multi-octave Perlin with a chaotic, swirling character.

Perlin Turbulence node

The Perlin Turbulence node

When to use it

Multi-octave Perlin with a chaotic, swirling character.

Its best job is as the Warp signal for a Domain Warp, or as abstract texture. As a terrain height it reads as noise rather than landscape, because the slope jumps instead of curving.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Perlin Turbulence 2D

2D Perlin Turbulence. Swirling chaos in the XY plane.

Perlin Turbulence 2D node

The Perlin Turbulence 2D node

When to use it

2D Perlin Turbulence. Swirling chaos in the XY plane.

Better as a warp source for another 2D pattern than as a height in its own right.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Simplex Billow

Smooth, rounded, lumpy. The organic counterpart to Simplex Ridged.

Simplex Billow node

The Simplex Billow node

When to use it

Smooth, rounded, lumpy. The organic counterpart to Simplex Ridged.

Cloud banks and eroded boulders rather than the ridgelines themselves.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Simplex Billow 2D

2D Simplex Billow. Rounded lumpy heightmap noise on a Simplex basis.

Simplex Billow 2D node

The Simplex Billow 2D node

When to use it

2D Simplex Billow. Rounded lumpy heightmap noise on a Simplex basis.

For terrain where Ridged looks too aggressive.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Simplex FBM

Multi-octave Simplex. Perlin FBM's job, smoother, with no directional artefacts.

Simplex FBM node

The Simplex FBM node

When to use it

Multi-octave Simplex. Perlin FBM's job, smoother, with no directional artefacts.

With no reason to prefer another basis, this is the terrain noise to start with.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Simplex FBM 2D

2D Simplex FBM. Smoother than the Perlin version and without its directional artefacts. The safest default in the 2D fractal family.

Simplex FBM 2D node

The Simplex FBM 2D node

When to use it

2D Simplex FBM. Smoother than the Perlin version and without its directional artefacts. The safest default in the 2D fractal family.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Simplex Ridged

Sharper, more mountainous ridged noise without Perlin's axis alignment.

Simplex Ridged node

The Simplex Ridged node

When to use it

Sharper, more mountainous ridged noise without Perlin's axis alignment.

Same upward bias as any ridged fractal, so re-tune the offset when you swap it in for an FBM or the ground level moves under you.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Simplex Ridged 2D

2D Simplex Ridged. Mountain ridgelines without Perlin's axis alignment.

Simplex Ridged 2D node

The Simplex Ridged 2D node

When to use it

2D Simplex Ridged. Mountain ridgelines without Perlin's axis alignment.

Same upward bias as any ridged fractal, so the offset needs re-tuning when you swap it in.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Simplex Turbulence

Swirling chaotic noise on a Simplex basis. Best as a Domain Warp source rather than directly as a height, for the same reason as its Perlin counterpart: the slope jumps.

Simplex Turbulence node

The Simplex Turbulence node

When to use it

Swirling chaotic noise on a Simplex basis. Best as a Domain Warp source rather than directly as a height, for the same reason as its Perlin counterpart: the slope jumps.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Simplex Turbulence 2D

2D Simplex Turbulence. Chaotic swirls in XY, most useful as a domain-warp source for another 2D pattern.

Simplex Turbulence 2D node

The Simplex Turbulence 2D node

When to use it

2D Simplex Turbulence. Chaotic swirls in XY, most useful as a domain-warp source for another 2D pattern.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Value Billow

Blocky lumpy noise, cheapest of the billow family. Expect visible cells at low octave counts.

Value Billow node

The Value Billow node

When to use it

Blocky lumpy noise, cheapest of the billow family. Expect visible cells at low octave counts.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Value Billow 2D

2D Value Billow. Blocky rolling noise, cheapest of the 2D billow variants.

Value Billow 2D node

The Value Billow 2D node

When to use it

2D Value Billow. Blocky rolling noise, cheapest of the 2D billow variants.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Value FBM

Multi-octave Value noise. The cheap, blockier alternative to Perlin FBM.

Value FBM node

The Value FBM node

When to use it

Multi-octave Value noise. The cheap, blockier alternative to Perlin FBM.

Worth choosing when the look is deliberately stylised or the evaluation budget is genuinely tight. Otherwise the cell structure shows through, worst of all at low octave counts.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Value FBM 2D

2D Value FBM. The cheap, blocky terrain fractal.

Value FBM 2D node

The Value FBM 2D node

When to use it

2D Value FBM. The cheap, blocky terrain fractal.

Worth it only when the stylised look is what you want or the budget is genuinely tight.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Value Ridged

Blocky ridged noise. The cell structure of the value basis is far more visible here than in the Perlin and Simplex versions.

Value Ridged node

The Value Ridged node

When to use it

Blocky ridged noise. The cell structure of the value basis is far more visible here than in the Perlin and Simplex versions.

That is either the stylised look you were after or the reason to change basis.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Value Ridged 2D

2D Value Ridged. Blocky ridgelines.

Value Ridged 2D node

The Value Ridged 2D node

When to use it

2D Value Ridged. Blocky ridgelines.

The cell structure of the value basis is very visible in ridged form. Change basis if that is not the intent.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel › Fractal Noise

Value Turbulence

Blocky chaotic noise, and the cheapest warp source available.

Value Turbulence node

The Value Turbulence node

When to use it

Blocky chaotic noise, and the cheapest warp source available.

Its blockiness transfers straight into whatever it warps, which makes it a poor choice when the warp is meant to look organic.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
OffsetZ Number Slide the pattern along Z.
Seed Whole Number Change this for a different pattern at the same settings. The same seed always gives you the same noise.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The noise here. Roughly -1 to 1.

Studio and Graph › Voxel › Fractal Noise

Value Turbulence 2D

2D Value Turbulence. Blocky chaotic noise in XY.

Value Turbulence 2D node

The Value Turbulence 2D node

When to use it

2D Value Turbulence. Blocky chaotic noise in XY.

Its blockiness transfers into anything it warps, and it shows up fast.

Pins

Pin Type Description
Frequency Number How tight the biggest layer is. Everything else is built on top of it.
Lacunarity Number How much smaller each layer gets. At 2 every layer is half the size of the one before.
Gain Number How much quieter each layer gets. Low is crisp, high is rough and grubby.
OffsetX Number Slide the pattern along X.
OffsetY Number Slide the pattern along Y.
Seed Whole Number Change this for a different pattern at the same settings.
Octaves Whole Number How many layers to stack. Past about 8 you are paying for detail finer than your voxels can show.
Pin Type Description
Result Number The stacked noise here, the same at every height.

Studio and Graph › Voxel

Pattern

Regular, repeating fields - tilings and structured patterns rather than noise.

Studio and Graph › Voxel › Pattern

Checkerboard

A 3D checkerboard alternating between +1 and -1 per cell. Scale controls how fine the cells are.

Checkerboard node

The Checkerboard node

When to use it

A 3D checkerboard alternating between +1 and -1 per cell. Scale controls how fine the cells are.

It is a pattern, not a distance field. Wire it into Density and you get a lattice of solid cubes with no smooth crossing anywhere for the mesher to find.

As a mask it earns its keep: pick out alternating cells for colour, or for a brick-and-mortar classification. Combine it with maths nodes rather than with booleans.

Pins

Pin Type Description
Scale Number How tight the squares are. Higher numbers make them smaller.
Pin Type Description
Result Number +1 on the light squares, -1 on the dark ones.

Studio and Graph › Voxel › Pattern

Constant

A fixed float, in a small node that fits inside a dense pattern subgraph without taking over the canvas. The title shows the value.

Constant node

The Constant node

When to use it

A fixed float, in a small node that fits inside a dense pattern subgraph without taking over the canvas. The title shows the value.

Float Input does exactly the same thing in a bigger node with a named field. There is no behavioural difference. Pick whichever keeps the graph readable.

Pins

Pin Type Description
Value Number The number you typed.

Settings

Setting Type Description
Value Number The number.

Studio and Graph › Voxel › Pattern

Linear Gradient

A value that increases along a chosen direction. Layered strata, and any masking that depends on which way something faces in world space.

Linear Gradient node

The Linear Gradient node

When to use it

A value that increases along a chosen direction. Layered strata, and any masking that depends on which way something faces in world space.

The default axis is Y, not Z, so a fresh node varies north-south rather than by height. Set Axis Z to 1 if height is what you meant.

It is unbounded and in world units. Run it through Remap or Inverse Lerp before anything treats it as a 0 to 1 mask, or the mask saturates the moment you leave the origin.

Pins

Pin Type Description
AxisX Number How much the ramp climbs along X.
AxisY Number How much the ramp climbs along Y.
AxisZ Number How much the ramp climbs along Z.
Pin Type Description
Result Number The ramp value at this point.

Studio and Graph › Voxel › Pattern

Radial Gradient

Straight-line distance from a centre point. Circular masks and falloffs.

Radial Gradient node

The Radial Gradient node

When to use it

Straight-line distance from a centre point. Circular masks and falloffs.

It is not a sphere. A sphere is this minus a radius, and that subtraction is the whole difference between something you can mesh and something you can only mask with.

Spherical Gradient is the version that arrives already normalised, 1 at the centre falling to 0.

Pins

Pin Type Description
CenterX Number Where the middle sits along X.
CenterY Number Where the middle sits along Y.
CenterZ Number Where the middle sits along Z.
Pin Type Description
Result Number How far this point is from the middle.

Studio and Graph › Voxel › Pattern

Sine Wave

A sinusoidal ripple repeating along a chosen direction. Ribbed surfaces, corrugated walls, wavy water.

Sine Wave node

The Sine Wave node

When to use it

A sinusoidal ripple repeating along a chosen direction. Ribbed surfaces, corrugated walls, wavy water.

Frequency, amplitude and direction are all pins here, which is why this beats building the same thing out of a raw Sin and a pile of position nodes.

Added to a distance field it displaces the surface, which is usually what you want. Multiplied into one it does something much harder to predict.

Pins

Pin Type Description
Frequency Number How many ripples fit in one world unit. Higher is tighter.
Amplitude Number How far the ripples swing above and below zero.
AxisX Number Which way the ripples travel, along X.
AxisY Number Which way the ripples travel, along Y.
AxisZ Number Which way the ripples travel, along Z.
Pin Type Description
Result Number The wave at this point, swinging between plus and minus the amplitude.

Studio and Graph › Voxel › Pattern

Spherical Gradient

A soft blob mask that needs no remapping: 1 at the centre, falling to 0 at a distance of 1.

Spherical Gradient node

The Spherical Gradient node

When to use it

A soft blob mask that needs no remapping: 1 at the centre, falling to 0 at a distance of 1.

That 1 is one world unit, which is tiny. Straight out of the box this node reads 0 almost everywhere and looks broken. Scale the domain to size it, because the falloff distance is fixed and there is no radius pin to change.

Good for localising an effect: noise only near a point, colour only around a landmark.

Pins

Pin Type Description
CenterX Number Where the middle sits along X.
CenterY Number Where the middle sits along Y.
CenterZ Number Where the middle sits along Z.
Pin Type Description
Result Number 1 at the middle, fading to 0 one unit out.

Studio and Graph › Voxel

Domain

Domain operations bend the space a field is sampled in: repeat it, mirror it, twist it or transform it, without touching the field itself.

Studio and Graph › Voxel › Domain

Domain Bend

Bends Source around Y, with the bend growing along X. A straight column becomes an arch.

Domain Bend node

The Domain Bend node

When to use it

Bends Source around Y, with the bend growing along X. A straight column becomes an arch.

Same warning as Domain Twist. Bending distorts the distances, and Smooth Union and the mesher both rely on those being roughly honest. A heavy bend shows up as uneven fillets and rough patches.

Bend for the big gesture, then model the detail after the bend rather than before it.

Pins

Pin Type Description
Source Number The thing to bend.
DegreesPerUnit Number Degrees of bend for every world unit along X.
Pin Type Description
Result Number Source, bent.

Studio and Graph › Voxel › Domain

Domain Mirror

Reflects Source across the chosen planes. Build half a shape, get the other half free.

Domain Mirror node

The Domain Mirror node

When to use it

Reflects Source across the chosen planes. Build half a shape, get the other half free.

Pins

Pin Type Description
Source Number The thing to mirror.
Pin Type Description
Result Number Source, mirrored.

Settings

Setting Type Description
Mirror X True/False Mirror left to right. Whatever you build on the positive X side is copied to the other side.
Mirror Y True/False Mirror front to back.
Mirror Z True/False Mirror top to bottom.

Studio and Graph › Voxel › Domain

Domain Repeat

Tiles the Source subgraph forever by folding the sample position into one cell. A single Sphere plus a small Domain Repeat is a whole field of spheres for the memory of one.

Domain Repeat node

The Domain Repeat node

When to use it

Tiles the Source subgraph forever by folding the sample position into one cell. A single Sphere plus a small Domain Repeat is a whole field of spheres for the memory of one.

Cell Z defaults to 0, and an axis with a cell of 0 does not tile at all. That is usually what you want for pillars standing on ground, and a surprise if you expected a 3D lattice.

The cell has to be bigger than the shape inside it. A shape wider than its cell gets sliced by the fold and the copies fuse into one slab. Pair it with Domain Warp so the grid does not read as a grid.

Pins

Pin Type Description
Source Number The thing to repeat.
CellX Number How far apart the copies sit along X. 0 means no repeat on this axis.
CellY Number How far apart the copies sit along Y. 0 means no repeat on this axis.
CellZ Number How far apart the copies sit along Z. 0 means no repeat on this axis.
Pin Type Description
Result Number Source, repeated.

Studio and Graph › Voxel › Domain

Domain Rotate

Rotates the coordinates before Source samples them, so any position-based pattern can be tilted or turned. Pitch turns around Y, Yaw around Z, Roll around X, all in degrees.

Domain Rotate node

The Domain Rotate node

When to use it

Rotates the coordinates before Source samples them, so any position-based pattern can be tilted or turned. Pitch turns around Y, Yaw around Z, Roll around X, all in degrees.

The patterns that need it are the ones with a direction baked in: Linear Gradient, Sine Wave, a 2D noise that only knows about XY. You cannot fix their orientation with vector maths further down the graph, because by then they have already been sampled.

Pins

Pin Type Description
Source Number The thing to turn.
Pitch Number Nose up and down, in degrees.
Yaw Number Turn left and right, in degrees.
Roll Number Tip side to side, in degrees.
Pin Type Description
Result Number Source, turned.

Studio and Graph › Voxel › Domain

Domain Scale

Stretches or squashes the coordinates before Source sees them. That is how you grow or shrink noise features, or any position-driven pattern, without touching the pattern itself.

Domain Scale node

The Domain Scale node

When to use it

Stretches or squashes the coordinates before Source sees them. That is how you grow or shrink noise features, or any position-driven pattern, without touching the pattern itself.

The multiply lands on the sample point, so a scale of 2 makes features half as big, not twice as big.

On a distance field it scales the distances too. A shape inside a scaled domain blends through Smooth Union with a different effective radius than the one you typed. When the exact distances matter, change the primitive's own Radius or Extent instead.

Pins

Pin Type Description
Source Number The thing to stretch or squash.
ScaleX Number Squash along X. Higher numbers make the pattern tighter, not bigger.
ScaleY Number Squash along Y. Higher numbers make the pattern tighter, not bigger.
ScaleZ Number Squash along Z. Higher numbers make the pattern tighter, not bigger.
Pin Type Description
Result Number Source, stretched or squashed.

Studio and Graph › Voxel › Domain

Domain Translate

Shifts the coordinates before the Source subgraph reads them, which moves whatever Source produces without reshaping it.

Domain Translate node

The Domain Translate node

When to use it

Shifts the coordinates before the Source subgraph reads them, which moves whatever Source produces without reshaping it.

Here is the part that catches everyone. The offset is added to the sample point, so the shape appears to go the other way. Type 100 into Translation X and the sphere slides 100 units toward negative X. Nudge it, look, then commit to a sign.

Worth reaching for when one subgraph has to appear in several places. Building the offset into a primitive's own Center X only works once.

Pins

Pin Type Description
Source Number The thing to move.
TranslationX Number Shift along X. The shape travels the opposite way from the number you type.
TranslationY Number Shift along Y. The shape travels the opposite way from the number you type.
TranslationZ Number Shift along Z. The shape travels the opposite way from the number you type.
Pin Type Description
Result Number Source, moved.

Studio and Graph › Voxel › Domain

Domain Twist

Twists Source around the vertical axis, with the rotation growing as you go up. A straight tower comes out a helix. Degrees Per Unit is how much turn each world unit of height adds.

Domain Twist node

The Domain Twist node

When to use it

Twists Source around the vertical axis, with the rotation growing as you go up. A straight tower comes out a helix. Degrees Per Unit is how much turn each world unit of height adds.

A hard twist shears the distance field. What was an exact distance becomes an overestimate, and the mesher answers with facets or holes through the twisted part. Keep the rate modest, or drop the voxel size to compensate.

Pins

Pin Type Description
Source Number The thing to twist.
DegreesPerUnit Number Degrees of twist for every world unit you climb.
Pin Type Description
Result Number Source, twisted.

Studio and Graph › Voxel › Domain

Domain Warp

Pushes the sample position around by a Warp signal before Source reads it. Noise fed into noise. It breaks up repetition and gives a field that drifting, organic look.

Domain Warp node

The Domain Warp node

When to use it

Pushes the sample position around by a Warp signal before Source reads it. Noise fed into noise. It breaks up repetition and gives a field that drifting, organic look.

Feed Warp from a second noise at a lower frequency than the one inside Source. Using the same noise for both just smears the pattern along itself.

The displacement is in world units, and the same value shifts all three axes together, so it slides the sample point along a diagonal. A Warp Strength anywhere near your feature size dissolves the shape completely. Start at a tenth of it.

Pins

Pin Type Description
Source Number The thing to push around.
Warp Number What does the pushing. Nearly always a noise node.
WarpStrength Number How hard the warp pushes. Too much and the shape tears itself apart.
Pin Type Description
Result Number Source, warped.

Studio and Graph › Voxel

Color

Colour fields and colour maths carried alongside the distance field.

Studio and Graph › Voxel › Color

Color Blend

Blends two colours by an Alpha. All four channels, so it is four Lerps in one node and they cannot drift out of step.

Color Blend node

The Color Blend node

When to use it

Blends two colours by an Alpha. All four channels, so it is four Lerps in one node and they cannot drift out of step.

Alpha here is the blend factor, not the alpha channel. The alpha channels have their own AA and BA pins and get blended along with the rest.

Good when the control is already a 0 to 1 mask. Height Gradient is the version that maps a raw range for you.

Pins

Pin Type Description
AR Number Red of colour A, what you get at Alpha 0.
AG Number Green of colour A.
AB Number Blue of colour A.
BR Number Red of colour B, what you get at Alpha 1.
BG Number Green of colour B.
BB Number Blue of colour B.
AA Number Alpha of colour A.
BA Number Alpha of colour B.
Alpha Number How far to mix, 0 for A and 1 for B. Nothing to do with the alpha channel, despite the name.
Pin Type Description
R Number Red of the mix.
G Number Green of the mix.
B Number Blue of the mix.
A Number Alpha of the mix.

Studio and Graph › Voxel › Color

Constant Color

One fixed colour, for the R/G/B/A inputs on Density to Mesh or a Paint node. The quickest way to give voxel output a solid colour without touching a material.

Constant Color node

The Constant Color node

When to use it

One fixed colour, for the R/G/B/A inputs on Density to Mesh or a Paint node. The quickest way to give voxel output a solid colour without touching a material.

When the colour should follow the shape, Height Gradient and Color Blend are the nodes that do that.

Pins

Pin Type Description
R Number Red.
G Number Green.
B Number Blue.
A Number Alpha.

Settings

Setting Type Description
Color Colour The colour.

Studio and Graph › Voxel › Color

HSV to RGB

Converts HSV back to RGB. Hue is in degrees from 0 to 360, saturation and value from 0 to 1.

HSV to RGB node

The HSV to RGB node

When to use it

Converts HSV back to RGB. Hue is in degrees from 0 to 360, saturation and value from 0 to 1.

The degrees are the trap. Feed a 0 to 1 hue in here, as though it were normalised, and you get one thin sliver of red instead of the spectrum you expected. Multiply by 360 first.

Values outside the range wrap, so a hue of 400 is a hue of 40.

Pins

Pin Type Description
H Number Hue, in degrees round the wheel. Go past 360 or below 0 and it wraps by itself.
S Number How strong the colour is, 0 to 1. Anything outside gets pulled back in.
V Number How bright it is, 0 to 1. Anything outside gets pulled back in.
AIn Number Alpha, 0 to 1. It comes out the far side untouched.
Pin Type Description
R Number Red, 0 to 1.
G Number Green, 0 to 1.
B Number Blue, 0 to 1.
A Number Alpha, exactly as it came in.

Studio and Graph › Voxel › Color

Height Gradient Color

Blends two colours by world height. Grass below, snow above, with no materials involved.

Height Gradient Color node

The Height Gradient Color node

When to use it

Blends two colours by world height. Grass below, snow above, with no materials involved.

Pins

Pin Type Description
LowR Number Red at the bottom of the range.
LowG Number Green at the bottom of the range.
LowB Number Blue at the bottom of the range.
LowA Number Alpha at the bottom of the range.
HighR Number Red at the top of the range.
HighG Number Green at the top of the range.
HighB Number Blue at the top of the range.
HighA Number Alpha at the top of the range.
LowHeight Number At or below this, you get the low colour with nothing mixed in.
HighHeight Number At or above this, you get the high colour with nothing mixed in.
Pin Type Description
R Number Red, mixed for this height.
G Number Green, mixed for this height.
B Number Blue, mixed for this height.
A Number Alpha, mixed for this height.

Studio and Graph › Voxel › Color

Hue Shift

Rotates the hue of an RGB colour and leaves saturation and value alone. Per-region biome variation from one base colour, without the round trip through HSV and back.

Hue Shift node

The Hue Shift node

When to use it

Rotates the hue of an RGB colour and leaves saturation and value alone. Per-region biome variation from one base colour, without the round trip through HSV and back.

Shift Degrees wraps at 360, so 370 and 10 give you the same colour.

When you need to change more than hue, the explicit RGB to HSV and HSV to RGB pair is the way.

Pins

Pin Type Description
R Number Red of the colour going in.
G Number Green of the colour going in.
B Number Blue of the colour going in.
AIn Number Alpha. It comes out the far side untouched.
ShiftDegrees Number How far round the colour wheel to spin, in degrees. It wraps, so 400 is the same as 40.
Pin Type Description
R Number Red after the spin.
G Number Green after the spin.
B Number Blue after the spin.
A Number Alpha, exactly as it came in.

Studio and Graph › Voxel › Color

RGB to HSV

Converts RGB to HSV so hue, saturation and value can be moved independently.

RGB to HSV node

The RGB to HSV node

When to use it

Converts RGB to HSV so hue, saturation and value can be moved independently.

That is the only sane way to build colour variation. Nudge R, G and B separately and you change brightness and hue together, and you end up chasing your own tail.

Pair it with HSV to RGB to convert back. Hue Shift is the shortcut when rotating hue is all you need. Alpha passes through untouched.

Pins

Pin Type Description
R Number Red, 0 to 1.
G Number Green, 0 to 1.
B Number Blue, 0 to 1.
AIn Number Alpha, 0 to 1. It comes out the far side untouched.
Pin Type Description
H Number Hue, in degrees round the wheel.
S Number How strong the colour is, 0 to 1.
V Number How bright it is, 0 to 1.
A Number Alpha, exactly as it came in.

Studio and Graph › Voxel › Color

Texture Sampler

Samples a 2D texture at the current world XY position with bilinear filtering. Hand-painted biome masks, splat maps, height ramps, anything easier to draw than to describe.

Texture Sampler node

The Texture Sampler node

When to use it

Samples a 2D texture at the current world XY position with bilinear filtering. Hand-painted biome masks, splat maps, height ramps, anything easier to draw than to describe.

Pins

Pin Type Description
Texture Texture The picture to read. It has to come from a Load Texture File node.
WorldSize Number How much ground the picture is stretched across, in world units.
CenterX Number Where the middle of the picture sits along X.
CenterY Number Where the middle of the picture sits along Y.
Pin Type Description
R Number Red of the pixel under this voxel.
G Number Green of the pixel under this voxel.
B Number Blue of the pixel under this voxel.
A Number Alpha of the pixel under this voxel.

Settings

Setting Type Description
Wrap True/False What happens past the edge of the picture. On, it tiles forever. Off, the edge pixels smear outwards in long streaks.

Studio and Graph › Voxel

Modification

Operations that reshape an existing field, such as offsetting or thickening its surface.

Studio and Graph › Voxel › Modification

Erosion

Slope-weighted fractal noise laid over a shape you already have. Rough highlights along cliffs and ridges, flat ground left mostly alone.

Erosion node

The Erosion node

When to use it

Slope-weighted fractal noise laid over a shape you already have. Rough highlights along cliffs and ridges, flat ground left mostly alone.

No water is involved and no valleys get carved. Hydraulic Erosion is the one that does that, at the cost of a full simulation on every compile. This is cheap enough to leave switched on while you work.

Save it for last. It roughens large forms. It cannot create them.

Pins

Pin Type Description
Density Number The shape you want roughed up.
Strength Number How much of the detail to add. Push it far and the surface breaks into noise instead of looking weathered.
Scale Number How big the bumps are.
Seed Whole Number Changes the pattern without changing anything else.
Octaves Whole Number How many layers of detail to pile on. Each one is finer than the last and costs a little more.
Lacunarity Number How much finer each layer gets.
Gain Number How much quieter each layer gets.
SlopeWeight Number How much the steep parts get over the flats. At 0 the detail lands evenly everywhere.
SedimentCapacity Number How much settles into the flat bits.
Pin Type Description
Result Number The same shape, roughed up.

Studio and Graph › Voxel › Modification

Hydraulic Erosion

Actual water erosion. At compile time it pulls a 2D heightmap out of the field above it, runs tens of thousands of simulated droplets down the slopes, and lets them carve valleys and drop sediment....

Hydraulic Erosion node

The Hydraulic Erosion node

When to use it

Actual water erosion. At compile time it pulls a 2D heightmap out of the field above it, runs tens of thousands of simulated droplets down the slopes, and lets them carve valleys and drop sediment. At runtime the eroded heights get sampled back into the density.

Pins

Pin Type Description
Density Number The landscape to run water over. It has to be height-based, something like noise minus Position Z.
Pin Type Description
Result Number The same landscape with valleys cut into it and sediment left in the low spots.

Settings

Setting Type Description
Resolution Whole number How fine the grid the water runs on is. Higher picks up narrower valleys, and costs you compile time and memory for it.
World Size Number How much ground the simulation covers, in world units, square. Make it smaller than the area you are actually generating and everything past the edge comes out uneroded.
World Center Vector 2D Where that square sits in the world.
Blend Margin Number How far past the edge the eroded ground fades back into the ground you fed in. Set it to 0 and the two meet in a step, which the mesher renders as a tall vertical wall right around the perimeter. The default is a tenth of World Size; widen it if the join still shows.
Num Droplets Whole number How many droplets get released. Too few and you get scattered scratches instead of a connected drainage pattern. More of them means a longer compile.
Max Droplet Lifetime Whole number How far one droplet is allowed to travel before it gives up. Raise it for long rivers, lower it for short gullies near the peaks.
Erosion Radius Whole number How wide a track each droplet cuts, in grid cells. Wider gives you smooth valleys, narrow gives you sharp channels.
Seed Whole number Changes where the droplets start. Same seed, same rivers, every time.
Inertia Number How much a droplet keeps its heading instead of turning downhill. At 0 it hugs the steepest line and rivers come out kinked; near 1 it coasts straight across dips and barely carves anything.
Sediment Capacity Factor Number How much a fast droplet can carry. Raise it for deeper carving.
Min Sediment Capacity Number The floor on that capacity, so a droplet crawling across a flat does not dump everything it is holding in one spot.
Erode Speed Number How quickly ground is cut away when a droplet has room for more.
Deposit Speed Number How quickly a droplet lets go of what it is carrying once it is overloaded.
Evaporate Speed Number How fast a droplet dries up. Higher gives you short streams near the peaks; lower lets them run all the way to the bottom.
Gravity Number How hard the slope pulls. It sets how much speed a droplet picks up on the way down.
Initial Water Volume Number How much water each droplet starts with.
Initial Speed Number How fast each droplet is already moving when it lands.

Studio and Graph › Voxel

Mesh

Bringing polygonal meshes into the voxel world and back out again.

Studio and Graph › Voxel › Mesh

Dynamic Mesh SDF

Turns a real mesh into a density field so it can take part in voxel booleans. Subtract a sculpted cave out of terrain, union a scanned rock into a cliff.

Dynamic Mesh SDF node

The Dynamic Mesh SDF node

When to use it

Turns a real mesh into a density field so it can take part in voxel booleans. Subtract a sculpted cave out of terrain, union a scanned rock into a cliff.

Pins

Pin Type Description
Mesh Mesh The mesh to turn into a field. Comes from a Load Mesh File node.
Pin Type Description
Result Number The mesh as a density field. Negative inside it, positive outside, zero on the skin.

Settings

Setting Type Description
Resolution Whole number How many voxels across the mesh's longest side. Higher keeps sharper detail. Cost climbs fast: doubling this is eight times the memory, so a face at 512 will eat gigabytes. Start at 64 and only go up when you can see the corners rounding off.
Inverted True/False Swap inside for outside. Pair it with a Subtraction downstream to punch the mesh's shape out of something else.

Studio and Graph › Voxel

Sculpt

Sculpting directly on the voxel field.

Studio and Graph › Voxel › Sculpt

Sculpt Density

Carve the voxel surface with brushes instead of describing every bump with maths. Add, Subtract, Clay, Smooth, Flatten, Grab, Pinch, Erase and more. Select the node to pick the tools up. Deselect i...

Sculpt Density node

The Sculpt Density node

When to use it

Carve the voxel surface with brushes instead of describing every bump with maths. Add, Subtract, Clay, Smooth, Flatten, Grab, Pinch, Erase and more. Select the node to pick the tools up. Deselect it and they go away.

Pins

Pin Type Description
Density Number The shape you are sculpting on. Leave it empty and you start from nothing.
Settings Voxel Settings Wants a Generate Settings node: blocky or smooth, how fine the voxels are, how far to look for the surface. Share one settings node with Density to Mesh and what you sculpt is exactly what you bake.
Pin Type Description
Density Number The shape with your strokes in it. Send it on to more density nodes, or to Density to Mesh when you want real geometry.

Settings

Setting Type Description
Composition Mode Choice How your strokes meet the shape underneath. Add piles them on top, Replace swaps them in wherever you touched, Max and Min keep whichever of the two is stronger or weaker.
Current Brush Text Which brush a click or a drag uses.
Brush Rate Number How many times a second the brush fires while you hold the button down. A single click always lands once. Crank it up and held strokes build much faster. Size, strength and falloff come from the viewport Brush controls, same as mesh sculpting.
Flatten Band Voxels Number Flatten brush. How thick a slab either side of the brush plane gets pulled flat, in voxels. Bigger reaches deeper in one pass.
Clay Lift Ratio Number Clay brush. How far above the surface to build, as a share of the brush radius. At 0 it fills up to the surface and no further. Raise it for a thicker slab per pass.
Noise Type Choice Noise brush. Which flavour of noise to stamp.
Noise Fractal Choice Noise brush. Layers of noise stacked on the basic pattern. None is one plain layer; the others pile several on for more detail.
Noise Octaves Whole number Noise brush. How many layers to stack. More layers, finer detail, more time per stroke.
Noise Frequency Number Noise brush. How big the pattern is in the world. Higher numbers give you tighter, finer wobble.
Noise Seed Whole number Noise brush. Change this for a different random pattern at the same settings.

Studio and Graph › Voxel

Paint

Painting values into the voxel field.

Studio and Graph › Voxel › Paint

Paint

Paints vertex colours straight onto the voxel surface. Paint, Texture, Smooth and Erase brushes. Density goes in one side and out the other untouched; only the colour channels change.

Paint node

The Paint node

When to use it

Paints vertex colours straight onto the voxel surface. Paint, Texture, Smooth and Erase brushes. Density goes in one side and out the other untouched; only the colour channels change.

Hand painting is for variation you cannot describe as a rule. Anything rule-based belongs in Height Gradient, Hue Shift or Color Blend, because those follow the shape when it changes and strokes do not.

It needs the same Generate Settings node as everything else. Feed the upstream density and colour into Density and R/G/B/A. Strokes save with the graph.

Pins

Pin Type Description
Density Number The shape. This node never touches it.
R Number Red coming in. Leave it empty and the surface starts white.
G Number Green coming in. Leave it empty and the surface starts white.
B Number Blue coming in. Leave it empty and the surface starts white.
A Number Alpha coming in. Leave it empty and everything is opaque.
Settings Voxel Settings Wants a Generate Settings node: blocky or smooth, how fine the voxels are, how far to look for the surface. Share one settings node with Density to Mesh and what you paint on is exactly what you bake.
Pin Type Description
Density Number The shape, exactly as it came in.
R Number Red with your paint in it.
G Number Green with your paint in it.
B Number Blue with your paint in it.
A Number Alpha with your paint in it. The alpha of the brush colour lands here.

Settings

Setting Type Description
Composition Mode Choice How your paint meets the colour underneath. Replace swaps it out where you touched, Add tints on top, Multiply darkens.
Current Brush Text Which brush a click or a drag uses.
Brush Rate Number How many times a second the brush fires while you hold the button down. A single click always lands once. Size, strength and falloff come from the viewport Brush controls, same as mesh sculpting.
Brush Color Colour The colour the Paint brush lays down.
Brush Texture Node Id Node picker The image the Texture brush stamps. The list holds every Load Texture File node in this graph, so drop one in first and it shows up here.
Texture World Size Number How big the image is on the surface, in world units. Bigger stretches it further, so the pattern repeats less often.
Texture Rotation Number Spin the image on the surface, in degrees.

Studio and Graph › Voxel

UV

UV generation for meshes produced from voxel fields.

Studio and Graph › Voxel › UV

Planar UV

Flat UVs for the voxel output. U comes from world X, V comes from world Z, both multiplied by Scale.

Planar UV node

The Planar UV node

When to use it

Flat UVs for the voxel output. U comes from world X, V comes from world Z, both multiplied by Scale.

Pins

Pin Type Description
Scale Number How often the texture repeats. Higher packs more copies into the same distance.
Pin Type Description
U Number The across coordinate, taken from world X.
V Number The up coordinate, taken from world Z.

Studio and Graph › Voxel

Generate

Generating geometry out of the field.

Studio and Graph › Voxel › Generate

Density To Mesh

Where a voxel graph stops being maths and becomes a mesh. Wire your field into Density, hang a Generate Settings node off Settings, press Generate Mesh. R/G/B/A and U/V are optional; wire them and ...

Density To Mesh node

The Density To Mesh node

When to use it

Where a voxel graph stops being maths and becomes a mesh. Wire your field into Density, hang a Generate Settings node off Settings, press Generate Mesh. R/G/B/A and U/V are optional; wire them and the result carries vertex colours and UVs.

Pins

Pin Type Description
Density Number The shape, as a field. Negative means inside, positive means outside, and the skin sits where it crosses zero.
R Number Red for the vertex colour, 0 to 1. Optional.
G Number Green for the vertex colour, 0 to 1. Optional.
B Number Blue for the vertex colour, 0 to 1. Optional.
A Number Alpha for the vertex colour, 0 to 1. Leave it alone and everything is opaque.
U Number U for the UVs. Optional.
V Number V for the UVs. Optional.
Settings Voxel Settings Wants a Generate Settings node. It decides blocky or smooth, how fine the voxels are and how much of the field gets built. Share one settings node with Voxel Sculpt and what you sculpted is what you bake. Collision and raytracing settings do nothing here.
Pin Type Description
Mesh Mesh The finished mesh, carrying colour and UVs if you wired those inputs. Goes into any mesh node from here.

Settings

Setting Type Description
Material Section Name Text What the mesh's one material slot gets called. Worth setting, or it shows up as "Section 0" everywhere you look at it later. Renaming it does not rebuild anything.

Studio and Graph › Voxel › Generate

Generate Settings

One node, wired into every voxel consumer in the graph. It carries the mesher choice, the voxel size, the ISO level and the volume that gets scanned.

Generate Settings node

The Generate Settings node

When to use it

One node, wired into every voxel consumer in the graph. It carries the mesher choice, the voxel size, the ISO level and the volume that gets scanned.

Pins

Pin Type Description
Settings Voxel Settings The settings, ready to plug into a Generate, Sculpt or Paint node.

Settings

Setting Type Description
Mesher Type Choice Blocky or smooth. Everything under Cubic applies to the first and everything under Dual Marching Cubes to the second; the details panel hides whichever one you are not using.
Setting Type Description
Cubic: Grid Size Whole number (X, Y, Z) How many voxels make up one chunk, per axis. Bigger chunks mean fewer of them and more work in each.
Cubic: Voxel Size Number How much world space one voxel covers, in centimetres. Halve it for twice the detail and roughly eight times the work.
Cubic: ISO Level Number The density value the mesher treats as the surface. Everything in this toolset - the primitives, the CSG nodes, the sculpt brushes - is written for 0, so leave it there unless the field is coming from somewhere else.
Cubic: Inverted True/False Swaps inside for outside: solid where the density is above the iso level instead of below it. The sculpt brushes follow it, so Add still adds.
Greedy Meshing True/False Merges neighbouring coplanar faces into single large quads instead of emitting one per voxel face. Far fewer triangles for the same blocky shape, and on by default.
Per Chunk Parallelization True/False Splits the meshing work inside a single chunk across threads. Off by default.
Setting Type Description
Dual Marching Cubes: Grid Size Whole number (X, Y, Z) How many voxels make up one chunk, per axis. Bigger chunks mean fewer of them and more work in each.
Dual Marching Cubes: Voxel Size Number How much world space one voxel covers, in centimetres. Halve it for twice the detail and roughly eight times the work.
Dual Marching Cubes: ISO Level Number The density value the mesher treats as the surface. Everything in this toolset - the primitives, the CSG nodes, the sculpt brushes - is written for 0, so leave it there unless the field is coming from somewhere else.
Dual Marching Cubes: Inverted True/False Swaps inside for outside: solid where the density is above the iso level instead of below it. The sculpt brushes follow it, so Add still adds.
Force Manifold True/False Runs the extra pass that resolves the cell configurations which would otherwise leave an edge shared by more than two faces. On by default, because most of what you would do next with the mesh refuses a non-manifold one.
Setting Type Description
Auto Fit Bounds True/False Find the shape on its own and build only where it actually is. On by default, and it saves you sizing a box by hand. It works by sniffing for the surface, which needs the field to behave like a distance. Multiply a density by 50 somewhere upstream and the sniffing goes wrong: patches of surface never get built and you get a mesh full of holes. Turn this off and give it a box when that happens, or when you only want a piece of a bigger field.
Search Extent Number How far out from the origin to look for the surface. Be generous. Empty space costs nothing here, and if your shape runs past this line it gets cut off flat at the edge. The node warns you when it hits the boundary.
Bounds Center Vector Where the box sits, when you are placing it yourself.
Bounds Extent Vector How big the box is from the middle out, when you are placing it yourself. What gets built is filled in whole tiles, so it can spill a little past the size you type.
Setting Type Description
Enable Raytracing True/False Builds raytracing data for the live preview. It has no bearing on the mesh Density to Mesh hands you.
Setting Type Description
Enable Collision True/False Builds collision for the live preview. Same as raytracing: the baked mesh does not carry it.
Collision Max LOD Whole number How far down the LOD chain to build collision. 0 is full detail only, which is nearly always what you want.
Async Collision True/False Cooks that collision on a worker thread so the preview does not stall while it finishes.

Studio and Graph

AI

AI-assisted nodes: generating and processing meshes with on-device and cloud models.

Studio and Graph › AI

Apply AI Mesh Data

Applies data an agent computed outside the app: vertex positions, a skeleton, skin weights, each read from a file. It is the graph-side other half of the getmeshvertices, getskeleton and getskinwei...

Apply AI Mesh Data node

The Apply AI Mesh Data node

When to use it

Applies data an agent computed outside the app: vertex positions, a skeleton, skin weights, each read from a file. It is the graph-side other half of the get_mesh_vertices, get_skeleton and get_skin_weights export tools. The agent reads the mesh, computes in Python or whatever it likes, writes a file, and this node wires the result back in.

One node covers all three. Leave a file path empty to skip that part. They are applied in a fixed order: deformation, then skeleton, then skin weights.

Vertex data has to be the whole set, in ascending vertex-id order, positions component-local, exactly as get_mesh_vertices wrote it. Hand it the wrong number of rows and it refuses and tells you both counts. Hand it the right number in the wrong order and it accepts without a murmur, every vertex takes somebody else's position, and the mesh comes out as noise.

Editing a file path or rewriting the file re-applies on its own. There is no button.

Pins

Pin Type Description
Mesh Mesh The mesh the data lands on. Normally the same one the agent read in the first place.
Pin Type Description
Mesh Mesh The mesh with whatever you pointed at applied to it.

Settings

Setting Type Description
Deformation File Text File holding one entry per vertex, in vertex order. Leave it blank to skip the deformation and pass the shape through untouched.
Deformation Format Choice How that file is written: readable JSON, or raw 32-bit floats.
Deformation Mode Choice Whether the numbers in the file are finished positions, or offsets to add to where each vertex already sits. Choose Absolute for a file of offsets and the mesh collapses towards the origin.
Skeleton File Text JSON file listing the bones: name, parent and transform. Leave it blank to skip the skeleton.
Skeleton Space Choice Whether each bone's transform in the file is measured against its parent or against the mesh itself. Pick the wrong one and the transforms stack down the chain, so the hand ends up somewhere out past the shoulder.
Skin Weights File Text JSON file saying which bones pull on each vertex and how hard. The mesh needs a skeleton first, either from the file above or from a rig upstream. Leave it blank to skip.

Studio and Graph › AI

Auto-Rig

Predicts a skeleton for a character mesh that arrived without one, using the UniRig model, and writes the bones onto the output mesh: names, parents and bind poses.

Auto-Rig node

The Auto-Rig node

When to use it

Predicts a skeleton for a character mesh that arrived without one, using the UniRig model, and writes the bones onto the output mesh: names, parents and bind poses.

It emits the skeleton and nothing else. The mesh still has no skin weights when it leaves this node, so it will not deform if you pose it. Auto-Skin is the second half of the pair.

The usual chain is Mesh, Auto-Rig, Auto-Skin: skeleton first, then the weights that bind to it.

Pins

Pin Type Description
Mesh Mesh The character mesh you want a skeleton for.
Pin Type Description
Mesh Mesh The same mesh, now carrying the predicted bones. No skin weights yet.

Settings

Setting Type Description
Backend Choice Where the model runs. DirectML uses your GPU and is far quicker; it drops back to the CPU on its own when the GPU cannot take it.
Seed Whole number The number behind every random choice in the prediction. Same number, same skeleton. Change it and you get a different one to compare against.
Sample True/False Let the model wander instead of always taking its safest guess. Off gives you the same tidy, symmetric skeleton every time. On finds extra joints now and then, and also gives you a stray bone in one arm that has no twin in the other. Re-roll with Seed if that happens.
Temperature Number How far the model is allowed to wander when placing joints. Higher is more adventurous and less predictable.
Top K Whole number Only consider this many of the model's best guesses at each step. 0 lets it consider all of them.
Top P Number Cuts off the long tail of unlikely guesses. Lower keeps the choice tighter and the skeleton closer to the safe answer.
Repetition Penalty Number Discourages the model from reusing joint positions it has already placed. 1 leaves it alone.
Candidates Whole number Predict the skeleton this many times and keep the one with the most joints, which in practice is the one where eyes and finger tips survived. Each extra attempt costs another full run. 1 is the quick pass.

Studio and Graph › AI

Auto-Skin

Works out a skin weight for every vertex against the skeleton the mesh is already carrying, and writes them back on, so the mesh deforms when you pose it.

Auto-Skin node

The Auto-Skin node

When to use it

Works out a skin weight for every vertex against the skeleton the mesh is already carrying, and writes them back on, so the mesh deforms when you pose it.

It needs bones to bind to. Anything with a skeleton will do: the output of Auto-Rig, or an imported skeletal mesh whose weights you want redone.

The pair reads Mesh, Auto-Rig, Auto-Skin: the first predicts the skeleton, the second binds the mesh to it, and what comes out the far end is rigged and skinned.

Pins

Pin Type Description
Mesh Mesh The mesh to skin. It needs a skeleton on it already, from Auto-Rig or an imported skeletal mesh.
Pin Type Description
Mesh Mesh The same mesh and skeleton, now with skin weights on every vertex.

Settings

Setting Type Description
Backend Choice Where the neural refinement runs. DirectML uses your GPU and is far quicker; it drops back to the CPU on its own when the GPU cannot take it.
Max Influences Whole number How many bones are allowed to pull on one vertex. Four is the usual budget for a game character.
Neural Refine True/False Clean up the plain distance-based binding with UniRig's skinning model. It sharpens the border between one bone's territory and the next, so an elbow creases instead of smearing. Needs the UniRig model pack. Asking for it is not the same as getting it. Without the pack the node still finishes, using the plain binding, and its completion line tells you which one you actually got.

Studio and Graph › AI

Body Pose Detection

Runs Meta's SAM 3D Body model over a photograph and hands back a complete character on one wire: vertices, triangles, UVs, a bone hierarchy, a bind pose and skin weights. It arrives posed the way t...

Body Pose Detection node

The Body Pose Detection node

When to use it

Runs Meta's SAM 3D Body model over a photograph and hands back a complete character on one wire: vertices, triangles, UVs, a bone hierarchy, a bind pose and skin weights. It arrives posed the way the person in the photo is standing.

That makes one image enough to get a body you can actually retarget onto. Turn Shape Strength down to get the neutral template build instead of the person's own, which is the easier one to fit clothing to.

Bodies only. Turning a photograph of an object into a mesh is a different pipeline with its own node.

Pins

Pin Type Description
Texture Asset The photo of the person to read.
Pin Type Description
Mesh Mesh The body it built: mesh, skeleton, skin weights and UVs, ready to pose.

Settings

Setting Type Description
Backend Choice Where the model runs. DirectML uses your GPU and needs DX12. On the CPU a single image takes 30 to 60 seconds. Falls back to the CPU on its own when DirectML is not available.
Shape Strength Number How much of the person's actual build to keep. 1 gives you their body shape as read from the photo. 0 gives you the neutral template body, which is the easier one to retarget onto.
Hand Pose Strength Number How much of the predicted finger pose to keep. 0 leaves the hands relaxed in the template's default pose.
Apply Per Limb Scale True/False Use the predicted limb proportions instead of the template's. Off by default, which is what the model's own reference pipeline does.
Recompute Normals True/False Rebuild smooth normals on the finished body so it shades cleanly. Turn it off when a remesh or normal-edit node further down the graph is going to redo them anyway.
Attach UVs True/False Give the body its stock UV layout. Turn it off if you intend to unwrap it yourself later.
Ground To Floor True/False Drop the body onto the ground so it does not float. One photo cannot tell how high off the floor someone is, so the predicted height is guesswork; this slides mesh and skeleton down together until the lowest vertex rests at zero. Turn it off to keep the raw placement the model produced.

Studio and Graph

Math

Scalar maths for driving other nodes: arithmetic, clamping, interpolation and comparisons on plain numbers.

Studio and Graph › Math

Clamp

Holds a value between a minimum and a maximum.

Clamp node

The Clamp node

When to use it

Holds a value between a minimum and a maximum.

Its job is making a computed setting safe before it drives a mesh node. A triangle budget derived from a measurement can legitimately come out at zero or at ten million, and clamping is how the graph stays inside the range you tested.

A node that clamps internally gives you no signal that the value was out of range. This one keeps the intent on the canvas where you can see it.

Set Min above Max and it publishes nothing and says so, rather than handing back Max for every input.

Pins

Pin Type Description
Value Number The number to keep in range. Leave it unwired and the panel value is used.
Min Number The floor. Leave it unwired and the panel value is used.
Max Number The ceiling. Leave it unwired and the panel value is used.
Pin Type Description
Result Number The number, pulled back inside Min and Max.

Settings

Setting Type Description
Value Number The number to keep in range. The Value pin overrides it.
Min Number The floor. Set it above Max and the node goes red instead of guessing.
Max Number The ceiling.

Studio and Graph › Math

Float

One floating-point number on a wire, so a single value can drive several nodes at once.

Float node

The Float node

When to use it

One floating-point number on a wire, so a single value can drive several nodes at once.

Whenever the same number has to appear in two places and stay in step - a tolerance, a strength, a resolution - this keeps it visible on the canvas. A details-panel value typed twice is not.

Wire it into any node setting that offers an override pin. That node's own property then stops being used, which is why a setting that ignores your edits usually has a wire on it.

Pins

Pin Type Description
Result Number The number. Wire it into any setting that has an override pin.

Settings

Setting Type Description
Value Number The number this node hands out.

Studio and Graph › Math

Int

A whole-number constant, for the counts and budgets that have to be integers: triangle targets, iteration counts, LOD levels, seeds.

Int node

The Int node

When to use it

A whole-number constant, for the counts and budgets that have to be integers: triangle targets, iteration counts, LOD levels, seeds.

It does the same job Float does, for the same reason. One place to change the number.

Reach for the int version where the consumer takes an int, so what arrives is the value you typed rather than something a float-to-int conversion rounded on the way.

Pins

Pin Type Description
Result Whole Number The number. Wire it into any setting that has an override pin.

Settings

Setting Type Description
Value Whole number The number this node hands out.

Studio and Graph › Math

Lerp (A to B)

Blends from A to B by Alpha. 0 gives you A, 1 gives you B.

Lerp (A to B) node

The Lerp (A to B) node

When to use it

Blends from A to B by Alpha. 0 gives you A, 1 gives you B.

Dial a computed setting between two values you trust, or drive one number from another node's normalised output.

Alpha is not clamped, on purpose, so anything outside 0 to 1 extrapolates past the endpoints. If that is not what you want, put a Clamp in front of the alpha rather than expecting this node to contain it.

Pins

Pin Type Description
A Number What you get at Alpha 0. Leave it unwired and the panel value is used.
B Number What you get at Alpha 1. Leave it unwired and the panel value is used.
Alpha Number How far along you are between A and B. Go past 0 or 1 and it keeps going.
Pin Type Description
Result Number A blended towards B.

Settings

Setting Type Description
A Number What you get at Alpha 0. The A pin overrides it.
B Number What you get at Alpha 1. The B pin overrides it.
Alpha Number How far along you are between A and B. Nothing stops you going past either end.

Studio and Graph › Math

Scalar Math (Add / Subtract / Multiply / Divide)

Adds, subtracts, multiplies or divides two numbers. This is how a graph computes a setting from another value instead of hard-coding it: half the source triangle count, twice the measured distance.

Scalar Math node

The Scalar Math node. Its title follows the operation you pick.

When to use it

Adds, subtracts, multiplies or divides two numbers. This is how a graph computes a setting from another value instead of hard-coding it: half the source triangle count, twice the measured distance.

Divide by zero is reported as a node error and publishes nothing, rather than emitting an infinity or a silent zero. An infinity travelling into a mesh operation as an edge length or a vertex budget would blow up there, and you would blame the mesh node.

When nothing is published, the consumer falls back to its own setting. That is what a downstream node quietly ignoring its wire looks like.

Pins

Pin Type Description
A Number The number on the left of the sum. Leave it unwired and the panel value is used.
B Number The number on the right of the sum. Leave it unwired and the panel value is used.
Pin Type Description
Result Number The answer.

Settings

Setting Type Description
Operation Choice Which sum to do with A and B.
A Number The number on the left of the sum. The A pin overrides it.
B Number The number on the right of the sum. The B pin overrides it.

Studio and Graph

Paint

Painting vertex data directly onto a mesh.

Studio and Graph › Paint

Paint Colours

Brush colour straight onto the mesh in the viewport. Select the node and the Paint tool takes over; deselect it and the tool goes away.

Paint Colours node

The Paint Colours node

When to use it

Brush colour straight onto the mesh in the viewport. Select the node and the Paint tool takes over; deselect it and the tool goes away.

Painting is for variation you cannot describe as a rule. Anything rule-based is better built from a mask and a maths node, because that follows the mesh when it changes and a stroke does not.

How to use it

  1. 1

    Connect a mesh

  2. 2

    Paint colours in the viewport

  3. 3

    Accept, and the painted mesh leaves the output pin

Pins

Pin Type Description
Mesh Mesh The mesh you want to paint.
Pin Type Description
Mesh Mesh Your painted mesh. Vertex colours are baked in, and anything you painted in texture mode rides along as the base colour map.

Studio and Graph

UV

Unwrapping, packing and editing UV layouts.

Studio and Graph › UV

Generate UVs

Builds a UV atlas for the mesh from scratch and packs it into the channel you pick. Two unwrappers are on offer: Patch Builder suits sculpted organic shapes, XAtlas copes better with scans and gene...

Generate UVs node

The Generate UVs node

When to use it

Builds a UV atlas for the mesh from scratch and packs it into the channel you pick. Two unwrappers are on offer: Patch Builder suits sculpted organic shapes, XAtlas copes better with scans and generated meshes that turn up with no UVs at all.

Whatever was in the chosen channel is replaced, seams and all. To change only the layout while keeping the unwrap, use Pack UVs instead.

How to use it

  1. 1

    Connect a mesh

  2. 2

    Pick an algorithm and its parameters

  3. 3

    Click Generate UVs

Pins

Pin Type Description
Mesh Mesh The mesh to unwrap.
Pin Type Description
Mesh Mesh The same mesh with a fresh UV layout in the chosen channel.

Settings

Setting Type Description
Method Choice Which unwrapper does the work.
UV Channel Whole number Which UV channel the new layout goes into. Whatever was in that channel is replaced, so point this at a spare channel if you want to keep the old one.
Setting Type Description
Initial Patch Count Whole number How many patches the surface is broken into before any merging happens. More patches means more, smaller islands in the finished layout.
Min Patch Size Whole number The fewest triangles a patch is allowed to hold. Raise it to stop odd triangles ending up as islands of their own.
Curvature Alignment Number How closely a growing patch sticks to surface that faces the same way. Higher pushes the cuts towards the places the shape already turns a corner.
Merging Threshold Number How much stretch you will accept in exchange for merging two patches into one island. Raise it for fewer, bigger islands and more distortion in them.
Max Angle Deviation Number How far apart two neighbouring patches may face and still be merged, in degrees. Drop it towards 30 to keep seams on the hard corners.
Smoothing Steps Whole number Smooths the surface direction before solving, which settles the island shapes down at the cost of a little more distortion.
Smoothing Alpha Number How much each of those smoothing steps moves things.
Pack Islands True/False Lays the finished islands out inside the 0-1 square. Switch it off and they stay where the solve put them, which usually means overlapping. XAtlas always packs, whatever this says.
Setting Type Description
Max Iterations Whole number How many passes XAtlas spends refining where the cuts go. Higher is tidier and slower.
Setting Type Description
Packing Resolution Whole number The texture size the layout is packed for. It turns the padding below from a pixel count into a real UV distance, so set it to whatever you will bake at.
Island Padding Whole number Blank space left between islands, in pixels of the resolution above. Too little and a bake bleeds across an island edge, or the low mips smear the shoulder into the ear. Patch Builder always leaves at least one pixel even at 0; XAtlas will pack flush.
Rotate Islands To Pack True/False Lets islands turn so they nest tighter. Switch it off to keep every island upright, which keeps checker squares square and the layout readable. You give up some coverage for that. Patch Builder only reads it while Pack Islands is on.

Studio and Graph › UV

Pack UVs

Repacks the UV islands of one channel into the unit square, moving only islands that already exist.

Pack UVs node

The Pack UVs node

When to use it

Repacks the UV islands of one channel into the unit square, moving only islands that already exist.

An atlas generated once is rarely laid out the way the asset finally needs it, and re-running Generate UVs to change the layout throws away the seams and the unwrap along with it. This is the step in between: same islands, same distortion, tighter arrangement.

It needs UVs to work with. On a mesh that has none, Generate UVs comes first.

How to use it

  1. 1

    Connect a mesh that already has UVs

    From Generate UVs, or an imported asset.

  2. 2

    Pick the channel, the resolution you will bake at and a gutter

  3. 3

    Optionally connect Weights to repack only the selected islands

  4. 4

    Click Pack UVs

Pins

Pin Type Description
Mesh Mesh The mesh to repack. It needs UVs in the chosen channel already - this node will not make them.
Weights Weight Map Optional. Repack only the islands this selection touches. Leave it empty to repack everything.
Resolution Whole Number Texture Resolution, taken from the graph instead of the details panel.
Gutter Whole Number Gutter Texels, taken from the graph instead of the details panel.
Pin Type Description
Mesh Mesh The mesh with the chosen channel repacked. The other channels come out untouched.

Settings

Setting Type Description
UV Channel Whole number Which UV channel to repack. The others come out untouched.
Pack Mode Choice How the islands get laid out.
Texture Resolution Whole number The size of the texture you plan to bake at. It turns the gutter below from a pixel count into a real UV distance, and it limits how small an island is allowed to get.
Gutter Texels Whole number Blank space left between islands, counted in pixels of the texture above. Set it too low and a bake bleeds across an island edge, or the low mips smear the shoulder into the ear. 2 to 4 is normal. Go higher when the texture will be seen mostly from a distance.
Allow Rotation True/False Lets islands turn so they nest tighter. Switch it off to keep every island the way you authored it, which keeps checker squares square and the layout readable. You give up some coverage for that.
Allow Flips True/False Lets islands mirror as well as turn. Buys a little more coverage and does no harm on symmetric detail, but any text or directional pattern painted into the texture will read backwards. Ignored while Allow Rotation is off.
Selection Threshold Number A vertex counts as selected once its weight reaches this. Only read when something is plugged into Weights.

Studio and Graph › UV

Texel Density

Measures, and optionally equalises, texel density across the UV islands of one channel. Texel density is texels per centimetre of surface: Resolution sqrt(UV area / 3D area).

Texel Density node

The Texel Density node

When to use it

Measures, and optionally equalises, texel density across the UV islands of one channel. Texel density is texels per centimetre of surface: Resolution * sqrt(UV area / 3D area).

Auto-unwrappers optimise for packing, not for this, so a generated atlas routinely gives a character's ear four times the texels per centimetre of the torso. That is invisible in the UV view and obvious the moment anything is baked or painted, which is why this is measured in numbers rather than eyeballed.

Normalising scales each island about its own UV centre, so islands can end up overlapping. Follow this node with Pack UVs in Preserve Relative Scale mode, which lays them out again without disturbing the density you just equalised. Fit To Unit Square below is the quick alternative when you only need the result inside the tile and do not care about overlap.

How to use it

  1. 1

    Connect a mesh that already has UVs

  2. 2

    Run in Measure Only and read the Result category

  3. 3

    Switch to a Normalise mode and run again

Pins

Pin Type Description
Mesh Mesh The mesh to measure. It needs UVs in the chosen channel already.
Weights Weight Map Optional. Work on only the islands this selection touches. Leave it empty for the whole mesh.
Resolution Whole Number Texture Resolution, taken from the graph instead of the details panel.
Target Density Number Target Texel Density in texels per centimetre, taken from the graph. Only read in Normalise To Target mode.
Pin Type Description
Mesh Mesh The mesh. Untouched in Measure Only, otherwise with the chosen channel's islands rescaled. The other channels come out untouched either way.

Settings

Setting Type Description
UV Channel Whole number Which UV channel to measure or rescale. The others come out untouched.
Mode Choice Report the numbers only, or rescale the islands as well.
Texture Resolution Whole number The texture size the density numbers are quoted against. Without it they mean nothing: the same UVs read 5 texels/cm at 512 and 20 at 2048. Set it to whatever you will actually bake at. Every density on this node is texels per centimetre in the app's own units.
Target Texel Density Number Texels per centimetre every island gets scaled to. 10.24 works out to 1024 texels per metre, which is where most game work starts. Centimetres means the app's own units, the same ones the viewport measures in. A mesh that was authored in metres and imported without a unit conversion reads a hundred times off, so check the scale before trusting the number.
Fit To Unit Square True/False After rescaling, shrink the whole layout as one piece so it lands back inside the tile. Every island moves by the same factor, so they stay equal to each other, but they are no longer the exact number you asked for. Off by default, since a Target run usually wants that exact number. Ignored while Weights is driving a selection: fitting only the islands you picked would centre that handful in the middle of the tile and park them on top of the ones you left alone.
Selection Threshold Number A vertex counts as selected once its weight reaches this. Only read when something is plugged into Weights. The selection grows out to whole islands first, because half an island has no density of its own.

Studio and Graph › UV

Transform UVs

Rotates, scales, offsets and flips the UVs of one channel, either across the whole mesh or on the islands a selection touches.

Transform UVs node

The Transform UVs node

When to use it

Rotates, scales, offsets and flips the UVs of one channel, either across the whole mesh or on the islands a selection touches.

The small manual correction that every unwrap eventually needs, and the only one of these operations that has no equivalent anywhere else in the graph: turning a strip upright so its texel grid lines up with the texture, nudging an island off a tile border, mirroring a decal, or scaling a channel into a UDIM tile.

The transform is applied in the order flip, scale, rotate about the pivot, then offset - which is the order that makes the numbers in the details panel mean what they say.

How to use it

  1. 1

    Connect a mesh that already has UVs

  2. 2

    Optionally connect Weights to limit the change to the selected islands

  3. 3

    Set rotation / scale / offset and click Apply

Pins

Pin Type Description
Mesh Mesh The mesh to transform. It needs UVs in the chosen channel already.
Weights Weight Map Optional. Move only the islands this selection touches. Leave it empty to move the whole channel.
Rotation Number Rotation in degrees, taken from the graph instead of the details panel.
Scale U Number Scale U, taken from the graph instead of the details panel.
Scale V Number Scale V, taken from the graph instead of the details panel.
Offset U Number Offset U, taken from the graph instead of the details panel. 1 moves a whole tile.
Offset V Number Offset V, taken from the graph instead of the details panel. 1 moves a whole tile.
Pin Type Description
Mesh Mesh The mesh with the chosen channel transformed. The other channels come out untouched.

Settings

Setting Type Description
UV Channel Whole number Which UV channel to transform. The others come out untouched.
Pivot Choice What the rotation, scale and flip happen around. Get this wrong and a rotation swings the island across the atlas instead of turning it on the spot.
Custom Pivot U Number U coordinate of the pivot point.
Custom Pivot V Number V coordinate of the pivot point.
Rotation Degrees Number Counter-clockwise rotation about the pivot, in degrees.
Scale U Number Scale along U about the pivot. 1 = unchanged.
Scale V Number Scale along V about the pivot. 1 = unchanged.
Offset U Number Slides the UVs along U, applied last. 1 moves a whole tile.
Offset V Number Slides the UVs along V, applied last. 1 moves a whole tile.
Flip U True/False Mirrors across the pivot's V axis. Anything directional in the texture, lettering above all, will read backwards afterwards.
Flip V True/False Mirrors across the pivot's U axis. Same backwards-texture catch as Flip U.
Selection Threshold Number A vertex counts as selected once its weight reaches this. Only read when something is plugged into Weights.
Affect Whole Islands True/False Grows the selection out to whole UV islands before transforming. Leave it on. An island is one continuous patch of texture, and moving half of it tears the patch open - which nothing in the viewport shows you until you bake. Turn it off only when you actually want to shear a region's UVs.

Studio and Graph › UV

UV Editor

The interactive 2D UV view. See one channel's islands in the tile grid, select them by click or marquee, and move, rotate and scale them by hand.

UV Editor node

The UV Editor node

When to use it

The interactive 2D UV view. See one channel's islands in the tile grid, select them by click or marquee, and move, rotate and scale them by hand.

Pins

Pin Type Description
Mesh Mesh The mesh to edit. It needs UVs in the chosen channel already - this node will not make them.
Pin Type Description
Mesh Mesh The mesh with your edits to the chosen channel. The other channels come out untouched.

Settings

Setting Type Description
UV Channel Whole number Which UV channel is shown and edited. The others come out untouched. A channel that is missing or empty is refused rather than created - run Generate UVs first.

Studio and Graph › UV

UV Seams

Edits UV seams - where the atlas is allowed to be cut - and re-solves only the islands that changed.

UV Seams node

The UV Seams node

When to use it

Edits UV seams - where the atlas is allowed to be cut - and re-solves only the islands that changed.

Generate UVs decides both the seams and the unwrap in one shot, and the only way to disagree with it today is to run it again with different settings and lose the whole layout. This node is the local alternative: cut or weld a seam where the result is wrong, re-unwrap the handful of islands that were touched, and leave every other island exactly where it is (see Preserve Island Bounds).

How to use it

  1. 1

    Connect a mesh that already has UVs

  2. 2

    Pick a mode; the selection modes need Weights connected

  3. 3

    Leave Re-unwrap on Conformal unless you have a reason not to

  4. 4

    Click Apply, then Pack UVs if the layout needs re-laying-out

Pins

Pin Type Description
Mesh Mesh The mesh to edit. It needs UVs in the chosen channel already.
Weights Weight Map The region to work on. The two selection modes will not run without it.
Angle Number Angle Threshold in degrees, taken from the graph. Only read in Add Seams By Angle mode.
Pin Type Description
Mesh Mesh The mesh with the chosen channel's seams edited and the affected islands unwrapped again. The other channels come out untouched.

Settings

Setting Type Description
UV Channel Whole number Which UV channel to edit. The others come out untouched.
Seam Mode Choice Cut new seams, carve a selection into its own island, or weld seams shut.
Angle Threshold Number How sharply the two faces of an edge have to meet before it becomes a seam. 60 catches hard corners. 30 also catches soft creases, and leaves you with a lot more islands to pack.
Unwrap Method Choice How the affected islands get their UVs worked out again after the edit.
Preserve Island Bounds True/False Drops each re-unwrapped island back into the space it already occupied, at its old aspect ratio. This is what keeps the edit local. A fresh unwrap comes back at some arbitrary size and position, so with this off the re-solved islands land on top of the rest of the atlas and you have to repack everything. Turn it off only when Pack UVs is next in the chain anyway.
Selection Threshold Number A vertex counts as selected once its weight reaches this. The two selection modes need it. In Add Seams By Angle it only limits the search to edges inside the selection, and searches the whole mesh when nothing is wired.

Studio and Graph › UV

View UVs

Renders a mesh's UV layout into a texture so you can actually look at it. Coloured islands, a texel-density heatmap or wireframe, with seam emphasis, overlap highlighting and UDIM tiles.

View UVs node

The View UVs node

When to use it

Renders a mesh's UV layout into a texture so you can actually look at it. Coloured islands, a texel-density heatmap or wireframe, with seam emphasis, overlap highlighting and UDIM tiles.

Pins

Pin Type Description
Mesh Mesh The mesh whose UV layout you want to look at.
Pin Type Description
Mesh Mesh The input mesh, unchanged.
Texture Asset The layout picture for the tile currently on show.

Settings

Setting Type Description
Resolution Whole number How big the picture comes out, in pixels. It is square, and you get one per UDIM tile.
UV Channel Whole number Which UV channel gets drawn.
Mode Choice What the picture shows: the islands, how evenly the texture is spread, or just the edges.
Island Coloring Choice A colour per island, or one colour for the lot.
Island Color Colour The colour every island is filled with when Island Coloring is on Single Color.
Background Choice What sits behind the layout.
Anti-Aliasing (SSAA) Whole number Renders larger and shrinks back down so the edges are not jagged. 2 is usually enough; 4 draws sixteen times the pixels to get there.
Draw Wireframe True/False Draws the triangle edges over the top of the fill.
Line Thickness Number How thick those edges come out, in pixels of the finished picture.
Emphasize Island Borders True/False Draws the island borders, which are the seams, twice as thick and brighter than the edges inside an island.
Draw Grid True/False Draws a faint grid every 0.1 of a tile, plus the border of the 0-1 square, so you can tell how far across the tile something sits.
Highlight Overlaps True/False Paints any pixel covered by more than one triangle bright magenta. Overlapping UVs bake on top of each other, and this is the quickest way to find where.
Distortion Contrast Number How hard the heatmap pushes the colours apart. Raise it to pick out small differences. Lower it when the whole mesh reads as red and blue with no green left in it.
Enable UDIM True/False Draws every tile the UVs reach instead of only the 0-1 square.
Max UDIM Tiles Whole number How many tile columns to look across, starting at 1001. UVs further right than that get folded back into the last column, so raise it if a tile you expect is missing. All ten rows are scanned either way.
Preview Tile Whole number Which UDIM tile to show, counting from the first one that has UVs in it.

Studio and Graph

Utility

Graph plumbing: grouping work into subgraphs and other helpers that shape the graph itself rather than the mesh.

Studio and Graph › Utility

Get Mesh Array Element

Pulls one mesh out of a Mesh Array by index and reports the array's length on a second output. This is the way back from batch work into ordinary single-mesh graphs. Wire the array in, drive Index ...

Get Mesh Array Element node

The Get Mesh Array Element node

When to use it

Pulls one mesh out of a Mesh Array by index and reports the array's length on a second output. This is the way back from batch work into ordinary single-mesh graphs. Wire the array in, drive Index from a Math node, and everything downstream sees a normal mesh.

It recomputes whenever the array or the index changes.

When the array's bytes are parked in the .mmgraph file, only the element you ask for gets pulled off disk and decompressed. Indexing into a forty-head array does not wake the other thirty-nine.

Pins

Pin Type Description
Array Mesh List The array to read out of.
Pin Type Description
Mesh Mesh The mesh you asked for, on a normal Mesh wire.
Count Whole Number How many meshes the array holds. Still correct even when Index points past the end.

Settings

Setting Type Description
Element Index Whole number Which mesh to read, counting from 0.

Studio and Graph › Utility

Mesh Array From Directory

Point it at a folder of mesh files, press Scan Directory, and the whole folder arrives on one wire instead of forty loaders. From there Get Mesh Array Element reaches in for one, or a headless -mmr...

Mesh Array From Directory node

The Mesh Array From Directory node

When to use it

Point it at a folder of mesh files, press Scan Directory, and the whole folder arrives on one wire instead of forty loaders. From there Get Mesh Array Element reaches in for one, or a headless -mmrun -mmin sweep processes the folder one file at a time.

Pins

Pin Type Description
Array Mesh List Every mesh in the folder on one wire, sorted the same way on every machine.
Count Whole Number How many slots the array has, empty ones included.
FailedCount Whole Number How many files would not import. Anything above zero means the batch is short.

Settings

Setting Type Description
Source Directory Text Full path to the folder you want to read. Nothing is ever written there.
Extension Filter Text Which file types to pick up, separated by semicolons and written without dots, like obj;fbx. Leave it empty to take everything readable. Upper or lower case makes no difference.
Recursive True/False Also look inside folders within the one you picked.
Max Files Whole number Stop after this many files. 0 means no limit. Worth setting when you are not certain whether that folder holds forty meshes or ten thousand.
Failure Policy Choice What happens when one file will not import.
Use T0 Pose True/False FBX only. Bring in the bind pose instead of the first frame of animation.
Coordinate System Choice Handedness the files were exported with. Pick the wrong one and every mesh arrives mirrored. OBJ and FBX only.
Front Axis Choice Which axis points forward in the source files. OBJ and FBX only.
Up Axis Choice Which axis points up in the source files. Get it wrong and the whole batch comes in lying on its side. OBJ and FBX only.
OBJ Sections From Choice Which statements split an OBJ into material sections. OBJ marks materials with usemtl, so parts that reuse one material - or name none - would otherwise arrive merged into a single section. OBJ only.

Studio and Graph › Utility

Reroute

A knot on a wire. Values pass through unchanged, so a long route can bend around other nodes. Purely visual: no cost, no copy, no effect on evaluation.

Reroute node

The Reroute node

When to use it

A knot on a wire. Values pass through unchanged, so a long route can bend around other nodes. Purely visual: no cost, no copy, no effect on evaluation.

Double-click an existing wire to drop one in place rather than adding it from the picker and re-wiring by hand.

Its pins start as wildcards and take on the type of whatever they are connected to, so wire colours stay correct and type checking stays exactly as strict as it would be without the knot. Remove the last wire and it goes back to wildcard.

Pins

Pin Type Description
Value Any Anything at all. The knot does not touch it.
Pin Type Description
Value Any Exactly what went in.

Studio and Graph › Utility

Subgraph

Collapses a group of nodes into one card so a big graph stays readable.

Subgraph node

The Subgraph node

When to use it

Collapses a group of nodes into one card so a big graph stays readable.

Settings

Setting Type Description
Subgraph Name Text What the group is called, on the card and in the breadcrumb trail across the top of the graph.

Studio and Graph

Weight Map

Creating, converting and combining weight maps - the 0..1 per-vertex masks that gate deformers, sculpting and Wrangle expressions.

Studio and Graph › Weight Map

Apply Weight Map

Blends two versions of the same mesh vertex by vertex, with a weight map deciding how far each vertex travels between them. Where the weight is 0 the vertex stays exactly where Mesh put it; where i...

Apply Weight Map node

The Apply Weight Map node

When to use it

Blends two versions of the same mesh vertex by vertex, with a weight map deciding how far each vertex travels between them. Where the weight is 0 the vertex stays exactly where Mesh put it; where it is 1 it lands exactly where Target has it; in between it slides along the straight line joining the two.

That makes it the universal way to make any deformation partial. Run whatever operation you like at full strength, feed the before into Mesh and the after into Target, and the weight map decides which parts of the model actually receive it. No operation needs its own masking option, because this one node masks all of them.

Both meshes have to have the same vertex count, in the same order. They will, as long as Target came from Mesh through operations that deform rather than retopologise. Anything that adds, removes or reorders vertices in between breaks the correspondence, and the pairing is by index, so the result is scrambled rather than refused.

How to use it

  1. 1

    Wire the original mesh into Mesh

  2. 2

    Wire the deformed version into Target

  3. 3

    Wire a weight map in, or paint one with Paint Weight Map

  4. 4

    The output updates as soon as any of the three changes

Pins

Pin Type Description
Mesh Mesh What you get where the weight is 0. Usually the mesh before the change.
Target Mesh What you get where the weight is 1. Needs the same vertex count and order as Mesh.
WeightMap Weight Map How far each vertex travels from Mesh toward Target. Leave it unwired and you get Mesh straight back.
Pin Type Description
Mesh Mesh Mesh pulled toward Target by the weights.

Settings

Setting Type Description
Strength Number Multiplies the whole weight map before blending. Push it above 1 to drive soft areas up to full effect; the result still stops at Target and never overshoots it.
Invert Weight Map True/False Flips the map before Strength is applied, so the area a mask was protecting becomes the only part that moves.

Studio and Graph › Weight Map

Create Weight Map

Where a weight map comes from when you are not painting it by hand. One value between 0 and 1 per vertex, derived from something the mesh already knows about itself, and from there it goes to Apply...

Create Weight Map node

The Create Weight Map node

When to use it

Where a weight map comes from when you are not painting it by hand. One value between 0 and 1 per vertex, derived from something the mesh already knows about itself, and from there it goes to Apply Weight Map or into any node that takes a Weights pin.

How to use it

  1. 1

    Connect the mesh the map is for

  2. 2

    Connect a selection or landmarks if the mode you want needs one

  3. 3

    Pick the mode and set its parameters

  4. 4

    The map updates as soon as any input changes

Pins

Pin Type Description
Mesh Mesh The mesh the weight map is built for. One value per vertex.
Weights Weight Map An existing mask, read only in From Selection mode. It comes through as it is, and Falloff Rings grow a soft fringe out from its edge.
Landmarks Landmarks Points and splines to measure distance from. Only read in From Landmarks mode.
Pin Type Description
Mesh Mesh The input mesh, unchanged.
WeightMap Weight Map The finished weight map, one 0-1 value per vertex.

Settings

Setting Type Description
Mode Choice Where the weights come from.
Default Value Number The value every vertex gets in Uniform mode.
Falloff Rings Whole number How many rings of vertices to fade over, growing outward from the edge of the mask. At 0 the edge is hard and you see it as a stair-step across the surface wherever the mask is used to blend.
Proximity Radius Number Distance at which the weight has faded to nothing. Only a vertex sitting right on a landmark gets a full 1, and it drops off evenly from there. Set it too small and you get a few bright specks instead of a usable mask.
Bone Name Text Which bone's skin weights to copy, spelled exactly. A * matches anything, so thigh_* picks up both thigh_l and thigh_r. Leave it empty and the map comes out all zeros, with a warning saying so.
Normalize To Max True/False Divides everything by the highest weight on the mesh, so the strongest vertex reads 1. Off by default, which gives you the bone's raw influence: already 0-1, but a bone that never fully owns any vertex then never reaches 1.
Invert True/False Flips the finished map, so 1 becomes 0 and 0 becomes 1.

Studio and Graph › Weight Map

Distortion Mask

Measures per-vertex stretch between two meshes that share vertex count and order, and hands you a 0 to 1 weight map. This is how you find the regions a conform, a wrap or a pose damaged, instead of...

Distortion Mask node

The Distortion Mask node

When to use it

Measures per-vertex stretch between two meshes that share vertex count and order, and hands you a 0 to 1 weight map. This is how you find the regions a conform, a wrap or a pose damaged, instead of hunting for them by eye.

How to use it

  1. 1

    Wire the mesh as it is now into Mesh, and the same mesh from before the damage into Target

  2. 2

    Press Measure

    Max Distortion in the details panel is in log units, so 0.69 means something on this mesh doubled in size.

  3. 3

    Wire Weights into Guided Delta Mush to relax the damage, or into a mask to look at it

Pins

Pin Type Description
Mesh Mesh The mesh as it is now, the one being measured. Passes straight through untouched.
Target Mesh The same mesh before whatever conform or wrap you suspect. Vertex count and order have to match.
DistortionRange Number How much change maps to a weight of 1.0, in log units; 0 is auto. Leave it unconnected to use the value in the details panel.
Pin Type Description
Mesh Mesh The input mesh, unchanged.
Weights Weight Map Distortion per vertex, scaled to 0-1. All zeroes when the two meshes match.
MaxDistortion Number The worst raw distortion on the mesh, in log units (0.69 is a doubling). Branch on this, not on the weight map, which is scaled and says nothing about how bad it actually got.
MeanDistortion Number Average raw distortion across the vertices that could be measured.
AboveThreshold Whole Number How many vertices went past Report Threshold.

Settings

Setting Type Description
Metric Choice What counts as distortion: change in edge length, or change in the area around each vertex.
Direction Choice Whether stretching, squashing or both show up in the mask.
Distortion Range Number How much change maps to a weight of 1.0, in log units. Zero means auto: scale against the worst vertex on this mesh, so the mask always fills the whole 0-1 range. Pin it to a number (0.69 is a doubling, 0.1 is a ten percent change) when you compare masks across several meshes, or a clean mesh's rounding noise ends up looking exactly like a torn mesh's tear.
Report Threshold Number Vertices whose raw, un-normalised distortion goes past this get counted on the Above Threshold pin. Same log units as Max Distortion.

Studio and Graph › Weight Map

Mesh Diff

Two meshes in, per-vertex distance out as a normalised weight map, with the minimum, maximum and average alongside it in the details panel. The first mesh passes through unchanged.

Mesh Diff node

The Mesh Diff node

When to use it

Two meshes in, per-vertex distance out as a normalised weight map, with the minimum, maximum and average alongside it in the details panel. The first mesh passes through unchanged.

How to use it

  1. 1

    Connect Mesh and Target

  2. 2

    Choose a Topology Mode

  3. 3

    Set the distance threshold and the display range

  4. 4

    Click Compare

  5. 5

    Send WeightMap into Apply Weight Map, Blend or Delta Mush to mask with it

Pins

Pin Type Description
Mesh Mesh The mesh being measured. The weight map is sized to this one.
Target Mesh The mesh it gets measured against.
Pin Type Description
Mesh Mesh The input mesh, unchanged.
WeightMap Weight Map Distance per vertex, scaled to 0-1. Dark where the two agree, bright where they part.

Settings

Setting Type Description
Topology Mode Choice How vertices get paired up between the two meshes.
Distance Threshold Number Anything further apart than this is counted in the Vertices Above Threshold readout. It only feeds that number. The weight map ignores it.
Max Display Distance Number The distance that comes out as a full weight of 1. Left at 0 it uses the biggest distance it found, which rescales the map on every run and makes two runs impossible to compare by eye. Type a real number in once you know your range.

Studio and Graph › Weight Map

Paint Weight Map

The hand-painted weight map. Select the node, brush the region you want onto the mesh in the viewport, and press Accept to publish it on the WeightMap pin.

Paint Weight Map node

The Paint Weight Map node

When to use it

The hand-painted weight map. Select the node, brush the region you want onto the mesh in the viewport, and press Accept to publish it on the WeightMap pin.

Reach for it when the region you need is a judgement call rather than something the mesh can be asked about. Create Weight Map covers everything derivable - curvature, landmark proximity, a bone's skin weights - and it re-derives itself when the mesh changes, which strokes cannot. Paint the ones only you can decide: which corner of a cloth is pinned, where a muscle attaches.

Brush size, strength and falloff come from the viewport Brush controls, the same ones mesh sculpting uses. Nothing leaves the node until you press Accept.

How to use it

  1. 1

    Connect the mesh you want to paint on

  2. 2

    Select the node to pick up the brush

  3. 3

    Paint the region in the viewport

  4. 4

    Press Accept to publish the map

Pins

Pin Type Description
Mesh Mesh The mesh the weight map is painted on. One value per vertex.
Pin Type Description
WeightMap Weight Map The painted 0-1 weight map. Wire it into a Cloth Object's Pin Map, a Flesh Attachment, or a Muscle's origin and insertion.

Studio and Graph › Weight Map

Threshold Weight Map

Turns a weight map into a hard 1 or 0. Everything that passes the test comes out at 1, everything else at 0.

Threshold Weight Map node

The Threshold Weight Map node

When to use it

Turns a weight map into a hard 1 or 0. Everything that passes the test comes out at 1, everything else at 0.

How to use it

  1. 1

    Connect a mesh and a weight map

  2. 2

    Set the threshold and comparison mode

  3. 3

    The output updates as soon as either changes

Pins

Pin Type Description
Mesh Mesh The mesh the weight map belongs to.
WeightMap Weight Map The soft weight map to cut up.
Pin Type Description
Mesh Mesh The input mesh, unchanged.
Weights Weight Map 1 on every vertex that passed the test, 0 everywhere else.

Settings

Setting Type Description
Threshold Number The value every vertex is measured against.
Selection Mode Choice Which side of the threshold passes.
Tolerance Number How far either side of the threshold still counts as equal. It starts almost at zero, so on a smooth gradient nothing passes until you widen it.

Studio and Graph › Weight Map

Weight Map Math

Combines weight maps: add, subtract, multiply, min and max, invert, remap, smooth, lerp, power. This is where a usable mask gets built out of the raw ones other nodes produce. Multiply a distortion...

Weight Map Math node

The Weight Map Math node

When to use it

Combines weight maps: add, subtract, multiply, min and max, invert, remap, smooth, lerp, power. This is where a usable mask gets built out of the raw ones other nodes produce. Multiply a distortion map by a hand-painted region to limit a repair. Invert a coverage map to select what is missing. Power a falloff to sharpen it.

Operations that need one map use input A. Smooth also needs the Mesh input, because smoothing follows mesh connectivity rather than index order, and without that wire it has no neighbours to average over.

The output updates on its own, so there is no button.

Two maps built against different meshes will not line up. Weights are stored per vertex and nothing checks that for you.

How to use it

  1. 1

    Connect weight map A, and B if the operation needs two

  2. 2

    For Smooth, also connect the Mesh input

  3. 3

    Choose an operation and set its parameters

  4. 4

    The output updates as soon as any input changes

Pins

Pin Type Description
A Weight Map The first weight map. Every operation reads this one.
B Weight Map The second weight map. Add, Subtract, Multiply, Min, Max and Lerp need it, and it has to come off the same mesh as A.
Mesh Mesh Only Smooth reads this, to spread values between neighbouring vertices. It has to be the mesh the map was built on.
Pin Type Description
Result Weight Map The finished weight map.

Settings

Setting Type Description
Operation Choice What to do with the maps.
Input Min Number Anything at or below this drops to 0.
Input Max Number Anything at or above this rises to 1. Drag it down close to Input Min and the gradient collapses into a hard on/off edge.
Iterations Whole number How many smoothing passes to run. Each one bleeds the values out another ring of vertices, so a high count washes a tight mask away entirely.
Factor Number 0 gives you A, 1 gives you B, halfway gives you the average.
Exponent Number Below 1 the mask fattens up and its soft edge spreads. Above 1 it shrinks back toward the bright core.

Studio and Graph › Weight Map

Weight Map Missing Vertices

Marks which parts of a source mesh are actually covered by a target mesh. Vertices with a close match come out at 1, vertices with none at 0, with a falloff in between.

Weight Map Missing Vertices node

The Weight Map Missing Vertices node

When to use it

Marks which parts of a source mesh are actually covered by a target mesh. Vertices with a close match come out at 1, vertices with none at 0, with a falloff in between.

How to use it

  1. 1

    Connect the mesh you want the mask for

  2. 2

    Connect the target, the mesh that may be missing regions

  3. 3

    Set the threshold and the falloff

  4. 4

    Click Compute

  5. 5

    Send the WeightMap into Apply Weight Map or any blend node

Pins

Pin Type Description
Mesh Mesh The mesh you want the mask for. The weight map is sized to this one.
Target Mesh The mesh to hunt for a matching surface on.
Pin Type Description
Mesh Mesh The input mesh, unchanged.
WeightMap Weight Map 1 where the target covers this mesh, 0 where it does not.

Settings

Setting Type Description
Distance Threshold Number How close the target surface has to be for a vertex to count as covered. Set it too tight and a body under clothing reads as missing everywhere the cloth floats off the skin.
Falloff Distance Number Extra distance past the threshold over which the weight fades out. Leave it at 0 and the mask edge follows the triangles, which shows up as a jagged line the moment you use it to blend.
Falloff Type Choice Shape of that fade.
Invert True/False Flips the map, so the missing areas come out at 1 instead.