Skinned MeshPart Studio Beta
Update: This Studio Beta has been re-enabled. Several known issues have been fixed.
Please report new issues in the comments.
Developers,
We are pleased to announce the introduction of skinned MeshParts. Previously the appearance of characters and objects were represented by rigid parts. Now, the surface of those parts can be continuous making the mesh smoother and more realistic looking.
What does this look like?
The avatar on the right is a traditional rigid R15 Model. The avatar on the left is made up of 15 skinned MeshParts in the exact same R15 configuration - the main difference being the meshIds of the MeshParts. Notice how there are no gaps at the elbows, shoulders and knees. Also, notice how there is no longer intersection between the lower torso and the legs.
How do I get started?
Make sure you have a Studio build 0.445 or higher, and have enabled the beta feature:
How do I make these skinned MeshParts?
You can use any 3D modeling tool that supports linear skinning, and that can export information to the .fbx file format. FBX version 2014/2015 is known to work well. We support between 1 to 4 joint influences per vertex. Make sure you have the option to export skin weights set in the modeling tool.
How do I import these into Roblox Studio?
Currently, only the AvatarImporter will import skinned meshes. If there is skinning data with the mesh the engine will import it. MeshIds generated by importing skinned meshes can be used wherever MeshIds are used. However, we support skinning only with MeshParts.
Note when using the first three R15 import options, joints and geometry will get renamed as per the R15 spec.
The ‘Custom’ option can be used for non-R15/Rthro Models such as trees, birds, dragons, etc.
Note: the triangle limits for this Beta are increased from a rig limit of 10k to 50k and an individual mesh limit of 5k to 10k.
What controls which MeshParts smoothly join together?
If MeshParts are connected with Motor6Ds, Welds, BallSocketConstraints, HingeConstraints or WeldConstraint, and they are under the same Model instance, then the mesh will join provided that the meshes share joint names.
Can I make skinned accessories to work with rigid R15 parts?
Yes, as long as the rigid parts are part of a Humanoid Model. The accessory mesh needs to be skinned to joints named as per the R15 body parts. Eg. LeftUpperArm joint is where the left shoulder is. This is the same as the current convention for importing R15 Models.
How can Parts control the joints of a skinned MeshPart?
There are two ways this can happen:
- If a MeshPart has a joint in its skinned mesh with the same name as the part, then that joint is driven by that MeshPart.
- If a Part is in a Humanoid rig, and has a RigAttachment under it, then that Part and RigAttachment offset will drive the mesh joint with the same name as the Part.
Do you support Special Meshes/FileMeshes?
No, only MeshParts. Also, we are working on making R15 heads a MeshPart.
Can I control the joints of the mesh without MeshParts?
Yes, there is a new Instance type, Bone. These are created on import for any joint that does not have a matching named MeshPart. Be careful as the movement of Bones does not affect Collision or Physics. These are ideal for adding visual finesse such as rotating eyes or moving fingers.
Bones can be animated by playing back an animation through an Animator or Humanoid, or directly through the instance’s Lua API by changing Bone.Transform. See:
https://developer.roblox.com/en-us/api-reference/class/Bone
They are backwards compatible with existing animations, such as those for R15 parts, provided the Bone names match the animation’s Part names.
Is there a way to visualize Bones?
Yes, you can enable show constraint details:
Note: the Bones will only appear in the non-animated position. This helps to pick them, and to show the bind pose of the joints. It is planned for a later update to show the animated bones and their connections but through a different option in the debug rendering menu.
How do I make or import Animations?
Inside Roblox Studio, you can use the AnimationEditor to animate the MeshParts or Bones.
You can use the AnimationEditor import menu to import an animation in .fbx format:
Or, since the runtime animation format did not change you can use your existing animation creation path.
I already imported some skinned meshes using the AvatarEvolution Beta Build, will these still work?
Yes, but only if you load the place into Studio and save it out again. This will update the MeshParts to the latest format.
Known issues that will be fixed in future updates
- For skinned mesh to function correctly there has to be a Humanoid under the MeshPart parent’s Model. Without the Humanoid the mesh may not be skinned.
- MeshParts without a textureId, and a SurfaceAppearance, will have incorrect UV mapping.
The workaround is to put any texture id on the MeshPart.
The SurfaceAppearance will override that texture, so you will not see it - but it will prevent the distortion. - When scaling parts with Bones under them using the Studio scale widget, the Bone translations do not move, and the mesh will appear stretched or squashed. This can be corrected by manually moving the Bones, or running the script here: Bone scaling script. Or, scale on export instead.
- When importing animation using the AnimationEditor joint names are renamed as per the R15 spec. as there is no option to import as custom, and this may prevent Bones from animating if they were imported as custom in the AvatarImporter. Until this is addressed, joints in Custom skinned meshes should not contain the following suffixes: “_joint”, “_jnt”, “_jo”, “_jn”, “_jt”, “_locator”, “_loc”, “_lc”, “_lr”, “_lctr”, “_bone”, “_bnd”, “_bind”, “_bn”, “_bd”.
- There is an issue with culling of skinned meshes - they disappear at odd camera angles. At fix is being worked on.
Gotchas - things to be aware of
- .fbx files can contain multiple animations and the importer only reads the first one. If you are not seeing the animation you expect, check there are not multiple anims in the .fbx file.
- Humanoid root movement is scaled based on HipHeight. You can disable this with the AutomaticScalingEnabled property of Humanoid.
- Skinned mesh deformation does not affect physics - it’s purely visual. Collision geometry is not affected.