PhysBone
Get PhysBone on the Creator Store
PhysBone adds secondary motion to skinned meshes in Roblox. Hair sways when a character turns, tails swing behind them, capes and flags ripple in the wind, and ears bounce when they land. You set it up once in Studio, and it runs by itself in your game with no scripting needed.
IMPORTANT: PhysBone is on Release Sale for US$4.99! On November 5th it will increase to the normal price of US$9.99
What it does
-
Reacts to movement. Bones lag behind, swing and settle as the object moves and turns, with control over how bouncy, stiff, floppy or heavy they feel.
-
Feels gravity and wind. Bones hang and droop under gravity, and blow in constant wind or in gusts and bursts from wind emitters you place in the world.
-
Collides with things. Sphere, capsule and box colliders push bones out of bodies, walls and floors (or keep them inside an area), and respect collision groups.
-
Stays in shape. Angle and per-axis limits, twist limits, stretch and squash, and anchored or ignored bones keep chains from bending in ways they shouldn’t.
-
Works with animation. Inside an animated character, bones swing around the animation instead of replacing it.
How it works
Tag a MeshPart or Model that has Bone instances inside it, and PhysBone treats its bones as chains of points. Every frame it simulates those points and turns each bone to follow them by writing to Bone.Transform. The mesh deforms through Roblox’s normal skinning, and your rig’s bone positions are never changed, so untagging an object puts it back exactly as it was.
All settings are plain attributes on the tagged object (and optionally on individual bones), so they save with your place and can be changed from scripts at any time. The simulation runs on each player’s client and only moves visuals, so it uses no network traffic. Objects that are far away, off-screen or sitting still cost little or nothing.
PhysBone has two parts:
-
A Studio plugin for tagging objects, tuning them with a live preview (no need to press Play), testing animations, and saving presets.
-
A runtime that the plugin installs into your place, so everything also simulates in-game.
Getting started
-
Install the plugin from the Creator Store, then click PhysBone in Studio’s Plugins tab to open the panel.
-
Select a MeshPart or Model that contains
Boneinstances. -
On the Main tab, click Tag PhysBone. A window lists every bone: uncheck any bone that shouldn’t swing (Shift-click to uncheck a bone and everything below it), then click Tag.
-
Keep it selected: it now simulates in Studio. Move or rotate it to watch it swing.
-
Tune it on the Editor tab. Hover any setting to see what it does.
-
On the Main tab, click Install / Update so it also simulates in-game.
Rigging tip: bones should form a chain, from the root (where the hair, tail or cloth attaches) to the tip. The first bone stays attached to the object, and the bones below it swing.
The panel
Main tab
-
Runtime:
-
Install / Update adds the runtime to your place:
ReplicatedStorage.PhysBone, plus a small LocalScript inStarterPlayerScriptsthat starts it. -
Remove takes both out again.
-
An installed runtime is updated automatically when the plugin updates.
-
Tagging: tags or untags the selection as a PhysBone object, a Collider or a Wind Emitter. Tag PhysBone first asks which bones should swing. Unchecked bones get
Ignore. Shift-click a checkbox to change a bone and every bone below it at once. -
Each object can have only one of the three tags. Objects with bones inside can’t be colliders or wind emitters.
-
Insert: adds a ready-made Sphere, Capsule or Box Collider, or a Wind Emitter, next to the selected object.
-
Preview:
-
Live preview of selection simulates whatever you select. Selecting a Model or Folder simulates the enabled PhysBone objects directly inside it, and selecting a collider or wind emitter also simulates the objects near it.
-
Always show gizmos draws every object’s wireframe, plus every collider and emitter.
-
Click a bone joint in the gizmos to select that bone. Ctrl-click adds or removes it, and clicking the selected bone again goes back to the object.
-
Reset Pose snaps chains back to rest.
-
Animation: plays an animation on the selected object so you can see how its bones react to it.
-
Enter an animation ID (one you or your group own), set the speed and looping, and click Play.
-
Or click Saved animations to play one saved by the Animation Editor for the object’s rig (its AnimSaves folder, or the older ServerStorage RBX_ANIMSAVES folder). These play straight from the saved data, so they don’t need uploading.
-
Bones play the animation, and simulated bones swing around it. Ignored bones follow the animation exactly.
-
If the object isn’t already part of a rig (a Model with a Humanoid or AnimationController), it is moved into a temporary one while it plays. Stop puts it back.
Editor tab
The Editor tab shows settings for whatever you select:
-
A PhysBone object (or anything inside it): the object’s settings, a list of its bones, and curves.
-
One or more bones: Anchored, Ignore, and per-bone overrides.
-
A collider: collider settings.
-
A wind emitter: wind settings and a Fire Burst button.
How the editor works:
-
Name colors: a blue name means the value is set on this object or bone. A white name means it uses the default, or on a bone, the object’s value. On a bone, the row also says where the value comes from.
-
Reset buttons: the reset arrow clears a setting. On a bone, a second button sets it to the plain default instead of the object’s value.
-
Curves: the curve button shows a small graph of how that setting changes from the root to the tip of the chain. Click the graph, or the button with three dots, to open the Curve Editor:
-
drag points to shape the curve
-
click to add a point, right-click a point to remove it
-
type an exact value
-
pick a quick shape (Flat, Rise, Fall, Ease in, Ease out)
-
Bones list: shown for objects and bones, so you can move between bones without leaving it.
-
Lines show where each bone sits in the hierarchy.
-
Click a bone to select it, and click it again to go back to the object. Ctrl-click (Cmd on Mac) adds or removes bones, and Shift-click selects a range. Select all selects every bone.
-
The anchor button sets
Anchored, and the eye button setsIgnore(a slashed eye means ignored). -
With several bones selected, the anchor and eye buttons on any of them apply to all of them.
-
A blue number shows how many settings that bone overrides.
-
Choose bones opens the checklist for changing which bones simulate.
-
Several at once: select several objects or bones to edit them all together.
Presets tab
Apply a built-in preset (Cape / Cloth, Flag / Banner, Hair, Jiggle, Tail), or save your own. Saved presets are available in every place.
-
Objects: with PhysBone objects selected, Apply sets every setting in the preset, and Save stores all of the first object’s settings and curves.
-
Bones: with bones selected, Apply sets only the settings that can be set per bone, as overrides on each selected bone. Save stores the first bone’s per-bone settings (its own values, or the ones it gets from the object), and the preset is marked “(bone)” in the list.
Settings tab
Personal preferences. They are never saved into your place.
-
Gizmo colors: color, line width and visibility for each kind of gizmo.
-
Gizmo display: overall line width and opacity, and whether lines hidden behind parts are still drawn (faintly).
-
Preview: whether colliders and emitters preview nearby objects, how far that reaches, and how many objects at most.
-
Interface: tooltips, tooltip delay, whether messages are also printed to Output, and whether Tag PhysBone asks which bones to simulate.
Settings
Settings are attributes on the tagged object, so you can also change them in the Properties window or from scripts. Changes take effect immediately.
Settings marked (per bone) can also be set on an individual Bone. It then affects only that bone, and every other bone keeps the object’s value.
Settings marked (curve) can also take a curve: a NumberSequence attribute named after the setting plus “Curve” (for example DampingCurve). It multiplies the value along the chain, from time 0 (root) to time 1 (tip).
Motion
-
Damping(default 0.05, per bone, curve): how quickly movement dies down. -
Elasticity(default 0.1, per bone, curve): pulls bones back toward their resting shape. -
Pull(default 0.2, per bone, curve): a softer pull back toward the resting shape, without extra bounce. -
Spring(default 0.2, per bone, curve): a bouncy pull back toward the resting shape. -
Stiffness(default 0.1, per bone, curve): how firmly bones keep their shape. 0 is floppy, 1 is rigid. -
Inertia(default 1, per bone, curve): how much bones lag behind when the object moves. 0 means they move rigidly with it. -
Gravity(default -196.2, per bone, curve): -
The downward pull in studs per second squared. Roblox’s default is -196.2.
-
At full strength, bones hang straight down whichever way the object is turned. Weaker values let them keep more of their shape.
-
GravityFalloff(default 0): how much bones resist gravity while at rest. At 1 they keep their resting shape, but still fall when knocked.
Limits
The Editor only shows the settings the chosen Limit Type uses.
-
LimitType(default None, per bone): None has no limits. Angle sets one limit in every direction. Per Axis sets separate limits around each of the bone’s own axes, plus a twist limit. -
MaxAngle(default 90, per bone, curve): Angle only. How far each bone may swing, in degrees. -
MaxAngleX,MaxAngleZ(default 90, per bone): Per Axis only. How far each bone may turn around its own X and Z axes, in degrees. -
MaxAngleY, shown as Max Twist Angle (default 90, per bone): Per Axis only. How far each bone may twist (roll around the direction it points), in degrees. Bones twist when the object turns, then settle back. -
AngleOffsetX,AngleOffsetZ(default 0, per bone): Per Axis only. Shifts the allowed range around the bone’s X or Z axis: the bone can turn from Offset minus Max Angle to Offset plus Max Angle, relative to its parent. The rest pose doesn’t change, so a bone whose rest pose is inside its range stays put; one outside it settles at the nearest edge. -
AngleOffsetY, shown as Twist Angle Offset (default 0, per bone): Per Axis only. The resting twist of each bone, measured from how it was rigged. Every bone rests at exactly this twist; it doesn’t add up along the chain.
Limits are measured from each bone’s parent as it moves, so the freedom adds up along a chain: three bones at 45 degrees can bend up to 135 degrees in total. Without offsets, each limit is centred on the bone’s rest pose, so a limit of 0 holds a bone exactly as it was rigged.
Stretch and squash
-
MaxStretch(default 1, per bone, curve): how far bones can stretch, as a multiple of their length. 1 means no stretching. -
MaxSquash(default 0, per bone, curve): how far bones can compress, as a fraction of their length. -
FreezeAxis(default None, per bone): stops bones moving along one world axis (X, Y or Z).
Chain ends
-
EndLength(default 1): adds an invisible extra bone past the end of each chain, so the last bone can swing. Measured in last-bone lengths. 0 turns it off. -
EndpointPosition(default none): likeEndLength, but at an exact offset from the last bone. -
MultiChildType(default Average): how a bone with several children turns. Average follows all of them, First follows its first child, Ignore stays put.
Collision
-
AllowCollision(default true): whether bones collide with colliders. -
CollisionGroup(default Auto): which colliders these bones hit. Bones only collide with colliders whose part’s CollisionGroup is set to collide with this group in Studio’s Collision Groups editor. Auto uses the object’s own part CollisionGroup (Default for Models). In the Editor, choose Type a name… to enter a group your game creates at runtime. Until that group exists, the bones collide with every collider. -
Radius(default 0, per bone, curve): size of each bone for collisions, in studs. Must be above 0 for collisions to happen. -
Friction(default 0, per bone, curve): how much bones slow down while touching a collider.
Wind
-
Wind(default 0, 0, 0): constant wind always applied to this object. -
WindStrength(default 1): multiplier for wind from wind emitters. -
WindSensitivity(default 1, per bone, curve): how strongly bones react to wind. -
WindTurbulence(default 0.5): how much the wind ripples along the chain. 0 is a steady push. -
WindFrequency(default 1): how fast the ripples travel.
General
-
Enabled(default true): turns the simulation on or off. -
ResetWhenDisabled(default false): when turned off, snap back to the resting pose instead of freezing. -
AnimatedRest, shown as Follow Animation (default true): inside an animated character or rig, bones swing around the animated pose. Turn it off to ignore animations on these bones and swing around the pose they were rigged in. -
Iterations(default 2): accuracy of limits and collisions. Higher values are more accurate and cost more. -
UpdateRate(default 60): simulation steps per second. Motion stays smooth at any frame rate. -
MaxDistance(default 250): distance from the camera at which the object stops simulating. It updates less often as it gets further away. -
ShowGizmos(default false): draws this object’s wireframe in the Studio preview.
Bone attributes
-
Anchored: holds this bone’s joint at its rest position, so the bones above it can’t pull it around. The bone can still turn toward the bones below it. -
Ignore: stops this bone turning. It keeps its rest rotation relative to its parent and moves along with it, and the bones below it still simulate. -
Turn on both to hold a bone completely still.
Animations
Inside a character or any Model with a Humanoid or AnimationController, PhysBone uses the animated pose as the rest pose. Animations keep playing, and simulated bones swing around them. Use Ignore on bones that should only follow the animation.
Turn off AnimatedRest (Follow Animation) on an object to have its bones ignore animations instead.
Colliders
Tag any part as a Collider, or use Insert on the Main tab. Bones collide with it if their object has AllowCollision on and a Radius above 0. Colliders can move (for example, welded to a character), and can be invisible or non-collidable.
-
CollisionEnabled(default true): turns the collider on or off. -
CollisionShape(default Auto): -
Sphere, Capsule or Box.
-
Auto uses the part’s shape: a Ball is a sphere, a Cylinder is a capsule, and anything else is a box.
-
CollisionInflate(default 0): makes the shape bigger (or smaller, with negative values), in studs. -
CollisionInside(default false): keeps bones inside the shape instead of pushing them out.
A collider’s group is its part’s own CollisionGroup property. To have a collider ignore some objects, put it in a group that doesn’t collide with theirs.
Wind emitters
Tag any part as a Wind Emitter, or use Insert on the Main tab. It blows out of its front face, so rotate it to aim.
-
WindType(default Sustain): Sustain blows constantly. Burst blows once and fades out. -
Strength(default 10): wind strength at the emitter. It fades out toward the edge ofRadius. -
Radius(default 20): how far the wind reaches, in studs. 0 means everywhere. -
WindDirection(default none): blow in this world direction instead of out of the front face. -
GustType(default Noise): how the strength changes over time. Noise gives random, natural gusts, Sine a smooth, regular pulse, and Hybrid a regular pulse with random variation. -
Turbulence(default 0.3): how gusty the wind is. -
Frequency(default 0.5): how fast the gusts change. -
Duration(default 1): Burst only. How long a burst takes to fade, in seconds. -
Interval(default 0): Burst only. Repeat every this many seconds. 0 means only when fired.
Scripting
After Install / Update, the runtime starts by itself on every client, so most games need no code. Use the API to tag things at runtime or to control wind:
local PhysBone = require(game.ReplicatedStorage.PhysBone.PhysBone)
PhysBone:TagInstance(hair) -- simulate a newly added accessory
PhysBone:TagCollider(character.Head) -- make a part a collider
hair:SetAttribute("Stiffness", 0.4) -- settings can change at any time
PhysBone:EmitBurst(workspace.Fan) -- fire a Burst wind emitter
PhysBone:ResetChain(hair) -- snap to the resting pose, e.g. after a teleport
Functions:
-
PhysBone:Init(options): starts the simulation. The installed LocalScript already calls it. The optionalFrameBudgetoption is the most time per frame, in seconds (default 0.006). -
PhysBone:TagInstance(object)andPhysBone:UntagInstance(object): start or stop simulating an object. -
PhysBone:TagCollider(part)andPhysBone:UntagCollider(part): make a part a collider, or stop it being one. -
PhysBone:CreateWindEmitter(part, settings)andPhysBone:RemoveWindEmitter(emitter): create or remove a wind emitter without tagging.settingsis optional. -
PhysBone:EmitBurst(emitter): fires a burst on a wind emitter. -
PhysBone:ResetChain(object): snaps an object’s bones to their resting pose. -
PhysBone:GetChain(object)andPhysBone:GetSimulator(): advanced access to the running simulation.
CollectionService tags: PhysBone, PhysBoneCollider and PhysBoneWindEmitter.
Simulation runs on each player’s client. Bone movement is visual only, so it uses no network traffic.
StreamingEnabled: PhysBone handles objects, bones, colliders and wind emitters streaming in and out at any time, with no extra setup. Tagging a Model (or clicking Install / Update) sets its ModelStreamingMode to Atomic, unless you already chose a mode, so all of its bones stream in together.
Performance
-
Sleeping: objects that have stopped moving cost almost nothing until something moves them again.
-
Distance: objects update less often as they get further from the camera, and stop beyond
MaxDistance. Objects off-screen update less often too. -
Frame budget: the runtime caps how much time it spends each frame. If there’s more work than that, objects take turns instead of slowing your game down.
-
Benchmark: about 4 ms per frame for 200 small objects all moving at once.
-
Tips:
-
Use lower
IterationsandUpdateRatefor background objects. -
Lower
MaxDistancefor small details. -
Only add colliders where bones actually touch something.
Benchmarks
Stress Test - 100 Capes with 4 bones avg 0.25ms compute time per frame
You can measure PhysBone in your own game. Turn on Show benchmark overlay in the Preview section of the Main tab, then select your objects in Studio or start a playtest. It shows:
-
Compute: PhysBone’s time per frame, as an average and a peak. During a playtest this is the main-thread time, followed by the time spent on the parallel workers.
-
Scene: how many PhysBone objects, colliders and wind emitters there are.
-
Objects: how many are awake, asleep, and out of range.
-
Bones: how many there are, and how many are actively swinging.
-
Frame: the frame time and frames per second.
-
Graphs: rolling graphs of frame time and PhysBone time for the last 90 frames. Bars turn yellow, then red, as frames get slow.
Troubleshooting
-
Nothing moves in Studio: turn on Live preview of selection and select the object. Check that
Enabledis on. -
Nothing moves in-game: click Install / Update on the Main tab, then publish the place.
-
The last bone never moves: the last bone has nothing to point at. Make sure
EndLengthis above 0, or setEndpointPosition. -
It droops too much: use weaker
Gravity(around -30 to -60 for hair and tails), or raiseGravityFalloff. -
It’s too floppy: raise
Stiffness,PullorDamping. -
Bones go through a collider: set the object’s
Radiusabove 0. You can also raiseIterations. -
Everything moves stiffly: check the bones list on the Editor tab. Only the first bone should be anchored, and no bones should be ignored unless you meant it.
-
Bones jump after a teleport: call
PhysBone:ResetChain(object)after teleporting.
