Overview

Roblox is introducing two new sliders to the avatar’s scale to control body shape and proportion: BodyTypeScale and BodyProportionScale. These values are used to control the overall shape of a character.

BodyTypeScale

BodyTypeScale is a NumberValue attached to Humanoid that controls how much the character is to be modified from a standard R15 body shape. When set to 0, the character appears as a standard R15. When set to 1, the character is taller and more slender.

The current maximum value for this factor is 0.3. We will be allowing higher values for this setting in the future when we confirm that visual and physical targets are working well.

BodyProportionScale

In addition to BodyTypeScale, BodyProportionScale determines the shape of the taller, more slender character. When set to 0, the body proportion is “wide,” taller, with broader shoulders. When set to 1, the body proportion is “narrow,” shorter with narrower shoulders.

Changes To Rig Attachments & Joint Creation

The joints of an R15 are built from attachments on parts. Each of the two parts that connects a joint has an attachment whose name ends in “RigAttachment” indicating that a joint is to be built between these parts. For example, both the UpperTorso and the RightUpperArm have an attachment called “RightShoulderRigAttachment.”

When the engine builds the rig (via Humanoid:BuildRigFromAttachments) it finds all the RigAttachment pairs and creates joints connecting their parts based on the location of the attachments.

Unlike the other scaling values (BodyHeightScale, BodyWidthScale, etc), the BodyProportionScale and BodyTypeScale values must interpolate joint locations between the standard R15 positions and the new, taller, thinner positions. In order to do this, RigAttachments now contain a Vector3Value indicating their original position, which is the position when BodyTypeScale is set to 0. This value is used during scaling to determine where the joint should ultimately be positioned.

Because the joint creation code uses OriginalPosition to reposition the RigAttachments during joint creation, setting the location of a RigAttachment is no longer enough to position the joint. Existing code that copies body parts or moves RigAttachments in existing parts to create custom joint locations may not work correctly.

To solve this problem, simply remove OriginalPosition from any RigAttachment and then position it normally. The engine will reset OriginalPosition to be the position of the incoming RigAttachment. Alternatively, you can set OriginalPosition yourself to the desired value and the engine will use that value to reposition the RigAttachment.