vehicle-model is a skill from the Summer skill library: a guide your AI agent reads when the task matches, so it builds the good version on the first try. Generate a hard-surface vehicle (car, spaceship, mech, boat, tank) as a static or VehicleBody3D mesh.
When your agent uses it
- Generating a hard-surface vehicle — car, motorcycle, spaceship, hover bike, boat, mech, tank, helicopter
- A racing, flying, or combat game needs a hard-surface vehicle mesh as a VehicleBody3D or MeshInstance3D
Install
summer setup installs every skill for your agent. To add only this one:
claude-code for your agent, such as codex or cursor. See Skills for every option.
The skill
Vehicles are the hardest 3D-gen category. Hard surfaces (flat panels, sharp edges, symmetrical bodies) expose every flaw the AI mesher has — smoothing-group artifacts on flat panels, asymmetric headlights, melted door seams. This skill exists to push the success rate up by giving the model multi-angle reference, picking the right backend, and using a secondary detail pass (decals) to recover crispness on the body panels. Backing operation:assets.generate_3d (it answers with a job: jobs.wait until it finishes). Default model is hunyuan (best general quality). For pure hard-surface (clean spaceship, F1 car), try trellis first — it tends to preserve panel edges better.
When to use
- “Make me a player car for a racing game.”
- “Generate a sci-fi fighter spaceship.”
- “I need a hover bike for the desert level.”
- “Create a mech for the boss fight.”
- “Background traffic — generate three civilian sedans.”
When NOT to use
- Character driving the vehicle → that’s
character-model. Generate them separately and parent the character to the vehicle’s seat. - Vehicle interior (cockpit, dashboard) as a first-person view → generate as a separate “interior” prop via
prop-modelwith first-person framing. - A scenery vehicle that never moves and is far from camera (parked truck in the distance) →
prop-modelis fine; vehicle-model’s overhead isn’t worth it. - Procedural / customizable vehicles (modular ship parts) → use
environment-kitto generate a vehicle-parts kit instead.
Polycount targets
Vehicles benefit more from polycount than props — flat panels need edge density to look right. Don’t go below 2k for anything the camera will get close to.
Multi-angle reference — the single biggest quality lever
Vehicles are highly view-dependent. A front-only reference produces a mesh with great front detail and a melted rear. There are two ways to give the mesher more than one angle, and they are not the same thing: (a) A real multi-image request — prefer this.assets.generate_3d takes an imageUrls array of two to four views. These are passed through as separate views, not fused into one picture. Several views run on Meshy (meshy or meshy-7.1; any other model is switched to Meshy).
imageUrls — do not composite them down into one image first; that throws away the multi-view path.
Steps
1. Search before generating
2. Pick model and polycount
For hard-edged vehicles (spaceships, F1, mechs), trytrellis first — sharper panel edges. For organic-curved vehicles (muscle cars, motorcycles, classic boats), hunyuan handles the curves better.
3. Build the prompt
Pattern:<vehicle type> + <silhouette / era / style> + <materials> + <surface state> + isolated suffix.
Nothing in the prompt text “triggers” multi-view. The phrase
front and 3/4 side views only shapes what the image model draws; the 3D operation has no prompt-sniffing and sees whatever pixels you hand it. Multi-view comes from the imageUrls array, nothing else.
4. Confirm and call
About to generateThe same call withred_race_carviahunyuan, target ~25k tris, multi-angle ref. Uses credits, ~90s. OK?
dryRun: true first gives the credits for the confirmation (estimate.credits, and enough against their balance).
5. Inspect for hard-surface artifacts
- Smoothing-group artifacts on flat panels (visible as banding under light) → cover with step 6’s detail decals, or re-import with
Generate Tangents = onand a custom shader. - Asymmetric headlights / wheels → regenerate with
symmetric, mirrored bilateraladded to the prompt. - Melted door seams / panel gaps → regenerate from a cleaner multi-view reference, or paint the seams back with step 6’s decals.
6. Optional: secondary detail pass
There is no texture-only 3D pass among the asset operations (assets.generate_3d takes text-to-3d or image-to-3d). For hero vehicles, recover panel-line crispness without re-meshing by drawing the detail as images and laying it on the mesh:
Decal nodes or as a detail texture in a material override in the editor. Cheaper than re-meshing.
7. Wire into the scene
Player car wiring (one
summer_run_script; scenePath is the exact scene to change):
.glb cannot be assigned to MeshInstance3D.mesh — an imported .glb is a scene, not a Mesh (ResourceLoader.get_recognized_extensions_for_type("Mesh") on the shipped engine returns ["tres", "mesh", "res"], no glb). Instantiate it (ctx.instance_scene in a script, summer_instantiate_scene for one model). Build and size the collision shape before you assign it.
Background scenery wiring:
Anti-patterns
- Single-angle reference for a hero vehicle. Front-only → melted rear. Pass an
imageUrlsarray (up to four views) for anything the player gets close to. - Expecting the prompt to request multi-view. It cannot.
imageUrlsis the only multi-view mechanism. - Flat-shaded prompt for hard surfaces. “Smooth shading”, “rounded edges” → loses the panel-line crispness that defines vehicles. Prefer “hard-surface”, “panel-lined”, “crisp edges”.
- Skipping symmetry callouts. Vehicles are bilaterally symmetric — without
symmetric, mirroredyou get one headlight bigger than the other 30% of the time. - Asking the mesh pass to invent decals / liveries. It can’t — the mesh has the silhouette but the decals get geometry-baked weirdly. Use step 6’s decals for liveries.
- Wrapping a background sedan in VehicleBody3D. Wastes physics for a parked car. Use MeshInstance3D under Node3D.
- Picking
meshy(legacy). Worse hard-surface fidelity than hunyuan or trellis.
Edge cases
- Tracked vehicle (tank). AI mesh-gen handles the hull but the tracks come back as a fused ring. Generate the hull only, then add tracks as a separate
prop-model(or use a tiled texture on a torus). For animation, scroll the track texture’s UV. - Articulated vehicle (mech with shoulders, hips, knees). The mesh is one piece — joints aren’t separated. For animated mechs, treat as a humanoid: generate as
character-modelwith the rig pass, then animate withtext-to-motion(prompt “walks heavily”). - Vehicle with rotor (helicopter, drone). Generate without rotor, then add the rotor as a separate
prop-modeland parent it. Spin via code in_process. - Open-top vehicle (convertible, jeep). Specify “open top, no roof” — defaults often add a roof.
- The user wants the cockpit interior visible. Generate exterior here, then a separate
prop-modelfor the interior, and switch meshes when the camera enters first-person view.
Without Summer Engine
In a session without Summer Engine tools (the assets profile; thesummer-assets skill has the whole loop), do steps 1-6 and skip step 7 (scene wiring, VehicleWheel3D). Save the file where the person asked with out (the summer-assets skill says how), and tell them the path and format. The file is GLB and not at real-world size: give the person the target length (a car about 4.5 m) and tell them where the wheels are, so they can set up their engine’s vehicle physics.
Fallback (no MCP)
- Generate the multi-angle reference at the Summer dashboard (or Midjourney / nano-banana web).
- Upload to Hunyuan or Trellis web playground → image-to-3D → download
.glb. - Drop into
res://assets/vehicles/. - Wire as VehicleBody3D / MeshInstance3D in Summer Engine manually.
Handoff
After the vehicle is wired:race_car.glbplaced at./World/RaceCaras a VehicleBody3D. Next:
- Vehicle controls: WASD steering / accel — write them with
engine_force,steering, andbrakeon VehicleBody3D.- Driver character: generate via
character-modeland parent to the seat position.- Engine sound + tire screech:
sound-effectfor one-shots,ambient-bedfor the engine loop.- Particles: exhaust smoke, dust trail, sparks on collision —
vfx-smoke/vfx-hit-sparkor built-in GPUParticles3D.
See also
character-model— for the driver/pilot.prop-model— for separable parts (rotors, decals as decals, modular kit pieces).asset-strategy— meta-router.summer_docs_readidreference/mcp-tools-reference— how to callassets.generate_3d;summer_searchreturns its exact input.
From a shell
No Summer MCP tools in this session? Run each one as a command; whensummer --version is missing or below 4.0, use npx -y summer-engine@latest in place of summer. Fields are flags in kebab-case (--scene-path res://main.tscn) or one --input '<json>', and summer ops describe <op> prints the exact input. The summer-cli skill has the rest.
Related skills
character-model: Generate a rigged humanoid (player, NPC, enemy, boss) from a T-pose reference, previewed before rigging.environment-kit: Generate a modular environment kit: walls, floor tiles, pillars, doors, arches in one visual style.prop-model: Generate one static 3D prop (sword, barrel, chest, lantern, statue): one object, no rig, a MeshInstance3D.generate-motion: Attach a library animation clip (idle, walk, run, attack) to a rigged character via AnimationPlayer.asset-strategy: Route any ‘I need a [thing]’ asset request to the right skill: 2D, 3D, audio, video, VFX or animation.ambient-bed: Generate a long looping location ambience (forest, dungeon, city, cave) on the Ambient bus.sound-effect: Make sound effects (swings, hits, whooshes, reloads, UI): three versions to pick from, then wire them.organic-model: Generate organic 3D shapes (trees, rocks, mushrooms, plants, crystals) where irregularity looks natural.
Source:
library/skills/vehicle-model/SKILL.md, rendered from summer-engine@4.3.0 on npm.
