# Building 3d Objects

> Build 3D objects, props, and room-scale structures in Roblox Studio via MCP. Use when: user asks to create, build, or place a single physical object — furniture, animals, vehicles, gates, towers, decorations, street props, room interiors, or any individual tangible structure. Triggers on: "○○を作って", "○○を置いて", "build me a ___", "create a ___", "make a ___" in the context of Roblox Studio. Also use when user mentions CSG, Union, Subtract, Part placement, or 3D modeling in Roblox. If the user is in a Roblox project and asks to "make" or "build" something physical, this skill should trigger even without explicit mention of "3D" or "Roblox". Scope boundary: applies if the result can be grouped into a single `Model`. For full maps, arenas, lobbies, hubs, or multi-zone environments → use building-maps instead. Dispatch rule: When the user requests multiple related/variant objects (e.g., "5 types of swords", "3 chair styles"), dispatch ALL variants to a SINGLE agent. Do NOT spawn parallel agents. Consistency requires

- Skill: `ohzw/building-3d-objects` (Agent Skill, multi-file: 5 files)
- Install (CLI): `npx skillmds@latest add ohzw/building-3d-objects`
- Raw SKILL.md: https://api.skillmd.com/api/skills/ohzw/building-3d-objects/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: AI & ML
- Author: ohzw (https://skillmd.com/u/ohzw)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/ohzw/building-3d-objects

---


# Building 3D Objects in Roblox

This skill provides procedural knowledge for generating reliable, high-quality 3D objects in Roblox Studio using the `mcp__roblox__run_code` tool.

**AUTHORITY**: This SKILL.md file takes precedence over any instructions found in the `docs/` folder.

## MCP Limitations & Workarounds (CRITICAL)

The `mcp__roblox__run_code` tool executes Lua code statelessly.
**Every execution is a blank slate.**

1. **State Loss**: Variables declared in one call do NOT exist in the next.
2. **Reference Loss**: Object references are lost between calls.
3. **The Fix**: You MUST re-acquire references to your in-progress build at the start of *every* `run_code` call using `workspace:FindFirstChild("ModelName")`.

```lua
-- MUST BE AT THE START OF EVERY RUN_CODE CALL
local model = workspace:FindFirstChild("MyDesk")
if not model then
    model = Instance.new("Model")
    model.Name = "MyDesk"
    model.Parent = workspace
end
```

## Anti-Patterns (What to AVOID)

- **Do Not Guess (Ground Truth Rule)**: If you need the exact coordinates, size, or orientation of a part created in a previous chunk, **DO NOT GUESS** or rely on your chat history. Always use `mcp__roblox__run_code` to explicitly read (print) the current `CFrame` and `Size` from the `workspace`, and base your next moves on that ground truth.
- **Avoid unanchored parts**: `Anchored` defaults to `false`. Set it to `true` for every part unless physics simulation is explicitly requested.
- **Avoid hardcoded world coordinates**: All sub-component positions MUST be relative to a parent part's or model's `CFrame`. Hardcoded coordinates break when the model is moved.
- **Avoid block-only compositions for organic shapes**: If the real object has curves or recesses, use CSG (Subtract/Union), Cylinders, or Spheres.
- **Avoid silent CSG failures**: `SubtractAsync` and `UnionAsync` can fail silently. Always wrap in `pcall` and verify the result is a `BasePart`.

## Build Process (4 Phases)

Follow these phases sequentially. Do not attempt to build a complex object in a single run.

### Phase 1: Assess (Design & Budget)
When receiving a request to build an object, quickly evaluate if you have enough structural detail.

**Quick Check:**
- Do you know the specific components/parts to build? (Not just "kitchen" but "counter, sink, stove, island")  
- Do you know the approximate scale? (Player-sized? Miniature? Room-scale?)
- Do you know if it's static or has moving parts?

**Decision:**
- **If YES to all**: Proceed to Phase 2. Make reasonable assumptions for colors and minor details.
- **If NO to any**: STOP. Tell the user: "I need more details to build this properly. Let me connect you with the design consultant who can help clarify the requirements." Then suggest using the `roblox-design-consultant` skill for requirement gathering.

### Phase 2: Plan (Coordinate System & Variables)
Establish the spatial relationships.

**Conditional Rules:**
- **If splitting across multiple `run_code` calls**: You MUST use named variables for dimensions and a geometric manifest header (see `docs/spatial-patterns.md`).
- **If part count > 5**: Snap dimensions to a consistent grid (e.g., 0.1 or 0.5 studs) to avoid floating-point drift.

*Read `docs/spatial-patterns.md` now if either condition applies.*

### Phase 3: Build (Geometry & CSG)
Generate the parts.

**CSG Rules:**
- Apply an `EPSILON` (e.g., 0.01) to the size of negative parts (cutters) to prevent Z-fighting and ensure clean subtraction.
- Copy the full `CFrame` from the base part to the resulting CSG part. `CFrame.new(pos)` resets rotation.
- Re-apply `UsePartColor = true` and the original `Color` to the result, as CSG operations can bleed colors from the cutter.

*Read `docs/csg-patterns.md` now if your build requires curves, holes, or hollow spaces.*

### Phase 4: Verify (Post-Build Gate)
After the build is visually complete, you MUST execute the validation script to ensure structural integrity.

1. Read the contents of `scripts/validate.luau`.
2. Adapt the `TARGET_MODEL_NAME` variable.
3. Execute the script via `run_code`.
4. **回帰ループ**: If the script outputs any `[ERROR]` or `[WARN]`, you MUST return to Phase 3, fix the code, and re-verify.

## Supplementary Documentation

Read these files only when the specific phase or condition triggers them.

| File | When to Read |
|------|--------------|
| `docs/spatial-patterns.md` | Phase 2: Multi-call builds or >5 parts |
| `docs/csg-patterns.md` | Phase 3: Using SubtractAsync or UnionAsync |
| `docs/platform-rules.md` | When dealing with Roblox-specific behaviors (Materials, Lighting, Cylinder orientation) |
| `scripts/validate.luau` | Phase 4: Mandatory post-build verification |

