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.

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.
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.
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.
Place with the gizmo
Click a part in the viewport to select it, then W move, E rotate, R scale. Hold Shift to snap.
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:
| Kit | Contents |
|---|---|
| House | A box, two wedges for the roof, a door and two windows cut by subtraction. |
| Arch gate | An extrusion of the arch profile with bevel. |
| Table | A rounded top and four cylinder legs. |
| Rocket | A bottle lathe body, a cone nose, three emissive fins and a translucent porthole. |
| Lantern post | A 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):
| shape | Label | Notes |
|---|---|---|
box | Box | Unit cube. |
sphere | Sphere | 32 × 20 segments. |
cylinder | Cylinder | 32 segments. |
cone | Cone | 32 segments. |
wedge | Wedge | Triangular prism: roofs, ramps, fins. |
torus | Torus | Ring. |
capsule | Capsule | Cylinder with rounded ends. |
plane | Plate | Very thin box (0.02 thick): floors, panels. |
rounded | Rounded | Box with rounded edges; the radius comes from bevel. |
extrude | Extrude | Extruded 2D profile (profile), optional bevel. |
lathe | Lathe | Half-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.
| profile | Shape |
|---|---|
star | Five-point star (default). |
hexagon | Regular hexagon. |
arch | Thick arch: gates, windows. |
heart | Heart. |
cross | Greek cross. |
gear | 12-tooth gear with a centre hole. |
| profile | Shape |
|---|---|
vase | Curved vase (default). |
bottle | Bottle with a neck. |
column | Column with base and capital. |
bowl | Bowl. |
goblet | Stemmed goblet. |
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.
| op | Effect |
|---|---|
add | Union (default): the part adds to the volume. |
subtract | Cut: the part carves the accumulated volume. Doors, windows, holes. |
intersect | Intersect: keeps only what the part and the volume share. |
[
{ "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" }
]Ghost cutters
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.
colorstringrequiredroughnessnumberDefault 0.6metalnessnumberDefault 0emissivestringemissiveIntensitynumberDefault 0opacitynumberDefault 1flatbooleanDefault falsemapstringnormalMapstringroughnessMapstringrepeatnumberDefault 1Materials 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.
| Style | three.js material | Fields used |
|---|---|---|
| voxel | MeshLambertMaterial | colour, glow, opacity, always faceted |
| toon | MeshToonMaterial | colour, glow, opacity, stepped shading |
| lowpoly | MeshStandardMaterial | all, always faceted |
| pbr | MeshStandardMaterial | all, 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.
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
idstringrequiredshapePrimitiveShaperequiredposVec3requiredrotVec3requiredsizeVec3requiredmaterialMaterialrequiredpartstringnamestringop'add' | 'subtract' | 'intersect'Default 'add'bevelnumberrounded) or chamfer (extrude).profileProfileIdextrude or lathe.What Build does not do
No vertex editing