[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill:01M6BY1JFAS9WVRMN9Q705DQMV":3,"skill-same:01M6BY1JFAS9WVRMN9Q705DQMV":67},{"skillNo":4,"name":5,"nameZh":6,"description":7,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":16,"categories":17,"keywords":18,"publishedAt":39,"linkOnly":40,"markdownContent":41,"markdownBody":42,"frontMatter":43,"refName":45,"commitSha":46,"skillDirectory":47,"forksCount":48,"repositoryHtmlUrl":49,"repositoryHomepageUrl":50,"ownerHtmlUrl":51,"ownerBlogUrl":12,"ownerDescription":52,"updatedAt":53,"install":54,"resources":66},"01M6BY1JFAS9WVRMN9Q705DQMV","nodetool-3d-scene",null,"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.","nodetool-ai\u002Fnodetool","nodetool-ai","https:\u002F\u002Favatars.githubusercontent.com\u002Fu\u002F164873569?v=4","01M6BXPFDW36K9K1MR8ZH63HG2","nodetool.ai","01M6BXPFJ893XM219GQN60B0WK",628,"AGPL-3.0","https:\u002F\u002Fgithub.com\u002Fnodetool-ai\u002Fnodetool\u002Fblob\u002Fmain\u002Fpackages\u002Fsystem-skills\u002Fnodetool-3d-scene\u002FSKILL.md",[],[19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38],"3D","nodetool 3d scene","nodetool","use","for","headless","true","render","native","transforms","material","blender","build","gltf","primitives","generated","edit","model","game","validate","2026-11-10 10:12:30",false,"---\nname: nodetool-3d-scene\ndescription: \"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.\"\nfeatured: true\n---\n\n# Work a NodeTool 3D model\n\nA 3D model is a `.glb` or `.gltf` **asset**, addressed by its asset id. The\ncapabilities edit the stored glTF in place and save it back over the same asset,\nso the id stays valid and an open editor reloads it.\n\nFor a playable game, 2D or 3D, use `native-game`: it authors 3D games with\n`dimension: \"3d\"`. For a 3D clip inside a cut, build the model here and place it\non a timeline.\n\n## The loop\n\n1. **Find it.** `list_model3ds` returns asset id, name, content type and size.\n   Nothing to start from: `create_model3d {name, ops?}` makes an empty glTF\n   scene and can apply the whole scene in the same call.\n2. **Read it.** `get_model3d {model_id}` lists every object with its uuid, name,\n   type, visibility, transform and material color, plus the scene's world-space\n   bounds. Call this before editing, for the uuids.\n3. **Edit.** `edit_model3d {model_id, ops: [...]}`. Operations run in order.\n   Anything they do not name — meshes, textures, skins, animations — is kept, so\n   an imported model survives an edit.\n4. **Validate.** `validate_model3d {model_id | document}`.\n5. **Render**, when a picture is asked for. `render_model3d {model_id}` goes\n   through headless Blender, honors scene cameras and lights, and stores a PNG\n   asset. It needs Blender on the server and is not offered on the cloud\n   profile. `engine` is `eevee` (default, fast) or `cycles` (slower);\n   `camera_mode` is `auto`, `scene` or `orbit`. A Cycles render blocks the call,\n   so pass `background: true` to get a `generation_id` at once and collect the\n   PNG with `await_generation`.\n\n## A real mesh\n\nThe ops add primitives only. For an object with real geometry, generate one:\n`run_node` with `nodetool.model3d.TextTo3D {model, prompt}` or\n`nodetool.model3d.ImageTo3D {model, image}` returns a `model_3d` output. Read\n`get_node_info` first for the `model` field's shape. These call a paid\nprovider, so confirm with the user before generating. The other\n`nodetool.model3d.*` nodes (`Decimate`, `RepairMesh`, `FormatConverter`,\n`Transform3D`, …) and the `nodetool.blender.*` nodes process a mesh inside a\nworkflow.\n\n## `edit_model3d` ops\n\n| Op | Fields |\n|---|---|\n| `add_object` | `kind`: `box`, `sphere`, `plane`, `cylinder`, `torus`, `directionalLight`, `pointLight`. Optional `name` |\n| `delete_object` | `target` |\n| `set_transform` | `position`, `rotation` (Euler **degrees**), `scale`, each `[x, y, z]` |\n| `set_visibility` | `visible` |\n| `rename_object` | `target`, `name` |\n| `set_material_color` | `color` as a CSS hex string, meshes only |\n| `select_object` | `target`, or `null` to clear |\n\n`target` is a uuid or a name. Object ids are stamped into\n`node.extras.nodetool_id`, because glTF addresses nodes by array index and a\ndelete renumbers them. Duplicate names make addressing ambiguous, which\n`validate_model3d` warns about.\n\n`delete_object` keeps the file valid: an animation left with no channels is\nremoved, and so is a skin that lost a joint, which leaves its mesh in the bind\npose. `set_material_color` recolors only the named object, copying a material\nor mesh it shares with another object first.\n\nThese are the `ui_3d_*` verbs with no editor open. The operations, the units and\nthe addressing live in `@nodetool-ai\u002Fmodel3d`, shared with the browser editor, so\na model built headlessly opens there unchanged. Headlessly, a light is a\n`directionalLight` or `pointLight` and a material can only be recolored.\nLight settings, other material fields and parenting need the open editor:\n`ui_3d_set_light`, `ui_3d_set_material`, `ui_3d_set_parent`.\n\n## No camera headlessly\n\n`ui_3d_frame_scene` and `ui_3d_capture_view` need a WebGL context. Without one,\n`get_model3d`'s world-space bounds are what answer \"how big is this and where is\nit\". Use `render_model3d` when an actual picture is required.\n\n## What `validate_model3d` catches\n\nThe glTF version, references that resolve to nothing (node, mesh, accessor,\nmaterial, buffer, skin, camera, skin joint, animation target and sampler), a\nnode with two parents, a cycle in the node hierarchy, a node carrying both a\nmatrix and TRS fields, an accessor with an unknown type or reading past its\nbuffer view, a buffer view reading past its buffer, an undeclared light, and an\nextension this build cannot honor. It warns on an empty scene, geometry with no\nlight, and duplicate names. It only reads the document, and it handles\nhierarchies of any depth.\n\n## On a timeline\n\nA `model3d` layer is the one kind `preview_timeline_frame` cannot draw on its\nown canvas. The preview pass collects every 3D layer across the requested\ninstants, groups them by glTF plus the options that fix a renderer, and hands\neach group to one headless Chromium page. Two fields on the layer's report say\nwhat the pixels do not: `camera` (the pose it was drawn with, authored camera\nfolded with the animated channels) and `animation_time_sec` (the glTF\nanimation's own clock, not timeline time). With no Chrome on the host the group\nis left out and reported as a `model3d_unavailable` degradation.\n\n## Reference\n\nIn a NodeTool checkout, these repository sources go further:\n\n- `docs\u002Fharnesses.md` § 3D scene tools\n- `docs\u002Fharnesses.md` § 3D clips in preview_timeline_frame\n","# Work a NodeTool 3D model\n\nA 3D model is a `.glb` or `.gltf` **asset**, addressed by its asset id. The\ncapabilities edit the stored glTF in place and save it back over the same asset,\nso the id stays valid and an open editor reloads it.\n\nFor a playable game, 2D or 3D, use `native-game`: it authors 3D games with\n`dimension: \"3d\"`. For a 3D clip inside a cut, build the model here and place it\non a timeline.\n\n## The loop\n\n1. **Find it.** `list_model3ds` returns asset id, name, content type and size.\n   Nothing to start from: `create_model3d {name, ops?}` makes an empty glTF\n   scene and can apply the whole scene in the same call.\n2. **Read it.** `get_model3d {model_id}` lists every object with its uuid, name,\n   type, visibility, transform and material color, plus the scene's world-space\n   bounds. Call this before editing, for the uuids.\n3. **Edit.** `edit_model3d {model_id, ops: [...]}`. Operations run in order.\n   Anything they do not name — meshes, textures, skins, animations — is kept, so\n   an imported model survives an edit.\n4. **Validate.** `validate_model3d {model_id | document}`.\n5. **Render**, when a picture is asked for. `render_model3d {model_id}` goes\n   through headless Blender, honors scene cameras and lights, and stores a PNG\n   asset. It needs Blender on the server and is not offered on the cloud\n   profile. `engine` is `eevee` (default, fast) or `cycles` (slower);\n   `camera_mode` is `auto`, `scene` or `orbit`. A Cycles render blocks the call,\n   so pass `background: true` to get a `generation_id` at once and collect the\n   PNG with `await_generation`.\n\n## A real mesh\n\nThe ops add primitives only. For an object with real geometry, generate one:\n`run_node` with `nodetool.model3d.TextTo3D {model, prompt}` or\n`nodetool.model3d.ImageTo3D {model, image}` returns a `model_3d` output. Read\n`get_node_info` first for the `model` field's shape. These call a paid\nprovider, so confirm with the user before generating. The other\n`nodetool.model3d.*` nodes (`Decimate`, `RepairMesh`, `FormatConverter`,\n`Transform3D`, …) and the `nodetool.blender.*` nodes process a mesh inside a\nworkflow.\n\n## `edit_model3d` ops\n\n| Op | Fields |\n|---|---|\n| `add_object` | `kind`: `box`, `sphere`, `plane`, `cylinder`, `torus`, `directionalLight`, `pointLight`. Optional `name` |\n| `delete_object` | `target` |\n| `set_transform` | `position`, `rotation` (Euler **degrees**), `scale`, each `[x, y, z]` |\n| `set_visibility` | `visible` |\n| `rename_object` | `target`, `name` |\n| `set_material_color` | `color` as a CSS hex string, meshes only |\n| `select_object` | `target`, or `null` to clear |\n\n`target` is a uuid or a name. Object ids are stamped into\n`node.extras.nodetool_id`, because glTF addresses nodes by array index and a\ndelete renumbers them. Duplicate names make addressing ambiguous, which\n`validate_model3d` warns about.\n\n`delete_object` keeps the file valid: an animation left with no channels is\nremoved, and so is a skin that lost a joint, which leaves its mesh in the bind\npose. `set_material_color` recolors only the named object, copying a material\nor mesh it shares with another object first.\n\nThese are the `ui_3d_*` verbs with no editor open. The operations, the units and\nthe addressing live in `@nodetool-ai\u002Fmodel3d`, shared with the browser editor, so\na model built headlessly opens there unchanged. Headlessly, a light is a\n`directionalLight` or `pointLight` and a material can only be recolored.\nLight settings, other material fields and parenting need the open editor:\n`ui_3d_set_light`, `ui_3d_set_material`, `ui_3d_set_parent`.\n\n## No camera headlessly\n\n`ui_3d_frame_scene` and `ui_3d_capture_view` need a WebGL context. Without one,\n`get_model3d`'s world-space bounds are what answer \"how big is this and where is\nit\". Use `render_model3d` when an actual picture is required.\n\n## What `validate_model3d` catches\n\nThe glTF version, references that resolve to nothing (node, mesh, accessor,\nmaterial, buffer, skin, camera, skin joint, animation target and sampler), a\nnode with two parents, a cycle in the node hierarchy, a node carrying both a\nmatrix and TRS fields, an accessor with an unknown type or reading past its\nbuffer view, a buffer view reading past its buffer, an undeclared light, and an\nextension this build cannot honor. It warns on an empty scene, geometry with no\nlight, and duplicate names. It only reads the document, and it handles\nhierarchies of any depth.\n\n## On a timeline\n\nA `model3d` layer is the one kind `preview_timeline_frame` cannot draw on its\nown canvas. The preview pass collects every 3D layer across the requested\ninstants, groups them by glTF plus the options that fix a renderer, and hands\neach group to one headless Chromium page. Two fields on the layer's report say\nwhat the pixels do not: `camera` (the pose it was drawn with, authored camera\nfolded with the animated channels) and `animation_time_sec` (the glTF\nanimation's own clock, not timeline time). With no Chrome on the host the group\nis left out and reported as a `model3d_unavailable` degradation.\n\n## Reference\n\nIn a NodeTool checkout, these repository sources go further:\n\n- `docs\u002Fharnesses.md` § 3D scene tools\n- `docs\u002Fharnesses.md` § 3D clips in preview_timeline_frame\n",{"name":5,"featured":44,"description":7},true,"main","c7226baa82daca42a19a5855c116544f97aa8bac","packages\u002Fsystem-skills\u002Fnodetool-3d-scene",90,"https:\u002F\u002Fgithub.com\u002Fnodetool-ai\u002Fnodetool","https:\u002F\u002Fnodetool.ai\u002F","https:\u002F\u002Fgithub.com\u002Fnodetool-ai","No-code AI development","2026-11-12 03:00:58",{"source":8,"skillName":5,"commands":55,"prompt":65,"zipAvailable":44},[56,59,62],{"tool":57,"command":58},"npx","npx skills add nodetool-ai\u002Fnodetool --skill nodetool-3d-scene",{"tool":60,"command":61},"bunx","bunx skills add nodetool-ai\u002Fnodetool --skill nodetool-3d-scene",{"tool":63,"command":64},"pnpm","pnpm dlx skills add nodetool-ai\u002Fnodetool --skill nodetool-3d-scene","安装技能，技能地址：https:\u002F\u002Fgithub.com\u002Fnodetool-ai\u002Fnodetool\u002Fblob\u002Fmain\u002Fpackages\u002Fsystem-skills\u002Fnodetool-3d-scene\u002FSKILL.md",[],[68,102,131,145,161,185],{"skillNo":69,"name":21,"nameZh":6,"description":70,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":71,"categories":72,"keywords":83,"publishedAt":39},"01M6BY4D93R0Q9400ZHJ04DXP1","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.","https:\u002F\u002Fgithub.com\u002Fnodetool-ai\u002Fnodetool\u002Fblob\u002Fmain\u002Fplugins\u002Fchatgpt\u002Fnodetool\u002Fskills\u002Fnodetool\u002FSKILL.md",[73,78],{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000023","Skill与智能体开发","SCENARIO","使用场景",{"categoryNo":79,"categoryName":80,"taxonomyType":81,"taxonomyTypeDesc":82},"01JBSEEDCAT000000000000030","开发工程师","PROFESSION","适用职业",[21,84,85,86,87,38,88,89,90,91,92,93,94,95,22,96,97,98,99,100,23,101],"MCP","mcp server","workflow","workflows","debug","run","graph","server","Media","assets","work","node","visual","generation","collections","media generation","with","when",{"skillNo":103,"name":104,"nameZh":6,"description":105,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":106,"categories":107,"keywords":111,"publishedAt":39},"01M6BY4AEB05ZPBRVD078ATR2H","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\u002Fwan-2.6\u002Ftext-to-video, alibaba\u002Fwan-2.6\u002Fimage-to-video, wan-video\u002Fwan-2.6-t2v, wan-video\u002Fwan-2.6-i2v, wan-video\u002Fwan2.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.","https:\u002F\u002Fgithub.com\u002Fnodetool-ai\u002Fnodetool\u002Fblob\u002Fmain\u002Fpackages\u002Fsystem-skills\u002Fwan-2-6-prompting\u002FSKILL.md",[108],{"categoryNo":109,"categoryName":110,"taxonomyType":76,"taxonomyTypeDesc":77},"01JBSEEDCAT000000000000016","图像与多媒体",[112,113,114,115,116,117,118,119,120,36,121,95,122,123,124,125,126,127,128,129,130],"wan 2 6 prompting","prompting","image","generate","Budget","Video","Audio","text","animate","flash","only","route","time","line","input","text-to-video","image-to-video","mode","expansion",{"skillNo":132,"name":133,"nameZh":6,"description":134,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":135,"categories":136,"keywords":139,"publishedAt":39},"01M6BY47T4748ZG5ZMTAR97ZWZ","video-workflow","Build a reusable NodeTool video workflow for batches or repeated inputs. For a single finished piece, use a storyboard skill.","https:\u002F\u002Fgithub.com\u002Fnodetool-ai\u002Fnodetool\u002Fblob\u002Fmain\u002Fpackages\u002Fsystem-skills\u002Fvideo-workflow\u002FSKILL.md",[137,138],{"categoryNo":109,"categoryName":110,"taxonomyType":76,"taxonomyTypeDesc":77},{"categoryNo":74,"categoryName":75,"taxonomyType":76,"taxonomyTypeDesc":77},[86,117,140,21,22,141,142,31,143,23,144],"video workflow","reusable","storyboard","batches","single",{"skillNo":146,"name":147,"nameZh":6,"description":148,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":149,"categories":150,"keywords":152,"publishedAt":39},"01M6BY4587N2SYN315SXGEMZC3","video-clone","Analyze a reference video and recreate its shot structure with a new product or cast in NodeTool.","https:\u002F\u002Fgithub.com\u002Fnodetool-ai\u002Fnodetool\u002Fblob\u002Fmain\u002Fpackages\u002Fsystem-skills\u002Fvideo-clone\u002FSKILL.md",[151],{"categoryNo":109,"categoryName":110,"taxonomyType":76,"taxonomyTypeDesc":77},[117,153,154,155,156,21,157,158,159,100,160],"video clone","clone","product","analyze","reference","cast","structure","new",{"skillNo":162,"name":163,"nameZh":6,"description":164,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":165,"categories":166,"keywords":168,"publishedAt":39},"01M6BY4257C2KQYYMD9EK6DK8E","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.","https:\u002F\u002Fgithub.com\u002Fnodetool-ai\u002Fnodetool\u002Fblob\u002Fmain\u002Fpackages\u002Fsystem-skills\u002Fvideo-audio-continuity\u002FSKILL.md",[167],{"categoryNo":109,"categoryName":110,"taxonomyType":76,"taxonomyTypeDesc":77},[117,118,169,170,171,172,173,174,36,175,34,176,177,178,179,180,181,182,183,184,101],"video audio continuity","continuity","design","boundary","how","why","write","later","back","across","cut","how to","filter","mix","at","veo 3",{"skillNo":186,"name":187,"nameZh":6,"description":188,"descriptionZh":6,"repositoryFullName":8,"ownerLogin":9,"ownerAvatarUrl":10,"ownerAccountNo":11,"ownerDisplayName":12,"repositoryNo":13,"starsCount":14,"licenseSpdxId":15,"licenseFileUrl":6,"sourceHtmlUrl":189,"categories":190,"keywords":192,"publishedAt":39},"01M6BY3ZANBSQMZRH4MG55R8Z7","veo-3-prompting","Prompt Google's Veo 3 video line — the five-element shot\u002Fsetting\u002Fsubject\u002Faction\u002Fdialogue 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\u002Fveo3.1 and its fast, lite, image-to-video, first-last-frame and reference-to-video routes, fal-ai\u002Fveo3\u002Fimage-to-video, google\u002Fveo3.1 on atlascloud, google\u002Fveo-3 and google\u002Fveo-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.","https:\u002F\u002Fgithub.com\u002Fnodetool-ai\u002Fnodetool\u002Fblob\u002Fmain\u002Fpackages\u002Fsystem-skills\u002Fveo-3-prompting\u002FSKILL.md",[191],{"categoryNo":109,"categoryName":110,"taxonomyType":76,"taxonomyTypeDesc":77},[193,194,113,184,114,195,196,115,197,198,117,118,120,36,199,200,201,202,203,204,205,159,206,207,208],"veo 3 prompting","veo","google","gemini","fast","first","fal","kie","replicate","fix","auto","references","drift","preview","element","auto-fix"]