{"id":"c65180e1-df43-4950-9c43-a441e98daafd","entityType":"agent","slug":"clawhub-emergencescience-blender-bpy-enhanced","name":"Blender Bpy Enhanced","canonicalUrl":"https://www.xpersona.co/agent/clawhub-emergencescience-blender-bpy-enhanced","canonicalPath":"/agent/clawhub-emergencescience-blender-bpy-enhanced","generatedAt":"2026-10-10T23:45:41.871Z","source":"CLAWHUB","claimStatus":"UNCLAIMED","verificationTier":"NONE","summary":{"evidence":{"source":"editorial-content","verified":true,"confidence":"high","updatedAt":"2026-10-10T21:09:45.630Z","emptyReason":null},"description":"Comprehensive Blender automation via Python bpy API. Procedural modeling, material nodes, lighting, rendering, and asset generation. Includes verified gear/m... Skill: Blender Bpy Enhanced Owner: emergencescience Summary: Comprehensive Blender automation via Python bpy API. Procedural modeling, material nodes, lighting, rendering, and asset generation. Includes verified gear/m... Tags: 3d:2.0.0, blender:2.0.0, creative:2.0.0, latest:2.2.0, procedural:2.0.0 Version history: v2.2.0 | 2026-06-02T13:03:35.365Z | auto blender-bpy-enhanced v2.2.0 - Added support for glass/ice mate","descriptionLabel":"Technical summary","evidenceSummary":"Capability contract not published. No trust telemetry is available yet. 1.3K downloads reported by the source. Last updated 10/10/2026.","installCommand":"clawhub skill install s17a35617mabw6kewbzv4z4e7x83w38h:blender-bpy-enhanced","sourceUrl":"https://clawhub.ai/emergencescience/blender-bpy-enhanced","homepage":"https://clawhub.ai/emergencescience/skills/blender-bpy-enhanced","primaryLinks":[{"label":"View on ClawHub","url":"https://clawhub.ai/emergencescience/blender-bpy-enhanced","kind":"source"},{"label":"Homepage","url":"https://clawhub.ai/emergencescience/skills/blender-bpy-enhanced","kind":"homepage"}],"safetyScore":84,"overallRank":62,"popularityScore":62,"trustScore":null,"claimedByName":null,"isOwner":false,"seoDescription":"Comprehensive Blender automation via Python bpy API. Procedural modeling, material nodes, lighting, rendering, and asset generation. Includes verified gear/m..."},"coverage":{"evidence":{"source":"public-profile","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:09:45.630Z","emptyReason":null},"protocols":[{"protocol":"OPENCLEW","label":"OpenClaw","status":"self-declared","notes":"Declared in the public agent profile."}],"capabilities":[],"verifiedCount":0,"selfDeclaredCount":1,"capabilityMatrix":{"rows":[{"key":"OPENCLEW","type":"protocol","support":"unknown","confidenceSource":"profile","notes":"Listed on profile"}],"flattenedTokens":"protocol:OPENCLEW|unknown|profile"}},"adoption":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:09:45.630Z","emptyReason":null},"stars":null,"forks":null,"downloads":1257,"packageName":null,"latestVersion":"2.2.0","tractionLabel":"1.3K downloads"},"release":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"medium","updatedAt":"2026-10-10T21:09:45.569Z","emptyReason":null},"lastUpdatedAt":"2026-10-10T21:09:45.630Z","lastCrawledAt":"2026-10-10T21:09:45.569Z","lastIndexedAt":null,"nextCrawlAt":"2026-10-11T21:09:45.569Z","lastVerifiedAt":null,"highlights":[{"version":"2.2.0","createdAt":"2026-06-02T13:03:35.365Z","changelog":"blender-bpy-enhanced v2.2.0 - Added support for glass/ice material creation, with examples for refractive materials. - Improved camera setup: now uses mathutils and quaternion-based look-at for more reliable orientation. - Rendering now defaults to Cycles engine with GPU Metal acceleration support on macOS, plus built-in denoising. - Expanded tags to include \"3d-printing\". - Documentation and code patterns updated to reflect new material, rendering, and camera features. - Internal meta and documentation files updated; obsolete files removed.","fileCount":5,"zipByteSize":12801},{"version":"2.0.0","createdAt":"2026-05-30T06:03:06.377Z","changelog":"v2.0.0: Complete rewrite with procedural gear demo, metal materials, 3-point lighting, Eevee/Cycles render support, and common pitfalls guide. Enhanced from skillhub:blender-bpy v1.0.0","fileCount":5,"zipByteSize":10918}]},"execution":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No published capability contract is available yet."},"installCommand":"clawhub skill install s17a35617mabw6kewbzv4z4e7x83w38h:blender-bpy-enhanced","setupComplexity":"low","setupSteps":["Setup complexity is LOW. This package is likely designed for quick installation with minimal external side-effects.","Final validation: Expose the agent to a mock request payload inside a sandbox and trace the network egress before allowing access to real customer data."],"contract":{"contractStatus":"missing","authModes":[],"requires":[],"forbidden":[],"supportsMcp":false,"supportsA2a":false,"supportsStreaming":false,"inputSchemaRef":null,"outputSchemaRef":null,"dataRegion":null,"contractUpdatedAt":null,"sourceUpdatedAt":null,"freshnessSeconds":null},"invocationGuide":{"preferredApi":{"snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-emergencescience-blender-bpy-enhanced/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-emergencescience-blender-bpy-enhanced/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-emergencescience-blender-bpy-enhanced/trust"},"curlExamples":["curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-emergencescience-blender-bpy-enhanced/snapshot\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-emergencescience-blender-bpy-enhanced/contract\"","curl -s \"https://www.xpersona.co/api/v1/agents/clawhub-emergencescience-blender-bpy-enhanced/trust\""],"jsonRequestTemplate":{"query":"summarize this repo","constraints":{"maxLatencyMs":2000,"protocolPreference":["OPENCLEW"]}},"jsonResponseTemplate":{"ok":true,"result":{"summary":"...","confidence":0.9},"meta":{"source":"CLAWHUB","generatedAt":"2026-10-10T23:45:41.870Z"}},"retryPolicy":{"maxAttempts":3,"backoffMs":[500,1500,3500],"retryableConditions":["HTTP_429","HTTP_503","NETWORK_TIMEOUT"]}},"endpoints":{"dossierUrl":"https://www.xpersona.co/api/v1/agents/clawhub-emergencescience-blender-bpy-enhanced/dossier","snapshotUrl":"https://www.xpersona.co/api/v1/agents/clawhub-emergencescience-blender-bpy-enhanced/snapshot","contractUrl":"https://www.xpersona.co/api/v1/agents/clawhub-emergencescience-blender-bpy-enhanced/contract","trustUrl":"https://www.xpersona.co/api/v1/agents/clawhub-emergencescience-blender-bpy-enhanced/trust"}},"reliability":{"evidence":{"source":"runtime-metrics","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No trust, reliability, or runtime telemetry is available."},"trust":{"status":"unavailable","handshakeStatus":"UNKNOWN","verificationFreshnessHours":null,"reputationScore":null,"p95LatencyMs":null,"successRate30d":null,"fallbackRate":null,"attempts30d":null,"trustUpdatedAt":null,"trustConfidence":"unknown","sourceUpdatedAt":null,"freshnessSeconds":null},"decisionGuardrails":{"doNotUseIf":["Contract metadata is missing or unavailable for deterministic execution."],"safeUseWhen":[],"riskFlags":["missing_or_unavailable_contract","trust_data_unavailable","schema_references_missing"],"operationalConfidence":"low"},"executionMetrics":{"observedLatencyMsP50":null,"observedLatencyMsP95":null,"estimatedCostUsd":null,"uptime30d":null,"rateLimitRpm":null,"rateLimitBurst":null,"lastVerifiedAt":null,"verificationSource":null},"runtimeMetrics":{"successRate":null,"avgLatencyMs":null,"avgCostUsd":null,"hallucinationRate":null,"retryRate":null,"disputeRate":null,"p50Latency":null,"p95Latency":null,"lastUpdated":null}},"benchmarks":{"evidence":{"source":"no-benchmark-data","verified":false,"confidence":"low","updatedAt":null,"emptyReason":"No benchmark suites or observed failure patterns are available."},"suites":[],"failurePatterns":[]},"artifacts":{"evidence":{"source":"CLAWHUB","verified":false,"confidence":"high","updatedAt":"2026-10-10T21:09:45.630Z","emptyReason":null},"readme":"Skill: Blender Bpy Enhanced\n\nOwner: emergencescience\n\nSummary: Comprehensive Blender automation via Python bpy API. Procedural modeling, material nodes, lighting, rendering, and asset generation. Includes verified gear/m...\n\nTags: 3d:2.0.0, blender:2.0.0, creative:2.0.0, latest:2.2.0, procedural:2.0.0\n\nVersion history:\n\nv2.2.0 | 2026-06-02T13:03:35.365Z | auto\n\nblender-bpy-enhanced v2.2.0\n\n- Added support for glass/ice material creation, with examples for refractive materials.\n- Improved camera setup: now uses mathutils and quaternion-based look-at for more reliable orientation.\n- Rendering now defaults to Cycles engine with GPU Metal acceleration support on macOS, plus built-in denoising.\n- Expanded tags to include \"3d-printing\".\n- Documentation and code patterns updated to reflect new material, rendering, and camera features.\n- Internal meta and documentation files updated; obsolete files removed.\n\nv2.0.0 | 2026-05-30T06:03:06.377Z | user\n\nv2.0.0: Complete rewrite with procedural gear demo, metal materials, 3-point lighting, Eevee/Cycles render support, and common pitfalls guide. Enhanced from skillhub:blender-bpy v1.0.0\n\nArchive index:\n\nArchive v2.2.0: 5 files, 12801 bytes\n\nFiles: _meta.json (139b), demo_gear.py (10193b), scripts/blender_demo_gear.py (10193b), skill-card.md (1770b), SKILL.md (12844b)\n\nFile v2.2.0:SKILL.md\n\n---\nname: blender-bpy\ntitle: Blender 3D Automation — Python bpy Scripting\ndescription: Comprehensive Blender automation via Python bpy API. Procedural modeling, material nodes, lighting, rendering, and asset generation. Includes verified gear/mechanical parts demo.\nversion: 2.2.0\nauthor: Approxima (via skillhub.cn)\ntags: [blender, 3d, modeling, rendering, bpy, procedural, automation, 3d-printing]\nrequires:\n  bins: [blender]\n---\n\n# Blender Python Automation (bpy) — v2.2.0\n\n## When to Use This Skill\n\nInvoke when the user wants to:\n- Create 3D objects procedurally (gears, mechanical parts, architectural elements)\n- Set up materials with node-based textures (metal, brushed, procedural)\n- Configure 3-point lighting and camera\n- Render still images or animations in headless mode\n- Batch process or automate Blender workflows\n- Export to GLB/glTF for web or game engines\n\n## Prerequisites\n\n```bash\n# Install Blender\napt-get install blender   # Linux (Debian/Ubuntu)\n# Or: brew install blender  # macOS\n\n# Verify\nblender --version\n```\n\n## Core Patterns\n\n### 1. Headless Execution\n```bash\nblender --background --python script.py\n```\n\n### 2. Scene Setup\n```python\nimport bpy, math\n\n# Clear scene\nbpy.ops.object.select_all(action='SELECT')\nbpy.ops.object.delete(use_global=False)\nfor mat in list(bpy.data.materials):\n    bpy.data.materials.remove(mat)\n```\n\n### 3. Procedural Gear Creation\n```python\ndef create_gear(name, radius=2.0, teeth=16, thickness=0.8):\n    \"\"\"Create a gear with teeth and center hole\"\"\"\n    # Base cylinder\n    bpy.ops.mesh.primitive_cylinder_add(\n        vertices=teeth * 4,\n        radius=radius,\n        depth=thickness,\n        location=(0, 0, 0)\n    )\n    gear = bpy.context.object\n    gear.name = name\n    \n    # Edit mode: select vertices at tooth positions\n    bpy.ops.object.mode_set(mode='EDIT')\n    bpy.ops.mesh.select_all(action='DESELECT')\n    \n    for v in gear.data.vertices:\n        angle = math.atan2(v.co.y, v.co.x)\n        tooth_angle = 2 * math.pi / teeth\n        angle_diff = abs((angle % tooth_angle) - tooth_angle / 2)\n        if angle_diff < tooth_angle * 0.35:\n            v.select = True\n    \n    # Extrude and scale for teeth\n    bpy.ops.mesh.extrude_region_move(\n        TRANSFORM_OT_translate={\"value\": (0, 0, 0)}\n    )\n    bpy.ops.transform.resize(\n        value=((radius + 0.4) / radius,) * 2 + (1,),\n        orient_type='GLOBAL'\n    )\n    bpy.ops.object.mode_set(mode='OBJECT')\n    \n    # Center hole via Boolean\n    bpy.ops.mesh.primitive_cylinder_add(\n        vertices=32, radius=0.5,\n        depth=thickness * 1.5, location=(0, 0, 0)\n    )\n    cutter = bpy.context.object\n    bool_mod = gear.modifiers.new(name=\"Hole\", type='BOOLEAN')\n    bool_mod.operation = 'DIFFERENCE'\n    bool_mod.object = cutter\n    bpy.context.view_layer.objects.active = gear\n    gear.select_set(True)\n    bpy.ops.object.modifier_apply(modifier=\"Hole\")\n    bpy.data.objects.remove(cutter, do_unlink=True)\n    \n    # Modifier stack\n    bevel = gear.modifiers.new(name=\"Bevel\", type='BEVEL')\n    bevel.width = 0.05; bevel.segments = 2; bevel.limit_method = 'ANGLE'\n    subdiv = gear.modifiers.new(name=\"Subdivision\", type='SUBSURF')\n    subdiv.levels = 1; subdiv.render_levels = 2\n    \n    return gear\n```\n\n### 4. Procedural Metal Material (Node-based)\n```python\ndef create_metal_material(name, base_color, metallic=0.85, roughness=0.25,\n                          noise_scale=30.0, use_brushed=True):\n    \"\"\"Create a procedural metal material with optional brushed effect\"\"\"\n    mat = bpy.data.materials.new(name=name)\n    mat.use_nodes = True\n    nodes = mat.node_tree.nodes\n    links = mat.node_tree.links\n    nodes.clear()\n    \n    output = nodes.new(type='ShaderNodeOutputMaterial')\n    output.location = (400, 0)\n    \n    bsdf = nodes.new(type='ShaderNodeBsdfPrincipled')\n    bsdf.location = (0, 0)\n    bsdf.inputs['Base Color'].default_value = base_color\n    bsdf.inputs['Metallic'].default_value = metallic\n    bsdf.inputs['Roughness'].default_value = roughness\n    \n    if use_brushed:\n        tex = nodes.new(type='ShaderNodeTexCoord')\n        tex.location = (-400, 100)\n        noise = nodes.new(type='ShaderNodeTexNoise')\n        noise.location = (-200, 0)\n        noise.inputs['Scale'].default_value = noise_scale\n        noise.inputs['Detail'].default_value = 2.0\n        ramp = nodes.new(type='ShaderNodeValToRGB')\n        ramp.location = (0, 100)\n        ramp.color_ramp.elements[0].color = (\n            base_color[0]*0.8, base_color[1]*0.8, base_color[2]*0.8, 1.0)\n        ramp.color_ramp.elements[1].color = (\n            base_color[0]*1.1, base_color[1]*1.1, base_color[2]*1.1, 1.0)\n        \n        links.new(tex.outputs['Object'], noise.inputs['Vector'])\n        links.new(noise.outputs['Fac'], ramp.inputs['Fac'])\n        links.new(ramp.outputs['Color'], bsdf.inputs['Base Color'])\n    \n    links.new(bsdf.outputs['BSDF'], output.inputs['Surface'])\n    return mat\n```\n\n### 5. 3-Point Lighting Setup\n```python\ndef setup_lighting(base_intensity=600):\n    \"\"\"Standard 3-point lighting: key, fill, rim\"\"\"\n    # Key light (main)\n    key = bpy.ops.object.light_add(\n        type='AREA', location=(5, -4, 6),\n        rotation=(0.8, 0, 0.7))\n    key = bpy.context.object\n    key.data.energy = base_intensity\n    key.data.size = 4\n    \n    # Fill light\n    fill = bpy.ops.object.light_add(\n        type='AREA', location=(-4, 3, 3),\n        rotation=(0.5, 0, -1.0))\n    fill = bpy.context.object\n    fill.data.energy = base_intensity * 0.5\n    fill.data.size = 3\n    \n    # Rim/back light\n    rim = bpy.ops.object.light_add(\n        type='AREA', location=(0, 5, 5),\n        rotation=(0.5, 0, 1.57))\n    rim = bpy.context.object\n    rim.data.energy = base_intensity * 0.4\n    rim.data.size = 2\n```\n\n### 6. Camera Setup & Dynamic Look-At\n```python\ndef setup_camera(location=(5.5, -4.5, 3.5), target=(0, 0, 0)):\n    bpy.ops.object.camera_add(location=location)\n    cam = bpy.context.object\n    \n    # Point camera at target dynamically using quaternions (mathutils)\n    direction = mathutils.Vector(target) - cam.location\n    rot_quat = direction.to_track_quat('-Z', 'Y')\n    cam.rotation_euler = rot_quat.to_euler()\n    \n    bpy.context.scene.camera = cam\n    return cam\n```\n\n### 7. Rendering\n```python\ndef render(output_path=\"/tmp/render.png\", engine='CYCLES',\n           width=1080, height=1080, samples=64):\n    scene = bpy.context.scene\n    scene.render.engine = engine\n    scene.render.resolution_x = width\n    scene.render.resolution_y = height\n    scene.render.filepath = output_path\n    scene.render.image_settings.file_format = 'PNG'\n    \n    if engine == 'CYCLES':\n        scene.cycles.samples = samples\n        scene.cycles.use_denoising = True\n        \n        # Configure Metal GPU on macOS if available\n        try:\n            bpy.context.preferences.addons['cycles'].preferences.compute_device_type = 'METAL'\n            bpy.context.preferences.addons['cycles'].preferences.get_devices()\n            for d in bpy.context.preferences.addons['cycles'].preferences.devices:\n                if d.type == 'METAL':\n                    d.use = True\n        except Exception:\n            pass\n            \n    bpy.ops.render.render(write_still=True)\n```\n\n### 8. Solid Glass / Ice Material\n```python\ndef create_glass_material(name=\"Glass\", color=(0.9, 0.95, 1.0, 1.0), roughness=0.1, ior=1.309):\n    \"\"\"Create refractive glass or ice material. IOR: 1.309 (ice), 1.5 (glass)\"\"\"\n    mat = bpy.data.materials.new(name=name)\n    mat.use_nodes = True\n    nodes = mat.node_tree.nodes\n    links = mat.node_tree.links\n    nodes.clear()\n    \n    bsdf = nodes.new(type='ShaderNodeBsdfPrincipled')\n    output = nodes.new(type='ShaderNodeOutputMaterial')\n    links.new(bsdf.outputs['BSDF'], output.inputs['Surface'])\n    \n    bsdf.inputs['Base Color'].default_value = color\n    bsdf.inputs['Roughness'].default_value = roughness\n    bsdf.inputs['IOR'].default_value = ior\n    \n    # Enable transparency (Transmission)\n    if 'Transmission Weight' in bsdf.inputs:\n        bsdf.inputs['Transmission Weight'].default_value = 1.0\n    elif 'Transmission' in bsdf.inputs:\n        bsdf.inputs['Transmission'].default_value = 1.0\n        \n    return mat\n```\n\n### 9. Advanced Boolean Modeling (One-by-One Carving & Overlaps)\nWhen carving grooves or features into a mesh:\n* **Avoid Bulk Cuts**: Subtracting a complex, self-intersecting mesh (e.g. intersecting tubes) all at once makes the `EXACT` solver delete the geometry (vertex count becomes 0). Carve individual loops **one-by-one** instead.\n* **Overlapping Geometry**: Always make cutter objects overlap the boundaries of the base object (e.g. extending slightly outside and deeper inside). Co-incident boundaries cause the `EXACT` solver to fail and skip subtraction.\n* **Capping Curves**: When converting curves to meshes for cutting, set `curve_data.use_fill_caps = True` before conversion. Combine with a `Subdivision Surface` modifier for clean rounded tips.\n\n### 10. 100% Procedural Coordinate Shader Seams (No Mesh Cuts)\nFor perfect geometry and flawless renderings on regular solids (like spheres), define seams directly in the shader nodes using object coordinates instead of modifying geometry:\n* **Basketball Curved Seams Formula**: \n  $$|x| = \\sqrt{1 - z^2} \\cos\\left(\\theta_d \\sqrt{1 - z^2}\\right)$$\n* **Map Range & Masking**: Map the resulting distance to a `SMOOTHERSTEP` mask from $[w, w+s]$ to $[0, 1]$. Use this mask to mix Colors (Black vs. Orange), Roughness, and normal Height inputs into a single Bump node.\n\n### 11. 3D Printing & Watertight Export (Solidify/Decimate)\nWhen creating models intended for physical 3D printing (e.g. FDM/SLA):\n* **Real-World Units**: Explicitly set the scene scale. Usually, 1 Blender unit represents 1 cm or 1 mm:\n  ```python\n  scene = bpy.context.scene\n  scene.unit_settings.system = 'METRIC'\n  scene.unit_settings.scale_length = 0.01  # 1 unit = 1 cm (Pop Mart standard)\n  ```\n* **Hollow/Wall Thickness**: 3D models cannot have zero-thickness surfaces. Use the `Solidify` modifier to give surfaces a physical thickness (typically 1.2mm to 2.0mm):\n  ```python\n  solid = obj.modifiers.new(name=\"Solidify\", type='SOLIDIFY')\n  solid.thickness = 0.12  # 1.2 mm (if 1 unit = 1 cm)\n  solid.offset = -1.0     # Solidify inward\n  ```\n* **Poly Count Optimization**: Large vertex counts slow down slicers. Use a `Decimate` modifier to reduce poly count prior to export:\n  ```python\n  decimate = obj.modifiers.new(name=\"Decimate\", type='DECIMATE')\n  decimate.ratio = 0.15   # Keep 15% of faces\n  ```\n* **Watertight STL Export**: Ensure geometry is manifold, then export using standard operators:\n  ```python\n  # Blender 4.0+ uses standard wm operators for STL export\n  bpy.ops.wm.stl_export(filepath=\"model.stl\", export_selected=True)\n  # Older Blender (<4.0):\n  # bpy.ops.export_mesh.stl(filepath=\"model.stl\", use_selection=True)\n  ```\n\n### 12. Loading Background Reference Image Planes\nTo align procedural elements to concept art (front/side/top views), programmatically load images as background planes:\n```python\ndef load_reference_image(filepath, name=\"ReferenceImage\", location=(0, 0, 0), rotation=(1.5708, 0, 0)):\n    # Create an empty object of type IMAGE\n    bpy.ops.object.empty_add(type='IMAGE', location=location, rotation=rotation)\n    empty = bpy.context.object\n    empty.name = name\n    \n    # Load and assign the image data\n    try:\n        img = bpy.data.images.load(filepath)\n        empty.data = img\n        empty.empty_display_size = 5.0  # scale size\n        # Optional: set opacity\n        empty.use_empty_image_alpha = True\n        empty.empty_image_depth = 'BACK'  # display behind mesh\n    except Exception as e:\n        print(f\"Error loading reference image: {e}\")\n```\n\n## Render Engines\n\n| Engine | Best For | Notes |\n|--------|----------|-------|\n| `BLENDER_EEVEE` | Fast preview, real-time | No denoiser needed, good for quick checks |\n| `CYCLES` | Photorealistic | Essential for glass reflection and refraction. Use `samples=64` or `128` with Denoising. |\n\n## Common Pitfalls\n\n* **Boolean Exact solver deletes mesh (Vertices = 0)** → Check for self-intersections or co-incident surfaces in the cutter. Switch to `'FLOAT'` (called `'FAST'` in Blender <4.0), ensure cutter overlapping boundaries, or perform Boolean carving one-by-one.\n* **Hollow tubes when converting curves to mesh** → Enable caps before converting: `curve_data.use_fill_caps = True`.\n* **Glass rendering looks flat or dark** → Glass requires light reflections to look realistic. Add a dark reflective metallic ground plane (`Roughness=0.3, Metallic=0.85`), a high-contrast rim/back light, and use the `CYCLES` render engine.\n* **Deprecation warning on Material.use_nodes** → In Blender 6.0+, `use_nodes` will be removed as nodes are always enabled. Check compatibility but safely use it for current versions.\n\nFile v2.2.0:_meta.json\n\n{\n  \"ownerId\": \"kn7c83ffhzqbhaqes1fdt9t5e5825jme\",\n  \"slug\": \"blender-bpy-enhanced\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1780405415365\n}\n\nFile v2.2.0:skill-card.md\n\n## Description:\n\nComprehensive Blender automation via the Python bpy API for procedural modeling, material nodes, lighting, rendering, asset generation, and gear or mechanical parts demos.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[emergencescience](https://clawhub.ai/user/emergencescience)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and technical artists use this skill to generate Blender Python scripts for procedural 3D assets, materials, lighting, rendering, batch automation, and export workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Example and demo scripts can delete the current Blender scene and remove existing materials.\n\nMitigation: Review scripts before execution and run demos only in a new or disposable Blender file, not an active project.\n\nRisk: Demo scripts save render and blend outputs to fixed temporary paths without confirmation.\n\nMitigation: Change output paths to private or user-selected locations before rendering or saving.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with inline Python and bash code blocks]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces Blender bpy scripting guidance and runnable script patterns that should be reviewed before execution.]\n\n## Skill Version(s):\n\n2.2.0 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment.\n\nArchive v2.0.0: 5 files, 10918 bytes\n\nFiles: demo_gear.py (10193b), scripts/blender_demo_gear.py (10193b), skill-card.md (2090b), SKILL.md (8021b), _meta.json (139b)\n\nFile v2.0.0:SKILL.md\n\n---\nname: blender-bpy\ntitle: Blender 3D Automation — Python bpy Scripting\ndescription: Comprehensive Blender automation via Python bpy API. Procedural modeling, material nodes, lighting, rendering, and asset generation. Includes verified gear/mechanical parts demo.\nversion: 2.0.0\nauthor: Approxima (via skillhub.cn)\ntags: [blender, 3d, modeling, rendering, bpy, procedural, automation]\nrequires:\n  bins: [blender]\n---\n\n# Blender Python Automation (bpy) — v2.0.0\n\n## When to Use This Skill\n\nInvoke when the user wants to:\n- Create 3D objects procedurally (gears, mechanical parts, architectural elements)\n- Set up materials with node-based textures (metal, brushed, procedural)\n- Configure 3-point lighting and camera\n- Render still images or animations in headless mode\n- Batch process or automate Blender workflows\n- Export to GLB/glTF for web or game engines\n\n## Prerequisites\n\n```bash\n# Install Blender\napt-get install blender   # Linux (Debian/Ubuntu)\n# Or: brew install blender  # macOS\n\n# Verify\nblender --version\n```\n\n## Core Patterns\n\n### 1. Headless Execution\n```bash\nblender --background --python script.py\n```\n\n### 2. Scene Setup\n```python\nimport bpy, math\n\n# Clear scene\nbpy.ops.object.select_all(action='SELECT')\nbpy.ops.object.delete(use_global=False)\nfor mat in list(bpy.data.materials):\n    bpy.data.materials.remove(mat)\n```\n\n### 3. Procedural Gear Creation\n```python\ndef create_gear(name, radius=2.0, teeth=16, thickness=0.8):\n    \"\"\"Create a gear with teeth and center hole\"\"\"\n    # Base cylinder\n    bpy.ops.mesh.primitive_cylinder_add(\n        vertices=teeth * 4,\n        radius=radius,\n        depth=thickness,\n        location=(0, 0, 0)\n    )\n    gear = bpy.context.object\n    gear.name = name\n    \n    # Edit mode: select vertices at tooth positions\n    bpy.ops.object.mode_set(mode='EDIT')\n    bpy.ops.mesh.select_all(action='DESELECT')\n    \n    for v in gear.data.vertices:\n        angle = math.atan2(v.co.y, v.co.x)\n        tooth_angle = 2 * math.pi / teeth\n        angle_diff = abs((angle % tooth_angle) - tooth_angle / 2)\n        if angle_diff < tooth_angle * 0.35:\n            v.select = True\n    \n    # Extrude and scale for teeth\n    bpy.ops.mesh.extrude_region_move(\n        TRANSFORM_OT_translate={\"value\": (0, 0, 0)}\n    )\n    bpy.ops.transform.resize(\n        value=((radius + 0.4) / radius,) * 2 + (1,),\n        orient_type='GLOBAL'\n    )\n    bpy.ops.object.mode_set(mode='OBJECT')\n    \n    # Center hole via Boolean\n    bpy.ops.mesh.primitive_cylinder_add(\n        vertices=32, radius=0.5,\n        depth=thickness * 1.5, location=(0, 0, 0)\n    )\n    cutter = bpy.context.object\n    bool_mod = gear.modifiers.new(name=\"Hole\", type='BOOLEAN')\n    bool_mod.operation = 'DIFFERENCE'\n    bool_mod.object = cutter\n    bpy.context.view_layer.objects.active = gear\n    gear.select_set(True)\n    bpy.ops.object.modifier_apply(modifier=\"Hole\")\n    bpy.data.objects.remove(cutter, do_unlink=True)\n    \n    # Modifier stack\n    bevel = gear.modifiers.new(name=\"Bevel\", type='BEVEL')\n    bevel.width = 0.05; bevel.segments = 2; bevel.limit_method = 'ANGLE'\n    subdiv = gear.modifiers.new(name=\"Subdivision\", type='SUBSURF')\n    subdiv.levels = 1; subdiv.render_levels = 2\n    \n    return gear\n```\n\n### 4. Procedural Metal Material (Node-based)\n```python\ndef create_metal_material(name, base_color, metallic=0.85, roughness=0.25,\n                          noise_scale=30.0, use_brushed=True):\n    \"\"\"Create a procedural metal material with optional brushed effect\"\"\"\n    mat = bpy.data.materials.new(name=name)\n    mat.use_nodes = True\n    nodes = mat.node_tree.nodes\n    links = mat.node_tree.links\n    nodes.clear()\n    \n    output = nodes.new(type='ShaderNodeOutputMaterial')\n    output.location = (400, 0)\n    \n    bsdf = nodes.new(type='ShaderNodeBsdfPrincipled')\n    bsdf.location = (0, 0)\n    bsdf.inputs['Base Color'].default_value = base_color\n    bsdf.inputs['Metallic'].default_value = metallic\n    bsdf.inputs['Roughness'].default_value = roughness\n    \n    if use_brushed:\n        tex = nodes.new(type='ShaderNodeTexCoord')\n        tex.location = (-400, 100)\n        noise = nodes.new(type='ShaderNodeTexNoise')\n        noise.location = (-200, 0)\n        noise.inputs['Scale'].default_value = noise_scale\n        noise.inputs['Detail'].default_value = 2.0\n        ramp = nodes.new(type='ShaderNodeValToRGB')\n        ramp.location = (0, 100)\n        ramp.color_ramp.elements[0].color = (\n            base_color[0]*0.8, base_color[1]*0.8, base_color[2]*0.8, 1.0)\n        ramp.color_ramp.elements[1].color = (\n            base_color[0]*1.1, base_color[1]*1.1, base_color[2]*1.1, 1.0)\n        \n        links.new(tex.outputs['Object'], noise.inputs['Vector'])\n        links.new(noise.outputs['Fac'], ramp.inputs['Fac'])\n        links.new(ramp.outputs['Color'], bsdf.inputs['Base Color'])\n    \n    links.new(bsdf.outputs['BSDF'], output.inputs['Surface'])\n    return mat\n```\n\n### 5. 3-Point Lighting Setup\n```python\ndef setup_lighting(base_intensity=600):\n    \"\"\"Standard 3-point lighting: key, fill, rim\"\"\"\n    # Key light (main)\n    key = bpy.ops.object.light_add(\n        type='AREA', location=(5, -4, 6),\n        rotation=(0.8, 0, 0.7))\n    key = bpy.context.object\n    key.data.energy = base_intensity\n    key.data.size = 4\n    \n    # Fill light\n    fill = bpy.ops.object.light_add(\n        type='AREA', location=(-4, 3, 3),\n        rotation=(0.5, 0, -1.0))\n    fill = bpy.context.object\n    fill.data.energy = base_intensity * 0.5\n    fill.data.size = 3\n    \n    # Rim/back light\n    rim = bpy.ops.object.light_add(\n        type='AREA', location=(0, 5, 5),\n        rotation=(0.5, 0, 1.57))\n    rim = bpy.context.object\n    rim.data.energy = base_intensity * 0.4\n    rim.data.size = 2\n```\n\n### 6. Camera Setup\n```python\ndef setup_camera(location=(5.5, -4.5, 3.5), target=(0, 0, 0)):\n    bpy.ops.object.camera_add(location=location)\n    cam = bpy.context.object\n    # Point camera at target\n    direction = (target[0] - location[0],\n                 target[1] - location[1],\n                 target[2] - location[2])\n    cam.rotation_euler = (\n        math.asin(direction[2] / math.sqrt(sum(d**2 for d in direction))),\n        0,\n        math.atan2(direction[1], direction[0]) + math.pi/2\n    )\n    bpy.context.scene.camera = cam\n    return cam\n```\n\n### 7. Rendering\n```python\ndef render(output_path=\"/tmp/render.png\", engine='BLENDER_EEVEE',\n           width=1920, height=1080, percentage=50):\n    scene = bpy.context.scene\n    scene.render.engine = engine\n    scene.render.resolution_x = width\n    scene.render.resolution_y = height\n    scene.render.resolution_percentage = percentage\n    scene.render.filepath = output_path\n    scene.render.image_settings.file_format = 'PNG'\n    bpy.ops.render.render(write_still=True)\n    print(f\"✅ Rendered: {scene.render.filepath}\")\n```\n\n## Complete Demo: Procedural Gear\n\nSee `scripts/demo_gear.py` for the full working demo.\n\n```bash\nblender --background --python scripts/demo_gear.py\n```\n\nOutput: `/tmp/blender_demo_gear.png` and `/tmp/blender_demo_gear.blend`\n\n## Render Engines\n\n| Engine | Best For | Notes |\n|--------|----------|-------|\n| `BLENDER_EEVEE` | Fast preview, real-time | No denoiser needed, good for demos |\n| `CYCLES` | Photorealistic | Needs OpenImageDenoiser; use `samples=128` for quick tests |\n\n## Common Pitfalls\n\n- **Render fails with \"Build without OpenImageDenoiser\"** → Switch to Eevee: `scene.render.engine = 'BLENDER_EEVEE'`\n- **Boolean modifier not applying** → Set `gear.select_set(True)` and `bpy.context.view_layer.objects.active = gear` first\n- **Bmesh edit mode errors** → Always call `bpy.ops.object.mode_set(mode='EDIT')` before `bmesh.from_edit_mesh()`\n- **Material not showing on export** → Must assign to object's face data: `obj.data.materials.append(mat)`\n- **Grid primitive fails** → In Blender 4.0+, use `x_subdivisions=N` and `y_subdivisions=N` instead of `subdivisions=N`\n- **Headless EGL warnings** → These are harmless; Eevee falls back to surfaceless rendering automatically\n\nFile v2.0.0:_meta.json\n\n{\n  \"ownerId\": \"kn7c83ffhzqbhaqes1fdt9t5e5825jme\",\n  \"slug\": \"blender-bpy-enhanced\",\n  \"version\": \"2.0.0\",\n  \"publishedAt\": 1780120986377\n}\n\nFile v2.0.0:skill-card.md\n\n## Description: <br>\nComprehensive Blender automation via Python bpy API for procedural modeling, material nodes, lighting, rendering, and asset generation, including a gear and mechanical parts demo. <br>\n\nThis skill is ready for commercial/non-commercial use. <br>\n\n## Publisher: <br>\n[emergencescience](https://clawhub.ai/user/emergencescience) <br>\n\n### License/Terms of Use: <br>\nMIT-0 <br>\n\n\n## Use Case: <br>\nDevelopers and technical artists use this skill to generate Blender Python guidance, scripts, and commands for procedural 3D assets, lighting, rendering, batch automation, and GLB/glTF-oriented workflows. <br>\n\n### Deployment Geography for Use: <br>\nGlobal <br>\n\n## Known Risks and Mitigations: <br>\nRisk: Blender Python scripts can alter the current scene and render settings. <br>\nMitigation: Review generated code before execution and run demos in headless Blender or a fresh throwaway scene. <br>\nRisk: The bundled demo writes render and .blend files under /tmp and may overwrite prior demo outputs. <br>\nMitigation: Change output paths before running the demo when existing /tmp Blender demo files should be preserved. <br>\n\n\n## Reference(s): <br>\n- [ClawHub skill page](https://clawhub.ai/emergencescience/blender-bpy-enhanced) <br>\n- [Publisher profile](https://clawhub.ai/user/emergencescience) <br>\n\n\n## Skill Output: <br>\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance] <br>\n**Output Format:** [Markdown with Python and shell code blocks] <br>\n**Output Parameters:** [1D] <br>\n**Other Properties Related to Output:** [May propose Blender bpy scripts and headless Blender commands; generated scripts can write render and .blend outputs to configured paths.] <br>\n\n## Skill Version(s): <br>\n2.0.0 (source: release evidence and SKILL.md frontmatter) <br>\n\n## Ethical Considerations: <br>\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment. <br>","readmeExcerpt":"Skill: Blender Bpy Enhanced Owner: emergencescience Summary: Comprehensive Blender automation via Python bpy API. Procedural modeling, material nodes, lighting, rendering, and asset generation. Includes verified gear/m... Tags: 3d:2.0.0, blender:2.0.0, creative:2.0.0, latest:2.2.0, procedural:2.0.0 Version history: v2.2.0 | 2026-06-02T13:03:35.365Z | auto blender-bpy-enhanced v2.2.0 - Added support for glass/ice mate","codeSnippets":[],"executableExamples":[{"language":"bash","snippet":"# Install Blender\napt-get install blender   # Linux (Debian/Ubuntu)\n# Or: brew install blender  # macOS\n\n# Verify\nblender --version"},{"language":"bash","snippet":"blender --background --python script.py"},{"language":"python","snippet":"import bpy, math\n\n# Clear scene\nbpy.ops.object.select_all(action='SELECT')\nbpy.ops.object.delete(use_global=False)\nfor mat in list(bpy.data.materials):\n    bpy.data.materials.remove(mat)"},{"language":"python","snippet":"def create_gear(name, radius=2.0, teeth=16, thickness=0.8):\n    \"\"\"Create a gear with teeth and center hole\"\"\"\n    # Base cylinder\n    bpy.ops.mesh.primitive_cylinder_add(\n        vertices=teeth * 4,\n        radius=radius,\n        depth=thickness,\n        location=(0, 0, 0)\n    )\n    gear = bpy.context.object\n    gear.name = name\n    \n    # Edit mode: select vertices at tooth positions\n    bpy.ops.object.mode_set(mode='EDIT')\n    bpy.ops.mesh.select_all(action='DESELECT')\n    \n    for v in gear.data.vertices:\n        angle = math.atan2(v.co.y, v.co.x)\n        tooth_angle = 2 * math.pi / teeth\n        angle_diff = abs((angle % tooth_angle) - tooth_angle / 2)\n        if angle_diff < tooth_angle * 0.35:\n            v.select = True\n    \n    # Extrude and scale for teeth\n    bpy.ops.mesh.extrude_region_move(\n        TRANSFORM_OT_translate={\"value\": (0, 0, 0)}\n    )\n    bpy.ops.transform.resize(\n        value=((radius + 0.4) / radius,) * 2 + (1,),\n        orient_type='GLOBAL'\n    )\n    bpy.ops.object.mode_set(mode='OBJECT')\n    \n    # Center hole via Boolean\n    bpy.ops.mesh.primitive_cylinder_add(\n        vertices=32, radius=0.5,\n        depth=thickness * 1.5, location=(0, 0, 0)\n    )\n    cutter = bpy.context.object\n    bool_mod = gear.modifiers.new(name=\"Hole\", type='BOOLEAN')\n    bool_mod.operation = 'DIFFERENCE'\n    bool_mod.object = cutter\n    bpy.context.view_layer.objects.active = gear\n    gear.select_set(True)\n    bpy.ops.object.modifier_apply(modifier=\"Hole\")\n    bpy.data.objects.remove(cutter, do_unlink=True)\n    \n    # Modifier stack\n    bevel = gear.modifiers.new(name=\"Bevel\", type='BEVEL')\n    bevel.width = 0.05; bevel.segments = 2; bevel.limit_method = 'ANGLE'\n    subdiv = gear.modifiers.new(name=\"Subdivision\", type='SUBSURF')\n    subdiv.levels = 1; subdiv.render_levels = 2\n    \n    return gear"},{"language":"python","snippet":"def create_metal_material(name, base_color, metallic=0.85, roughness=0.25,\n                          noise_scale=30.0, use_brushed=True):\n    \"\"\"Create a procedural metal material with optional brushed effect\"\"\"\n    mat = bpy.data.materials.new(name=name)\n    mat.use_nodes = True\n    nodes = mat.node_tree.nodes\n    links = mat.node_tree.links\n    nodes.clear()\n    \n    output = nodes.new(type='ShaderNodeOutputMaterial')\n    output.location = (400, 0)\n    \n    bsdf = nodes.new(type='ShaderNodeBsdfPrincipled')\n    bsdf.location = (0, 0)\n    bsdf.inputs['Base Color'].default_value = base_color\n    bsdf.inputs['Metallic'].default_value = metallic\n    bsdf.inputs['Roughness'].default_value = roughness\n    \n    if use_brushed:\n        tex = nodes.new(type='ShaderNodeTexCoord')\n        tex.location = (-400, 100)\n        noise = nodes.new(type='ShaderNodeTexNoise')\n        noise.location = (-200, 0)\n        noise.inputs['Scale'].default_value = noise_scale\n        noise.inputs['Detail'].default_value = 2.0\n        ramp = nodes.new(type='ShaderNodeValToRGB')\n        ramp.location = (0, 100)\n        ramp.color_ramp.elements[0].color = (\n            base_color[0]*0.8, base_color[1]*0.8, base_color[2]*0.8, 1.0)\n        ramp.color_ramp.elements[1].color = (\n            base_color[0]*1.1, base_color[1]*1.1, base_color[2]*1.1, 1.0)\n        \n        links.new(tex.outputs['Object'], noise.inputs['Vector'])\n        links.new(noise.outputs['Fac'], ramp.inputs['Fac'])\n        links.new(ramp.outputs['Color'], bsdf.inputs['Base Color'])\n    \n    links.new(bsdf.outputs['BSDF'], output.inputs['Surface'])\n    return mat"},{"language":"python","snippet":"def setup_lighting(base_intensity=600):\n    \"\"\"Standard 3-point lighting: key, fill, rim\"\"\"\n    # Key light (main)\n    key = bpy.ops.object.light_add(\n        type='AREA', location=(5, -4, 6),\n        rotation=(0.8, 0, 0.7))\n    key = bpy.context.object\n    key.data.energy = base_intensity\n    key.data.size = 4\n    \n    # Fill light\n    fill = bpy.ops.object.light_add(\n        type='AREA', location=(-4, 3, 3),\n        rotation=(0.5, 0, -1.0))\n    fill = bpy.context.object\n    fill.data.energy = base_intensity * 0.5\n    fill.data.size = 3\n    \n    # Rim/back light\n    rim = bpy.ops.object.light_add(\n        type='AREA', location=(0, 5, 5),\n        rotation=(0.5, 0, 1.57))\n    rim = bpy.context.object\n    rim.data.energy = base_intensity * 0.4\n    rim.data.size = 2"}],"parameters":null,"dependencies":[],"permissions":[],"extractedFiles":[{"path":"SKILL.md","content":"---\nname: blender-bpy\ntitle: Blender 3D Automation — Python bpy Scripting\ndescription: Comprehensive Blender automation via Python bpy API. Procedural modeling, material nodes, lighting, rendering, and asset generation. Includes verified gear/mechanical parts demo.\nversion: 2.2.0\nauthor: Approxima (via skillhub.cn)\ntags: [blender, 3d, modeling, rendering, bpy, procedural, automation, 3d-printing]\nrequires:\n  bins: [blender]\n---\n\n# Blender Python Automation (bpy) — v2.2.0\n\n## When to Use This Skill\n\nInvoke when the user wants to:\n- Create 3D objects procedurally (gears, mechanical parts, architectural elements)\n- Set up materials with node-based textures (metal, brushed, procedural)\n- Configure 3-point lighting and camera\n- Render still images or animations in headless mode\n- Batch process or automate Blender workflows\n- Export to GLB/glTF for web or game engines\n\n## Prerequisites\n\n```bash\n# Install Blender\napt-get install blender   # Linux (Debian/Ubuntu)\n# Or: brew install blender  # macOS\n\n# Verify\nblender --version\n```\n\n## Core Patterns\n\n### 1. Headless Execution\n```bash\nblender --background --python script.py\n```\n\n### 2. Scene Setup\n```python\nimport bpy, math\n\n# Clear scene\nbpy.ops.object.select_all(action='SELECT')\nbpy.ops.object.delete(use_global=False)\nfor mat in list(bpy.data.materials):\n    bpy.data.materials.remove(mat)\n```\n\n### 3. Procedural Gear Creation\n```python\ndef create_gear(name, radius=2.0, teeth=16, thickness=0.8):\n    \"\"\"Create a gear with teeth and center hole\"\"\"\n    # Base cylinder\n    bpy.ops.mesh.primitive_cylinder_add(\n        vertices=teeth * 4,\n        radius=radius,\n        depth=thickness,\n        location=(0, 0, 0)\n    )\n    gear = bpy.context.object\n    gear.name = name\n    \n    # Edit mode: select vertices at tooth positions\n    bpy.ops.object.mode_set(mode='EDIT')\n    bpy.ops.mesh.select_all(action='DESELECT')\n    \n    for v in gear.data.vertices:\n        angle = math.atan2(v.co.y, v.co.x)\n        tooth_angle = 2 * math.pi / teeth\n        angle_diff = abs((angle % tooth_angle) - tooth_angle / 2)\n        if angle_diff < tooth_angle * 0.35:\n            v.select = True\n    \n    # Extrude and scale for teeth\n    bpy.ops.mesh.extrude_region_move(\n        TRANSFORM_OT_translate={\"value\": (0, 0, 0)}\n    )\n    bpy.ops.transform.resize(\n        value=((radius + 0.4) / radius,) * 2 + (1,),\n        orient_type='GLOBAL'\n    )\n    bpy.ops.object.mode_set(mode='OBJECT')\n    \n    # Center hole via Boolean\n    bpy.ops.mesh.primitive_cylinder_add(\n        vertices=32, radius=0.5,\n        depth=thickness * 1.5, location=(0, 0, 0)\n    )\n    cutter = bpy.context.object\n    bool_mod = gear.modifiers.new(name=\"Hole\", type='BOOLEAN')\n    bool_mod.operation = 'DIFFERENCE'\n    bool_mod.object = cutter\n    bpy.context.view_layer.objects.active = gear\n    gear.select_set(True)\n    bpy.ops.object.modifier_apply(modifier=\"Hole\")\n    bpy.data.objects.remove(cutter, do_unlink=True)\n    \n    # Modifier stack\n    bevel = gear.modifiers.new(name="},{"path":"_meta.json","content":"{\n  \"ownerId\": \"kn7c83ffhzqbhaqes1fdt9t5e5825jme\",\n  \"slug\": \"blender-bpy-enhanced\",\n  \"version\": \"2.2.0\",\n  \"publishedAt\": 1780405415365\n}"},{"path":"skill-card.md","content":"## Description:\n\nComprehensive Blender automation via the Python bpy API for procedural modeling, material nodes, lighting, rendering, asset generation, and gear or mechanical parts demos.\n\nThis skill is ready for commercial/non-commercial use.\n\n## Publisher:\n\n[emergencescience](https://clawhub.ai/user/emergencescience)\n\n### License/Terms of Use:\n\nMIT-0\n\n## Use Case:\n\nDevelopers and technical artists use this skill to generate Blender Python scripts for procedural 3D assets, materials, lighting, rendering, batch automation, and export workflows.\n\n### Deployment Geography for Use:\n\nGlobal\n\n## Known Risks and Mitigations:\n\nRisk: Example and demo scripts can delete the current Blender scene and remove existing materials.\n\nMitigation: Review scripts before execution and run demos only in a new or disposable Blender file, not an active project.\n\nRisk: Demo scripts save render and blend outputs to fixed temporary paths without confirmation.\n\nMitigation: Change output paths to private or user-selected locations before rendering or saving.\n\n## Reference(s):\n\n\n## Skill Output:\n\n**Output Type(s):** [text, markdown, code, shell commands, configuration, guidance]\n\n**Output Format:** [Markdown with inline Python and bash code blocks]\n\n**Output Parameters:** [1D]\n\n**Other Properties Related to Output:** [Produces Blender bpy scripting guidance and runnable script patterns that should be reviewed before execution.]\n\n## Skill Version(s):\n\n2.2.0 (source: frontmatter and server release evidence)\n\n## Ethical Considerations:\n\nUsers should evaluate whether this skill is appropriate for their environment, review any generated or modified files before relying on them, and apply their organization's safety, security, and compliance requirements before deployment."}],"languages":[],"docsSourceLabel":"CLAWHUB","editorialOverview":"Comprehensive Blender automation via Python bpy API. Procedural modeling, material nodes, lighting, rendering, and asset generation. Includes verified gear/m... Skill: Blender Bpy Enhanced Owner: emergencescience Summary: Comprehensive Blender automation via Python bpy API. Procedural modeling, material nodes, lighting, rendering, and asset generation. Includes verified gear/m... Tags: 3d:2.0.0, blender:2.0.0, creative:2.0.0, latest:2.2.0, procedural:2.0.0 Version history: v2.2.0 | 2026-06-02T13:03:35.365Z | auto blender-bpy-enhanced v2.2.0 - Added support for glass/ice mate","editorialQuality":{"score":100,"threshold":65,"status":"ready","wordCount":1037,"uniquenessScore":53,"reasons":[]}},"media":{"evidence":{"source":"no-media","verified":false,"confidence":"low","updatedAt":"2026-10-10T21:09:45.630Z","emptyReason":"No screenshots, media assets, or demo links are available."},"primaryImageUrl":null,"mediaAssetCount":0,"assets":[],"demoUrl":null},"ownerResources":{"evidence":{"source":"unclaimed","verified":false,"confidence":"low","updatedAt":"2026-10-10T21:09:45.630Z","emptyReason":"This page has not been claimed by the agent owner."},"hasCustomPage":false,"customPageUpdatedAt":null,"customLinks":[],"structuredLinks":{"docsUrl":null,"demoUrl":null,"supportUrl":null,"pricingUrl":null,"statusUrl":null},"customPage":null},"relatedAgents":{"evidence":{"source":"protocol-neighbors","verified":false,"confidence":"medium","updatedAt":"2026-10-10T23:45:41.871Z","emptyReason":null},"items":[{"id":"8ebccd8e-3863-4187-8355-c3f14e1f9edf","entityType":"agent","canonicalPath":"/agent/iofficeai-aionui","slug":"iofficeai-aionui","name":"AionUi","description":"Free, local, open-source 24/7 Cowork app and OpenClaw for Gemini CLI, Claude Code, Codex, OpenCode, Qwen Code, Goose CLI, Auggie, and more | 🌟 Star if you like it!","url":"https://github.com/iOfficeAI/AionUi","homepage":"https://www.aionui.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-10-09T19:11:12.944Z","createdAt":"2026-02-25T03:38:16.584Z","downloads":null},{"id":"b917f68a-ebff-438e-84f8-3f4b2494c0bc","entityType":"agent","canonicalPath":"/agent/activepieces-activepieces","slug":"activepieces-activepieces","name":"activepieces","description":"AI Agents & MCPs & AI Workflow Automation • (~400 MCP servers for AI agents) • AI Automation / AI Agent with MCPs • AI Workflows & AI Agents • MCPs for AI Agents","url":"https://github.com/activepieces/activepieces","homepage":"https://www.activepieces.com","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-15T02:22:12.426Z","createdAt":"2026-02-25T03:38:12.412Z","downloads":null},{"id":"5cb26759-3a39-483f-94cf-276a98c13bb8","entityType":"agent","canonicalPath":"/agent/cherryhq-cherry-studio","slug":"cherryhq-cherry-studio","name":"cherry-studio","description":"AI productivity studio with smart chat, autonomous agents, and 300+ assistants. Unified access to frontier LLMs","url":"https://github.com/CherryHQ/cherry-studio","homepage":"https://cherry-ai.com","source":"GITHUB_REPOS","protocols":["MCP","OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-04-11T14:38:40.986Z","createdAt":"2026-02-25T03:38:19.379Z","downloads":null},{"id":"6f6582d0-5d76-4f0f-b81d-86520247950b","entityType":"agent","canonicalPath":"/agent/copilotkit-copilotkit","slug":"copilotkit-copilotkit","name":"CopilotKit","description":"The Frontend for Agents & Generative UI. React + Angular","url":"https://github.com/CopilotKit/CopilotKit","homepage":"https://docs.copilotkit.ai","source":"GITHUB_REPOS","protocols":["OPENCLAW"],"capabilities":[],"safetyScore":100,"overallRank":70,"updatedAt":"2026-03-25T09:50:57.846Z","createdAt":"2026-02-25T03:39:14.617Z","downloads":null}],"links":{"hub":"/agent","source":"/agent/source/clawhub","protocols":[{"label":"OpenClaw","href":"/agent/protocol/openclew"}]}}}