VIBE3D
Procedural 3D modeling as an AI Editor Toolset
Vibe3D exposes the operators behind Unreal's Modeling Mode β primitives, booleans, lofts, remeshing, UVs, baking, rigging, collision, LODs β as one AICallable service on the engine's native MCP endpoint, with a companion agent skill that teaches the workflow.
An agent builds, unwraps, bakes, rigs and saves meshes without a viewport: meshes live in an in-editor session as integer handles, and every call returns evidence it can read.
WHAT IT IS
Unreal 5.8 ships a serious modeling kernel β GeometryScript and the operators behind
Modeling Mode β but only a person with a mouse could drive it. Vibe3D wraps that kernel as a single
Vibe3D.ModelingService toolset and registers it with the engine's own
ToolsetRegistry, so any MCP client that already talks to the editor
(Claude Code, Codex, Gemini CLI, Cursor, Copilotβ¦) gets it for free. The same functions are one line away in editor Python as
unreal.ModelingService.*, and get_dynamic_mesh(handle)
hands the raw UDynamicMesh to any unreal.GeometryScript_* library for the long tail.
It is an independent plugin: it does not require VibeUE, and runs happily alongside it. Where it shines is procedural and pipeline work β props and blockouts, kitbash merges, clean unwraps, baked detail maps, collision and LOD chains, rigging control surfaces β anything you'd rather describe than click through.
INSTALL
cd <YourProject>/Plugins
git clone https://github.com/kevinpbuckley/Vibe3D.git Build the project β the plugin is enabled by default and pulls in GeometryScripting, ToolsetRegistry, Python and Editor Scripting Utilities as dependencies. UE 5.8 only.
TEACH YOUR AGENT
Vibe3D.GenerateAgentConfig All One console command writes the bundled guide into CLAUDE.md, GEMINI.md and AGENTS.md inside a marked block (re-run to refresh). The modeling skill is registered as a native AgentSkill and reloads with Vibe3D.ReloadSkills.
WHAT'S IN THE TOOLSET
Primitives & Solids
Boxes, spheres, cylinders, cones, capsules, tori, discs, stairs, extruded and revolved polygons, open sweeps and capped lofts that always come out closed and outward-facing.
Booleans & Cuts
Union / subtract / intersect, self-union for kitbash merges, plane cuts, mirror, grooves along any polyline, and an orientation check that catches inside-out parts before they vanish.
Named Selections
By normal angle, box, sphere, material, polygroup, or whole connected piece β stored per mesh, refused once stale, and the input to every poly-edit and rigging call.
Poly-edit & Processing
Extrude, inset, outset, offset, bevel, shell, remesh, simplify (count / tolerance / planar), subdivide (PN, Catmull-Clark, Loop), smooth, weld, repair, hidden-triangle removal.
Deform & Voxel
Bend, twist, flare, Perlin noise, texture displacement, voxel solidify and dilate / contract / open / close morphology for topology you can trust.
UVs You Control
Auto unwraps, projections, polygroup-driven conformal islands, per-selection layout, per-material packing, and stats that measure islands, coverage, overlap and texel density.
Bakes & Images
Tangent / object normals, AO, curvature, position, height, vertex-colour and material-ID masks, UV shells, texture transfer between unwraps, plus noise textures, image import and drawing in UV space.
On-mesh Rigging
Author a bone hierarchy and skin weights directly on the session mesh, bind pieces to bones, and save a SkeletalMesh with its Skeleton created for you.
Assets & Placement
Static and skeletal mesh writes, material slots, convex / box / sphere / capsule collision, LOD chains, actor spawning, plus ray casts, surface sampling and mesh-to-mesh distance checks.
ONE ROUND-TRIP, ONE CRATE
Everything an agent needs is a static call on unreal.ModelingService, so a whole task β build, select, edit, unwrap, verify, save, collide, LOD β batches into a single execute_python_code call:
import unreal
svc = unreal.ModelingService
h = svc.create_mesh().handle
svc.append_box(h, unreal.Transform(), 120, 80, 60)
svc.select_by_normal_angle(h, "top", unreal.Vector(0, 0, 1), 5)
svc.inset_faces(h, "top", 4); svc.extrude_faces(h, "top", -2)
svc.auto_uv(h, "XAtlas"); print(svc.get_uv_stats(h).message) # islands, coverage, overlap, texel density
r = svc.save_mesh_to_static_mesh(h, "/Game/Props/SM_Crate", True, True, False, True); print(r.message)
svc.generate_collision("/Game/Props/SM_Crate", "ConvexHulls", 4)
svc.set_lods("/Game/Props/SM_Crate", [1.0, 0.5, 0.25])
svc.release_all_meshes() EVIDENCE, NOT VIBES
Every mutating call returns success, message and counts; get_mesh_info, get_uv_stats and list_bones let the agent check closedness, overlaps and bindings between stages instead of trusting a green result.
TESTED LIKE CODE
Twelve self-provisioning automation suites (Automation RunTests Vibe3D.Modeling) and an exercise script that calls every public function and prints RESULT: PASS.
OPEN SOURCE, BETA
Early days: the toolset is broad and green, the workflows are still being shaped by real builds. Issues, prompts and PRs on GitHub; show what you made in #vibe3d on Discord.