nodetool-3d-scene
Build, edit, validate or render a NodeTool 3D model: glTF primitives, transforms, lights, material colors, generated meshes, and headless Blender renders. For a playable 3D game, use native-game.
- License 许可
- AGPL-3.0
- 最近更新
- 2026-11-12
- Stars
- ★ 628
- Forks
- 90
01 前言 Front Matter
- name
- nodetool-3d-scene
- featured
- true
- description
- Build, edit, validate or render a NodeTool 3D model: glTF primitives, transforms, lights, material colors, generated meshes, and headless Blender renders. For a playable 3D game, use native-game.
03 SKILL.md 正文
Work a NodeTool 3D model
A 3D model is a .glb or .gltf asset, addressed by its asset id. The
capabilities edit the stored glTF in place and save it back over the same asset,
so the id stays valid and an open editor reloads it.
For a playable game, 2D or 3D, use native-game: it authors 3D games with
dimension: "3d". For a 3D clip inside a cut, build the model here and place it
on a timeline.
The loop
- Find it.
list_model3dsreturns asset id, name, content type and size. Nothing to start from:create_model3d {name, ops?}makes an empty glTF scene and can apply the whole scene in the same call. - Read it.
get_model3d {model_id}lists every object with its uuid, name, type, visibility, transform and material color, plus the scene's world-space bounds. Call this before editing, for the uuids. - Edit.
edit_model3d {model_id, ops: [...]}. Operations run in order. Anything they do not name — meshes, textures, skins, animations — is kept, so an imported model survives an edit. - Validate.
validate_model3d {model_id | document}. - Render, when a picture is asked for.
render_model3d {model_id}goes through headless Blender, honors scene cameras and lights, and stores a PNG asset. It needs Blender on the server and is not offered on the cloud profile.engineiseevee(default, fast) orcycles(slower);camera_modeisauto,sceneororbit. A Cycles render blocks the call, so passbackground: trueto get ageneration_idat once and collect the PNG withawait_generation.
A real mesh
The ops add primitives only. For an object with real geometry, generate one:
run_node with nodetool.model3d.TextTo3D {model, prompt} or
nodetool.model3d.ImageTo3D {model, image} returns a model_3d output. Read
get_node_info first for the model field's shape. These call a paid
provider, so confirm with the user before generating. The other
nodetool.model3d.* nodes (Decimate, RepairMesh, FormatConverter,
Transform3D, …) and the nodetool.blender.* nodes process a mesh inside a
workflow.
edit_model3d ops
| Op | Fields |
|---|---|
add_object |
kind: box, sphere, plane, cylinder, torus, directionalLight, pointLight. Optional name |
delete_object |
target |
set_transform |
position, rotation (Euler degrees), scale, each [x, y, z] |
set_visibility |
visible |
rename_object |
target, name |
set_material_color |
color as a CSS hex string, meshes only |
select_object |
target, or null to clear |
target is a uuid or a name. Object ids are stamped into
node.extras.nodetool_id, because glTF addresses nodes by array index and a
delete renumbers them. Duplicate names make addressing ambiguous, which
validate_model3d warns about.
delete_object keeps the file valid: an animation left with no channels is
removed, and so is a skin that lost a joint, which leaves its mesh in the bind
pose. set_material_color recolors only the named object, copying a material
or mesh it shares with another object first.
These are the ui_3d_* verbs with no editor open. The operations, the units and
the addressing live in @nodetool-ai/model3d, shared with the browser editor, so
a model built headlessly opens there unchanged. Headlessly, a light is a
directionalLight or pointLight and a material can only be recolored.
Light settings, other material fields and parenting need the open editor:
ui_3d_set_light, ui_3d_set_material, ui_3d_set_parent.
No camera headlessly
ui_3d_frame_scene and ui_3d_capture_view need a WebGL context. Without one,
get_model3d's world-space bounds are what answer "how big is this and where is
it". Use render_model3d when an actual picture is required.
What validate_model3d catches
The glTF version, references that resolve to nothing (node, mesh, accessor, material, buffer, skin, camera, skin joint, animation target and sampler), a node with two parents, a cycle in the node hierarchy, a node carrying both a matrix and TRS fields, an accessor with an unknown type or reading past its buffer view, a buffer view reading past its buffer, an undeclared light, and an extension this build cannot honor. It warns on an empty scene, geometry with no light, and duplicate names. It only reads the document, and it handles hierarchies of any depth.
On a timeline
A model3d layer is the one kind preview_timeline_frame cannot draw on its
own canvas. The preview pass collects every 3D layer across the requested
instants, groups them by glTF plus the options that fix a renderer, and hands
each group to one headless Chromium page. Two fields on the layer's report say
what the pixels do not: camera (the pose it was drawn with, authored camera
folded with the animated channels) and animation_time_sec (the glTF
animation's own clock, not timeline time). With no Chrome on the host the group
is left out and reported as a model3d_unavailable degradation.
Reference
In a NodeTool checkout, these repository sources go further:
docs/harnesses.md§ 3D scene toolsdocs/harnesses.md§ 3D clips in preview_timeline_frame
04 同仓库更多 Skills
nodetool
Use the NodeTool MCP server to build, validate, run, and debug visual AI workflows, and to work with assets, collections, and jobs. Use when the user mentions NodeTool or asks for a workflow graph, a node, or a media generation run on their NodeTool server.
wan-2-6-prompting
Prompt Alibaba's Wan 2.6 video — text-to-video with a global style line plus timing-bracketed shots, and image-to-video that describes only what changes over time. Covers the shot-mode switch per provider, the prompt budget, negative prompts, motion intensity wording, audio input and prompt expansion. Use whenever the model id names a Wan 2.6 video route (alibaba/wan-2.6/text-to-video, alibaba/wan-2.6/image-to-video, wan-video/wan-2.6-t2v, wan-video/wan-2.6-i2v, wan-video/wan2.6-i2v-flash) on generate_video, animate_image or a TextToVideo node. Not for Wan 2.5 or 2.7, or the Wan 2.6 image routes.
video-workflow
Build a reusable NodeTool video workflow for batches or repeated inputs. For a single finished piece, use a storyboard skill.
video-clone
Analyze a reference video and recreate its shot structure with a new product or cast in NodeTool.
video-audio-continuity
Keep sound continuous across a multi-scene piece cut from generated video — why one clip per scene hard-cuts the audio at every boundary, when to write all the scenes into a single generation instead, the sound-design vocabulary that survives a provider's copyright filter, and how to check the length, the aspect ratio and the mix of what came back. Use when a piece has more than one scene and the video model writes its own audio (Seedance 2, Veo 3, MiniMax H3, Kling 2.6 and later), or when a cut's sound drops out at the shot changes.
veo-3-prompting
Prompt Google's Veo 3 video line — the five-element shot/setting/subject/action/dialogue structure, the cinematography vocabulary it reads directly, duration and aspect-ratio tradeoffs, the audio and auto-fix switches per provider, and the fixes for visual drift, temporal inconsistency and audio mismatch. Use whenever the model id contains veo3 or veo-3 (fal-ai/veo3.1 and its fast, lite, image-to-video, first-last-frame and reference-to-video routes, fal-ai/veo3/image-to-video, google/veo3.1 on atlascloud, google/veo-3 and google/veo-3.1 on replicate, kie's veo-3-1, and Gemini's own veo-3.1-generate-preview) on generate_video, animate_image, generate_video_from_references or a TextToVideo node.