Skinned MeshParts are live!
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.
Here are some examples:
Developer Starboard Studios was able to use skinned MeshParts together with the new upcoming surface appearance feature to create amazing visuals:
Skinned MeshParts can also make for some interesting squash and stretch animations:
This character can be seen in one of the first places to use skinned MeshParts, Frogge:
How do I make these skinned MeshParts?
Make sure you have a Studio build 0.452 or higher.
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 only support skinning with MeshParts.
1.When using the first three R15 import options, joints and geometry will get renamed as per the R15 spec.
2.The ‘Custom’ option can be used for non-R15/Rthro Models such as trees, birds, dragons, etc.
3.The triangle limits for the Avatar Importer are increased from a rig limit of 10k to 50k, and an individual mesh limit of 5k to 10k. That means each MeshPart mesh can not exceed 10k tris, and all the mesh in one import can not exceed 50k tris.
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 when 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?
If a MeshPart has a joint in its skinned mesh with the same name as the MeshPart, then that joint is driven by that MeshPart.
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. These are ideal for adding visual finesse such as rotating eyes or moving fingers.
Be careful as the movement of Bones does not affect Collision or Physics. If you need other Parts to follow the motion of the Bones, you can use the Lua API (linked below) to read a Bone’s TransformedWorldCFrame on RunService.Heartbeat.
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:
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.
How do I make content compatible with existing R15 animations?
S15 : R15 compatible,15 separate MeshParts that skin together.
Build the character as you would for R15 but skin the mesh to the joints in the authoring package. Use the ‘Rthro’, ‘Rthro Slender’ or ‘R15’ import setting. This will create a Humanoid based character that is backwards compatible with R15.
See S15_Lola_IPose.fbx as an example.
S1 : R15 compatible, 1 MeshPart.
Make sure you have the standard 15 joints named as per R15, except ‘HumanoidRootNode’ should be named ‘HumandoidRootPart’. Skin these to a single mesh. Use the ‘Custom’ import setting. This will create a Model that can be used to play current catalog R15 animations but on a single mesh.
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. You may also need to temporarily add a Humanoid to get the mesh to show skinned.
Known issues that will be fixed in future updates:
- When making changes to the mesh within a rig in script - eg. adding parts, changing textures or changing translucency, the rig may flicker back to the bind pose for a frame.
- 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” - or you can use this plugin: https://www.roblox.com/library/5861972252/ImportCustomAnim
to import a custom animation.
- When manually changing the meshId property of MeshParts in Studio, when going from rigid to skinned it’s possible for the mesh to get in a state where it’s no longer skinned. The work around is to add a Humanoid under the MeshPart’s parent Model. Once the mesh is showing skinned again, you can delete the Humanoid.
- When importing a rig where Parts match to joints, the Parts will all be connected to the root Part not their correct parent Part in the joint chain. The workaround is to recreate the correct connections in Studio. This will be fixed in a future update.
- 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. [ Update: this appears fixed with the latest dragger. ]
- If all the skinned MeshParts in a Model are hidden the whole Model becomes hidden. You can workaround this by setting transparency to 0.999. A fix is coming.
- Using the Custom option of the AvatarImporter does not create attachments for mesh named “…Att”. In most cases you can use the R15 options instead. It will be fixed shortly.
- It has been reported that skiined MeshParts are sometimes not rendering correctly in ViewPort frames.
Gotchas - things to be aware of:
- Skinned mesh deformation does not affect physics - it’s purely visual; collision geometry is not affected.
- Humanoid root movement is scaled based on HipHeight. You can disable this with the AutomaticScalingEnabled property of Humanoid.
- .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 animations in the .fbx file.
- The Custom option of the AvatarImporter no longer changes mesh names by removing “_Geo”, or skipping the first joint in the hierarchy. The was done to support a wider range of custom imports.