Roblox Cloth Physics: Bones, SmartBone 2, RopeConstraints, and What WrapDeformer Actually Does
Posted: Fri Oct 23, 2026 3:40 pm
Quick Summary
There is no Roblox feature called cloth physics. The engine moves a skinned mesh through bones, and it has no solver that takes a flat plane and drapes it over whatever is underneath it. Everything you have seen that looks like cloth is one of two things.
The first is a rig. A cape, a scarf, or a strand of hair is a MeshPart with a chain of bones running through it, and the bones are animated. When the movement is pre-made and played back from an animation, it reads as cloth in a video and as a rigid object in person.
The second is a simulation. The script creates a real physics part for every bone, ties the parts together with constraints, and then copies the resulting positions back onto the bones every frame. The mesh follows the bones, so the mesh moves like cloth. That is the whole trick, and it is why the bone count matters more than the texture.
Bones are non-rendered objects that drive the movement of parts for animation and for clothing and character work. Parenting one bone under another makes the child's world position relative to the parent, and the hierarchy changes how the mesh reacts during posing or animation. The Bone class reference is the place to check the exact wording, because bones are also what skinned meshes are weighted to.
The rig alone is usually enough for a single accessory. The simulation starts paying off when you want the same mesh to react to a player's own movement instead of a baked clip.
Three Ways to Build It
SmartBone is a module for dynamically simulated bones. To make a mesh simulate, select the MeshPart that has bones under it, add the tag "SmartBone", and add a string attribute called "Roots" containing the names of the bones you want to be roots, separated by commas. An object with several roots reads "Root1,Root2,Root3", with no spaces and no stray characters. The module is then started once from a script, and pressing Play starts the simulation. The full attribute list is on the SmartBone documentation page.
Everything else is optional attributes on the MeshPart. The ones that matter in practice:
Colliders, when you need them, are any object tagged "SmartCollider". A ColliderKey on both the SmartBone object and the collider restricts collisions to matching keys, and ColliderShape picks between Box, Capsule, Cylinder, and Sphere, otherwise the shape is inferred. Two helpers exist for this: the Collider Creator plugin is free, and the SmartBone Editor costs 150 Robux.
The Script-Only Route
The free script that has been circulating since 2023 shows the underlying approach. The author's mesh had 110 bones, which is the honest scale of the problem. The script splits the bones into columns and rows, creates a part for each bone, connects the parts with RopeConstraint links, and then on every RunService Heartbeat writes each bone's WorldPosition back from its physical part. The parts themselves are unanchored and the first bone in each column is anchored so the chain has something to hang from. The full script and the mesh are attached to the cloth physics simulation thread.
Two things about that thread are worth reading closely. A reply suggests driving the bones with CFrame instead of position, and the author's answer is that parts mostly spin like crazy and the mesh deforms when you do it that way. Another reply points out the code could be tightened, and the author agrees it was written ten months earlier and had not been touched since. Take the technique, not the code.
A more recent from-scratch build describes the same ideas with different vocabulary: verlet integration, distance constraints, bending constraints, wind forces, capsule collision, and a wetness state that lowers stiffness and reduces wind influence. The author's note is that it was built to explore how secondary motion systems work, not as a game feature, and the procedural hair simulation thread is worth reading for the constraint math alone.
What WrapDeformer Is For, and What It Is Not
WrapDeformer is a low resolution cage mesh paired with a WrapTarget sibling that deforms a parent MeshPart. The geometry moves according to the displacement between pairs of cage vertices, and the pairs are matched by UV equivalence. It is similar to WrapLayer but does not require layered clothing, so it can deform a plain MeshPart for publishing. That is all in the WrapDeformer class reference.
The live path is SetCageMeshContent with an EditableMesh, which deforms the rendered mesh while keeping the skinning and FACS pose data intact. The CageMeshId property is deprecated in favour of CageMeshContent, and the UV coordinates of the two cages have to match even when the vertex counts and topology differ. GetDeformedCFrameAsync returns a CFrame displaced by the same field, which is the documented way to place accessories on a deformed mesh.
Here is where people get it wrong: a WrapDeformer deforms. It is not a solver and it does not simulate. If you want a cape to sway, you drive the bones. If you want a banner to tear or a character to morph into a different shape, you drive the cage. The announcement thread's own blend shape example is about morphing between shapes, and the community responses there are largely about how unsettling the morphs look, which is a fair warning about using it for faces.
Comparing the Approaches
The boards here do not support table BBCode, so the comparison is a bullet list, one row per approach.
The practical gap is still secondary motion on player avatars. Rigged accessories already exist and layered clothing already wraps a body through inner and outer cages, but nothing in the engine makes a sleeve lag behind an elbow or a ponytail trail behind a sprint without someone building it.
WrapDeformer is the piece that changed the conversation, because it lets a script deform a fully rigged and skinned mesh without losing the skinning, which is what a blend shape workflow needed. SmartBone 2 is the piece that made bone physics a reasonable thing to ship, because it handles the parts that kill these projects in practice, the frustum culling, the distance throttling, and the collisions. The remaining work is authoring and tuning, which is not a small thing but is a known one.
FAQ
Is there a built-in Roblox cloth physics feature?
No. Roblox has bones and skinned meshes, and it has the WrapDeformer API for cage based deformation, but there is no cloth solver that drapes a mesh over a body or an object. Anything that looks like cloth is a rig, a module, or a script.
What is the easiest way to make a cape move in Roblox Studio?
Rig the cape as a MeshPart with a bone chain, then add the SmartBone tag and a Roots attribute naming the anchor bones. Press Play and it simulates. Add ActivationDistance and axis limits to stop it clipping and to keep the cost down.
Does WrapDeformer make cloth?
No. WrapDeformer deforms a MeshPart from a cage mesh, and it is designed for shape changes like blend shapes or morph targets. It keeps skinning weights and FACS pose data intact, which is what makes it useful, but it does not simulate motion on its own.
SmartBone or WrapDeformer, which one do I need?
Bones that sway and react to movement need SmartBone or your own bone solver. A mesh that changes shape, a character morph, or an accessory that has to follow a deformed body needs WrapDeformer. They are not alternatives.
How many bones does a cloth mesh need?
More than feels reasonable. The free cloth script ran on a mesh with 110 bones, and the SmartBone benchmark scene ran over 100 simulated hair objects at more than 350 frames per second unlocked, which is a measure of the solver and not of what a low end phone will hold. Start low, then add bones until it stops looking stiff.
Why does my cloth simulation not work after I move the object?
The SmartBone documentation states that re-parenting a SmartBone object can cause a lag spike, and that if you parent it to nil and then back it no longer simulates. Remove the SmartBone tag and add it again to restart it.
Why does it look fine in Studio and bad in a live server?
The SmartBone author measured live performance at 2 to 3 times better than Studio, so the difference can go either way. Check whether the simulation is running on the client or the server, and check ActivationDistance, because a live server has more players in range and Studio usually has one.
Sources
- Roblox has no built-in cloth solver, so cloth, hair, and capes move either through rigged bones or through a hand-rolled physics script
- WrapDeformer deforms a mesh from a low resolution cage and is meant for shape changes, not for swaying
- SmartBone 2 is the most widely used community module for bone driven physics, with a free Collider Creator plugin and a paid editor
- A pure Luau cloth script needs bones, unanchored parts, RopeConstraint links, and a Heartbeat loop that writes back to the bones
- Run the simulation on the client, cap the distance where it stops, and start with a small bone count
There is no Roblox feature called cloth physics. The engine moves a skinned mesh through bones, and it has no solver that takes a flat plane and drapes it over whatever is underneath it. Everything you have seen that looks like cloth is one of two things.
The first is a rig. A cape, a scarf, or a strand of hair is a MeshPart with a chain of bones running through it, and the bones are animated. When the movement is pre-made and played back from an animation, it reads as cloth in a video and as a rigid object in person.
The second is a simulation. The script creates a real physics part for every bone, ties the parts together with constraints, and then copies the resulting positions back onto the bones every frame. The mesh follows the bones, so the mesh moves like cloth. That is the whole trick, and it is why the bone count matters more than the texture.
Bones are non-rendered objects that drive the movement of parts for animation and for clothing and character work. Parenting one bone under another makes the child's world position relative to the parent, and the hierarchy changes how the mesh reacts during posing or animation. The Bone class reference is the place to check the exact wording, because bones are also what skinned meshes are weighted to.
The rig alone is usually enough for a single accessory. The simulation starts paying off when you want the same mesh to react to a player's own movement instead of a baked clip.
Three Ways to Build It
- Bones plus animation. Rig the mesh in Blender, export it, import it into Studio, and play animation clips on the bone tree. Cheapest to run and the most predictable. SmartBone 2 added support for animating root bones and for animating any bone in a tree, which is what makes this a live option rather than a dead one. See the SmartBone 2 release thread.
- Bones plus a module. Drop a SmartBone object into the game and let the module solve the motion for you. This is the shortest path to something that looks right.
- Bones plus your own solver. Full control, no dependency, and the most places to get the math wrong. This is what the older free scripts do and what the newer from-scratch simulations do.
SmartBone is a module for dynamically simulated bones. To make a mesh simulate, select the MeshPart that has bones under it, add the tag "SmartBone", and add a string attribute called "Roots" containing the names of the bones you want to be roots, separated by commas. An object with several roots reads "Root1,Root2,Root3", with no spaces and no stray characters. The module is then started once from a script, and pressing Play starts the simulation. The full attribute list is on the SmartBone documentation page.
Everything else is optional attributes on the MeshPart. The ones that matter in practice:
- Constraint as a string, choosing between Spring, Distance, and Rope. Spring pulls the bone back toward its rest position, Distance keeps bones a fixed distance apart, and Rope only caps the distance at the rest length and lets the bones hang.
- Damping, Stiffness, Inertia, Elasticity. How much motion is slowed, how much of the original CFrame is preserved, how much of the object's own movement is ignored, and how hard the bone is pulled back.
- Gravity and Force as Vector3 values in world space, with Force added on top of Gravity. Per-bone versions of both exist for a single strand that should behave differently from the rest, documented on the per bone attributes page.
- WindInfluence plus a WindType of Sine, Noise, or Hybrid, and either MatchWorkspaceWind set true to follow workspace.GlobalWind or Lighting attributes for WindDirection and WindSpeed. The docs describe WindStrength as the density of the air and WindSpeed as the amplitude, which is backwards from how most people read those two words, so test it rather than assume it.
- AnchorDepth sets how far down from the root bones get anchored, and AnchorsRotate decides whether the root bones hold position only or also follow the rotation of the chain.
- UpdateRate, ActivationDistance, ThrottleDistance. The simulation rate in frames per second, the distance in studs at which simulation stops, and the distance at which the rate starts dropping. These three are your performance dials, and ActivationDistance is the one that saves you.
Colliders, when you need them, are any object tagged "SmartCollider". A ColliderKey on both the SmartBone object and the collider restricts collisions to matching keys, and ColliderShape picks between Box, Capsule, Cylinder, and Sphere, otherwise the shape is inferred. Two helpers exist for this: the Collider Creator plugin is free, and the SmartBone Editor costs 150 Robux.
The Script-Only Route
The free script that has been circulating since 2023 shows the underlying approach. The author's mesh had 110 bones, which is the honest scale of the problem. The script splits the bones into columns and rows, creates a part for each bone, connects the parts with RopeConstraint links, and then on every RunService Heartbeat writes each bone's WorldPosition back from its physical part. The parts themselves are unanchored and the first bone in each column is anchored so the chain has something to hang from. The full script and the mesh are attached to the cloth physics simulation thread.
Two things about that thread are worth reading closely. A reply suggests driving the bones with CFrame instead of position, and the author's answer is that parts mostly spin like crazy and the mesh deforms when you do it that way. Another reply points out the code could be tightened, and the author agrees it was written ten months earlier and had not been touched since. Take the technique, not the code.
A more recent from-scratch build describes the same ideas with different vocabulary: verlet integration, distance constraints, bending constraints, wind forces, capsule collision, and a wetness state that lowers stiffness and reduces wind influence. The author's note is that it was built to explore how secondary motion systems work, not as a game feature, and the procedural hair simulation thread is worth reading for the constraint math alone.
What WrapDeformer Is For, and What It Is Not
WrapDeformer is a low resolution cage mesh paired with a WrapTarget sibling that deforms a parent MeshPart. The geometry moves according to the displacement between pairs of cage vertices, and the pairs are matched by UV equivalence. It is similar to WrapLayer but does not require layered clothing, so it can deform a plain MeshPart for publishing. That is all in the WrapDeformer class reference.
The live path is SetCageMeshContent with an EditableMesh, which deforms the rendered mesh while keeping the skinning and FACS pose data intact. The CageMeshId property is deprecated in favour of CageMeshContent, and the UV coordinates of the two cages have to match even when the vertex counts and topology differ. GetDeformedCFrameAsync returns a CFrame displaced by the same field, which is the documented way to place accessories on a deformed mesh.
Here is where people get it wrong: a WrapDeformer deforms. It is not a solver and it does not simulate. If you want a cape to sway, you drive the bones. If you want a banner to tear or a character to morph into a different shape, you drive the cage. The announcement thread's own blend shape example is about morphing between shapes, and the community responses there are largely about how unsettling the morphs look, which is a fair warning about using it for faces.
Comparing the Approaches
The boards here do not support table BBCode, so the comparison is a bullet list, one row per approach.
- Rigged bones, no simulation: lowest cost, fully predictable, cannot react to a player's own movement. Source is your own animation clips.
- Rigged bones plus SmartBone 2: simulates motion and collisions, needs the tag and Roots attribute, needs ActivationDistance set. Source is the SmartBone module and its docs.
- Rigged bones plus your own Luau solver: no dependency, full control, most places to get the math wrong, client only in practice. Source is the free cloth script and the hair simulation thread.
- WrapDeformer plus EditableMesh: deforms a mesh from a cage and keeps the skinning, so it suits shape changes and morph targets. Source is the WrapDeformer API and the announcement thread.
- Rigid accessory with no bones at all: attaches to a single point and never moves. Cheap, and it is the wrong answer for cloth.
- Model the mesh in Blender or Maya and rig it with a chain of bones. One bone per point you want to move independently, plus one at the anchor.
- Name the bones with a consistent scheme. The free script parses the name to work out which row and column a bone belongs to, so a naming convention is not cosmetic, it is load bearing.
- Import into Studio as a Model or MeshPart. Layered clothing goes through the Accessory Fitting Tool, which converts the mesh and generates the correct Accessory hierarchy, attachments, and AccessoryType.
- Add the SmartBone tag and the Roots attribute. Press Play and watch it move.
- Set ActivationDistance before you do anything else. A cape simulating for a player standing 200 studs away is wasted work.
- Tune constraints and limits until it stops clipping, then lower the bone count and re-test. Fewer bones with better limits beat more bones with worse limits.
- Test in a live server, not only in Studio. The SmartBone author reports that live performance is commonly 2 to 3 times better than Studio, so a number you measure in Studio is not the number your players get. The benchmark scene in the SmartBone 1 thread ran over 100 simulated hair objects at more than 350 frames per second unlocked.
- Simulate on the client. The free script's author ran it on both server and client and says it is not recommended on the server.
- Use ActivationDistance and ThrottleDistance before you reach for fewer bones.
- Prefer axis limits over colliders wherever a limit gives the same result.
- Do not parent a SmartBone object to nil and back. The module documents that the object stops simulating, because Roblox does not expose a Destroying signal for it. Remove the tag and add it again instead.
- Scale the bone count to the camera. The free script's author notes that you can improve performance by not simulating cloth far away and by decreasing the number of bones.
- Treat the bone hierarchy as part of the asset. Both the free script and the SmartBone documentation warn that a poorly rigged model gives poor results no matter how good the solver is.
The practical gap is still secondary motion on player avatars. Rigged accessories already exist and layered clothing already wraps a body through inner and outer cages, but nothing in the engine makes a sleeve lag behind an elbow or a ponytail trail behind a sprint without someone building it.
WrapDeformer is the piece that changed the conversation, because it lets a script deform a fully rigged and skinned mesh without losing the skinning, which is what a blend shape workflow needed. SmartBone 2 is the piece that made bone physics a reasonable thing to ship, because it handles the parts that kill these projects in practice, the frustum culling, the distance throttling, and the collisions. The remaining work is authoring and tuning, which is not a small thing but is a known one.
FAQ
Is there a built-in Roblox cloth physics feature?
No. Roblox has bones and skinned meshes, and it has the WrapDeformer API for cage based deformation, but there is no cloth solver that drapes a mesh over a body or an object. Anything that looks like cloth is a rig, a module, or a script.
What is the easiest way to make a cape move in Roblox Studio?
Rig the cape as a MeshPart with a bone chain, then add the SmartBone tag and a Roots attribute naming the anchor bones. Press Play and it simulates. Add ActivationDistance and axis limits to stop it clipping and to keep the cost down.
Does WrapDeformer make cloth?
No. WrapDeformer deforms a MeshPart from a cage mesh, and it is designed for shape changes like blend shapes or morph targets. It keeps skinning weights and FACS pose data intact, which is what makes it useful, but it does not simulate motion on its own.
SmartBone or WrapDeformer, which one do I need?
Bones that sway and react to movement need SmartBone or your own bone solver. A mesh that changes shape, a character morph, or an accessory that has to follow a deformed body needs WrapDeformer. They are not alternatives.
How many bones does a cloth mesh need?
More than feels reasonable. The free cloth script ran on a mesh with 110 bones, and the SmartBone benchmark scene ran over 100 simulated hair objects at more than 350 frames per second unlocked, which is a measure of the solver and not of what a low end phone will hold. Start low, then add bones until it stops looking stiff.
Why does my cloth simulation not work after I move the object?
The SmartBone documentation states that re-parenting a SmartBone object can cause a lag spike, and that if you parent it to nil and then back it no longer simulates. Remove the SmartBone tag and add it again to restart it.
Why does it look fine in Studio and bad in a live server?
The SmartBone author measured live performance at 2 to 3 times better than Studio, so the difference can go either way. Check whether the simulation is running on the client or the server, and check ActivationDistance, because a live server has more players in range and Studio usually has one.
Sources
- Roblox Creator Hub, Bone class reference
- Roblox Creator Hub, WrapDeformer class reference
- Roblox Creator Hub, Accessory Fitting Tool documentation
- Roblox Developer Forum, Introducing the new WrapDeformer instance
- SmartBone 2 documentation, SmartBone attributes and constraints
- SmartBone 2 documentation, per bone attributes
- SmartBone 2 documentation, setup, axis limits, colliders
- Roblox Developer Forum, SmartBone 2 release thread
- Roblox Developer Forum, SmartBone 1 release thread
- Roblox Developer Forum, cloth physics simulation script and discussion
- Roblox Developer Forum, procedural hair simulation
- Roblox Creator Hub, Collider Creator plugin (free)
- Roblox Creator Hub, SmartBone Editor plugin (150 Robux)