Working with R15 Avatars in Roblox: What Actually Matters
R15 Roblox is the second major avatar rig type Roblox offers, and it changed how most developers approach character animation. The rig has 15 configurable body parts instead of the original six, which gives you more control but also introduces a bunch of pitfalls that aren't obvious until you run into them. The core difference is the skeletal hierarchy. In R6, everything branches off a single PrimaryPart. In R15, you have a chain of Motor6D joints connecting Torso to Head, each limb branching from its own attachment point. The root is still the LowerTorso, not the HumanoidRootPart the way some people assume. This matters because script positioning, raycasting, and alignment all behave differently depending on which part you anchor to.
Setting Up R15 Correctly
If you're building a custom character or modifying an existing one, the first thing to get right is the PrimaryPart property on the Humanoid. Set it to LowerTorso. Then make sure every Motor6D in the rig has its C0 and C1 values defined relative to the correct attachment points. A lot of broken animations come from someone copying an R6 rig into an R15 space without updating those joint offsets. For animation work, you'll want to use Roblox Studio's Animation Editor and switch the rig type to R15 before keyframing. If you animate in R6 and then swap, the poses will collapse because the joint chains don't map one-to-one. There's no automatic conversion tool that actually works well for complex animations. I wasted about three days trying to port a custom emote pack from R6 to R15 using a third-party converter. It handled the idle and walk cycles fine but completely broke any animation with simultaneous arm and torso movement. The workaround was rebuilding the broken keyframes manually in the editor, which took roughly half a day for a ten-animation pack. Lesson learned: always animate in the target rig from the start.
Scripting Considerations
When writing scripts that interact with R15 characters, stop using GetPrimaryPartCFrame() and assuming it points to the chest. It returns LowerTorso's transform, which is useful for root positioning but throws off anything that needs upper-body alignment. For eye-level or weapon-hold calculations, sample the joint directly: Character.HumanoidRootPart.CFrame or Character.LowerTorso.CFrame depending on what you're trying to achieve. For attachment-based logic like hair or accessory positioning, use the actual Attachment objects rather than approximating with part positions. The attachment system in R15 is more accurate and doesn't drift when animations play. Another thing people miss: the R15 rig has separate joints for upper arms and lower arms, which means elbow bending is now a real thing in the animation data. If you're writing procedural animation or inverse kinematics, you need to account for two rotation degrees of freedom per arm instead of one. Simple lerp-based reach scripts that worked fine on R6 will produce stiff, unnatural results on R15 unless you adjust the joint targets.
Get the Full Details

Performance and Compatibility Notes
R15 characters use more parts and more constraints than R6, so there's a slight overhead in physics simulation and rendering. In practice this is negligible on modern devices but can add up in games with hundreds of simultaneous NPCs. If you're building a large-scale simulation with dozens of AI characters, R6 may still be the practical choice. The animation quality difference doesn't justify the cost in those scenarios. There's also the matter of legacy content. Some older models and animations in the Catalog were built exclusively for R6 and won't display correctly on R15 avatars without manual adjustment. Clothing meshes in particular tend to clip or detach because the collision meshes and attachment points were keyed to a six-part skeleton. If your game supports both rig types, test your assets on each one before releasing. You can switch your avatar rig type in Account Settings under the Avatar tab. The change applies globally to your profile but doesn't retroactively convert characters that were already spawned in existing places. New spawns will use whichever rig is currently selected. Third-party tools like Node Editor or the more recent Rig Converter can help migrate specific character models, but they're not officially supported and can introduce their own issues if the source rig isn't clean.
Common Mistakes to Avoid
Don't parent custom parts directly under the Humanoid object. The Humanoid is a controller, not a container, and putting geometry under it breaks the default joint chain. Don't rename the default R15 parts either, since internal Roblox systems reference them by exact names like LeftUpperArm and RightLowerLeg. If you need custom geometry, parent it under the relevant limb part instead of replacing it. And if you're writing a script that changes animatable properties, make sure you're targeting the correct joint. R15 has separate upper and lower arm rotations, upper and lower leg rotations, and a dedicated Neck joint. Setting the wrong one produces weird stretching instead of the bend you're expecting. The rig works well when you respect its structure. Try to fight it and you'll spend hours debugging something that boils down to a misaligned C0 value on a single Motor6D.