Models from Blender
Model in Blender, export glTF, import once: the game draws your meshes with their materials and textures, and plays your armature's actions as animations. After that, exporting again to the same file is enough: the game reads it at every build.
In Blender
Blender's axes: Z up, and the front view looks at the model's front from −Y. Veduta turns the model so its front faces the game's forward (−Z); keep these habits:
- Scale: one Blender unit is one meter. A character 1.7 units tall is 1.7 m in the game.
- Origin: put the object's origin (or the armature's) at the feet, on the ground.
- Front: the character looks toward −Y (it faces you in Front view, numpad 1).
- Triangles: the console draws about 1200 triangles a frame for the whole scene: a hero of 200–400 triangles, props of 20–100. Use Decimate if needed.
- Colors: one material per color works best (the Base Color of the Principled BSDF); an Image Texture in Base Color becomes a texture. Vertex colors are not read.
- Armature: for limbs that bend cleanly, make each piece follow one bone: separate objects parented to bones (Ctrl+P → Bone), or a single mesh with each piece's vertex group weighted 1.0 to one bone. Smooth automatic weights import too, but each triangle follows one bone, so joints can open when they bend.
- Actions: each action is an animation, named after it (
Walk→walk). The import makes the ones named with a word like idle, walk or run loop; an action added after the first import goes into the model'sloopby hand. Make the last key of a cycle equal to its first. - Moving objects without an armature (a door, a fan) are animated too: each animated object becomes a bone its children follow.
Export: File → Export → glTF 2.0, format glTF Binary (.glb), the default settings (+Y Up on, Apply Modifiers on, Animation on). Leave compression (Draco) off.
Into the game
veduta import ~/Desktop/knight.glb
(or ask Claude: the MCP import tool does the same.) It writes:
| File | What |
|---|---|
assets/models/src/knight.glb | the file itself (export straight here next time) |
assets/materials/knight_<material>.vmat | one material per Blender material, its color as Blender shows it |
assets/textures/knight_<material>.vtex and textures/src/knight_<material>.png | the image of a material's texture |
assets/models/knight.vmodel | the model, which imports the file |
and reports the triangles, bones, animations and anything left out. The model source:
{
"veduta": "model/1",
"import": {
"file": "models/src/knight.glb",
"loop": ["idle", "walk"],
"materials": { "Armor": "knight_armor", "Skin": "knight_skin" },
"rotation_deg": [0, 180, 0]
}
}
Edit it for what Blender cannot say: "next": {"attack": "idle"} to go back to idle after
an attack, another animation in loop, "pivot": "bottom-center", or your own parts,
bones and animations on top (a hat bone under head). Change the materials freely: the
import never overwrites them.
Then place and play it like any model:
{ "name": "knight", "kind": "static", "model": "knight", "anim": "idle" }
knight.anim_fade = 0.15
knight.anim = moving and "walk" or "idle"
scene.spawn{model = "sword", parent = knight, bone = "hand_r"}
Check it with veduta inspect model knight --sheets summary,poses: the poses sheet shows
every animation at four moments. See Skeletons and Animation for
playing, blending and posing bones from Lua, and the model reference for
every field.
When something looks wrong
| Looks like | Why, and what to do |
|---|---|
| The model faces the camera when it should face away | its front was not −Y in Blender: turn it there, or set rotation_deg |
| Holes at the knees and elbows | smooth weights: weight each piece to one bone |
| A part stands still | it is not weighted or parented to a bone |
| All white | the material's color comes from a node Veduta does not read: use Base Color |
| Too dark or too flat | light is per vertex: a big flat face shades flat; add a few edge loops |
requires extension KHR_draco_mesh_compression | export without compression |