Modelling with primitives

Build objects from parametric primitives: shapes, extrude and lathe profiles, booleans, bevels, PBR materials and textures, the Roblox Studio way.

The Build mode of the asset editor assembles parametric primitives, the Roblox Studio way. Each part has a shape, a position, a rotation, a size and a PBR material; parts combine through boolean operations and attach to bones so they can be animated.

The studio’s asset editor
The asset editor, Model surface: the view and its gizmo on the left, the panel on the right.

Create a Build asset

A built asset is a VoxelAsset of kind: 'mesh': instead of a voxel grid it carries a primitives[] list. Its world scale is picked among ¼, ½, 1, 2 and 4.

  1. Add the asset

    On the Build step — or in the asset editor if it is already open — click + Build. A project holds at most 96 assets.

  2. Add parts

    Click a shape under “Add a part”. If a part is selected, the new one appears next to it, with its material and bone.

  3. Place with the gizmo

    Click a part in the viewport to select it, then W move, E rotate, R scale. Hold Shift to snap.

  4. Fine-tune with numbers

    The part panel shows position, rotation (degrees) and size on three axes. The minimum size is 0.05.

Starter kits

Five kits add a small ready-to-edit build in one click, showing booleans and profiles in context:

KitContents
HouseA box, two wedges for the roof, a door and two windows cut by subtraction.
Arch gateAn extrusion of the arch profile with bevel.
TableA rounded top and four cylinder legs.
RocketA bottle lathe body, a cone nose, three emissive fins and a translucent porthole.
Lantern postA metal column post and a glowing hexagonal lantern.

Shapes

Every geometry is built unit-sized and centred, then scaled by the part’s size field. Eleven shapes are available (PrimitiveShape):

shapeLabelNotes
boxBoxUnit cube.
sphereSphere32 × 20 segments.
cylinderCylinder32 segments.
coneCone32 segments.
wedgeWedgeTriangular prism: roofs, ramps, fins.
torusTorusRing.
capsuleCapsuleCylinder with rounded ends.
planePlateVery thin box (0.02 thick): floors, panels.
roundedRoundedBox with rounded edges; the radius comes from bevel.
extrudeExtrudeExtruded 2D profile (profile), optional bevel.
latheLatheHalf-profile spun around the Y axis (profile), 48 segments.

Extrude and lathe profiles

The extrude and lathe shapes read the profile field (ProfileId). The panel only offers the profiles that fit the chosen shape.

profileShape
starFive-point star (default).
hexagonRegular hexagon.
archThick arch: gates, windows.
heartHeart.
crossGreek cross.
gear12-tooth gear with a centre hole.

Bevel

The Bevel slider shows for rounded (0 to 0.5, the corner radius in world units, capped at half the smallest dimension) and extrude (0 to 0.2, the chamfer thickness on the profile edges).

Boolean operations

A part’s op field says how it combines with the parts listed before it on the same bone. Parts are evaluated in order: the first is the base, each next one is added, subtracted or intersected. The computation uses three-bvh-csg and produces one mesh per bone.

opEffect
addUnion (default): the part adds to the volume.
subtractCut: the part carves the accumulated volume. Doors, windows, holes.
intersectIntersect: keeps only what the part and the volume share.
primitives.jsonJSON
[
  { "id": "wall", "shape": "box", "pos": [0, 1, 0], "rot": [0, 0, 0], "size": [4, 2, 3],
    "material": { "color": "#e8e4dc", "roughness": 0.9 } },
  { "id": "door", "shape": "box", "pos": [0, 0.7, 1.5], "rot": [0, 0, 0], "size": [0.9, 1.4, 0.4],
    "material": { "color": "#3a3733" }, "op": "subtract" }
]
The House kit, simplified: a door subtracted from the wall.

Ghost cutters

While editing, the studio shows the real result and keeps every source part pickable as a ghost: subtractions as coral wireframes, intersections as cyan wireframes. What ships is the combined mesh.
Booleans only apply within one bone. A part on another bone (or with no bone) is never cut by a part of a different bone, so a door and its wall can animate separately.

PBR materials

Each part carries a Material. Eight presets (Plastic, Matte, Metal, Gold, Glass, Neon, Wood, Stone) replace the material while keeping the part’s colour; the sliders then set each value.

colorstringrequired
Base colour, as hex.
roughnessnumberDefault 0.6
Roughness, 0 (mirror) to 1 (matte).
metalnessnumberDefault 0
Metalness, 0 to 1.
emissivestring
Glow colour (“Glow” in the panel).
emissiveIntensitynumberDefault 0
Glow intensity; set to 1 when you pick a glow colour.
opacitynumberDefault 1
Opacity, 0.1 to 1 in the panel. Below 1 the part becomes transparent.
flatbooleanDefault false
Faceted shading.
mapstring
URL of the colour (diffuse) texture.
normalMapstring
URL of the normal map.
roughnessMapstring
URL of the roughness map.
repeatnumberDefault 1
How many times the texture repeats across the part (0.25 to 8 in the panel).

Materials and render style

How a material renders depends on the world’s style (Moods). Roughness and metalness only matter in Low poly and Realistic; Voxel and Toon keep colour, glow and opacity.

Stylethree.js materialFields used
voxelMeshLambertMaterialcolour, glow, opacity, always faceted
toonMeshToonMaterialcolour, glow, opacity, stepped shading
lowpolyMeshStandardMaterialall, always faceted
pbrMeshStandardMaterialall, faceted if flat

Textures

The PBR texture picker loads the 46 texture sets of the library (Poly Haven, CC0). Picking one fills map, normalMap and roughnessMap at once and sets the repeat to 2 if it was unset. “none” removes all three maps.

When a part has a colour texture, its base colour goes white so it does not tint the texture (unless the entity has a tint).

Bones and animation

A built asset’s bones are its parts: a pivot, a name and an optional parent. A primitive attached to a bone (its part field) turns around that pivot when a clip plays. New bone from part creates a bone whose pivot sits at the base of the selected primitive and attaches it.

“Quick animation” applies the same presets as the Animate surface; they move bones by name (leg, arm, wheel…). See Animation.

Reference: Primitive

idstringrequired
Unique id within the asset.
shapePrimitiveShaperequired
One of the eleven shapes.
posVec3required
Position in world units.
rotVec3required
Rotation in degrees.
sizeVec3required
Size on X, Y, Z in world units.
materialMaterialrequired
PBR material, see above.
partstring
Bone the primitive is attached to.
namestring
Display name.
op'add' | 'subtract' | 'intersect'Default 'add'
Boolean operation against the previous parts of the same bone.
bevelnumber
Radius (rounded) or chamfer (extrude).
profileProfileId
Profile for extrude or lathe.

What Build does not do

No vertex editing

There is no vertex, edge or face selection, no face extrude and no loop cut. Parametric primitives + booleans + profiles, with voxel alongside, cover game props and sets with a clean result for non-experts. For an organic mesh, import a model or generate one.