Loading...
Loading...
Use when building or debugging Geometry Nodes, headless or live: procedural modeling, scattering objects on a surface, arrays along a curve, repeat or for-each loops, simulation zones, 5.2 physics (cloth, colliders, forces, effectors), closures, bundles, matrices, node-group assets with gizmos. Also when a GN script links nothing, shows red links, ignores modifier inputs, loses instances in a bounding box, or a simulation resets or jumps.
npx skill4agent add scenario-labs/skills scenario-blender-geometry-nodesnpx skills add scenario-labs/skills --skill <name>| Question | Why it changes the plan | Default when silent |
|---|---|---|
| What consumes the result: shader, another modifier, export, physics? | Crossing a boundary needs a named attribute; export may need realized geometry | Named attributes for anything a shader reads; keep instances |
| Does it depend on the previous frame? | Simulation zone and baking vs Scene Time function | Function of time |
| One-off authoring step or reusable asset? | One-off may be applied (Thommes' hair noise); assets never are | Reusable: expose inputs, panels, sensible min/max |
| Scale: element counts, viewport cost | Realize, loops and simulations cost; instances are cheap | Instances, fields, no loops |
| World or object space for directions and ground | Object-local trap | World up, world gravity |
bx_gn.Builderb.node(kind, prop=..., ins={...})b.zone(...)b.join([...])b.done()G.attach(obj, tree, inputs={...})G.set_inputs(md, {...})"attr:NAME"G.check(md)["ok"]hard_refsG.stats(obj)G.attributeG.instance_transformsG.positionsG.snapshot(objs, path, views=..., frames=...)bx_review.reviewreferences/critique.mdG.step(range(...))G.bake(obj)tree.is_modifier = True; tree.asset_mark()scripts/bx_gn.pyscatter_treecurve_array_treegrowth_treeparticle_drop_tree| Value | What it is relative to | Source |
|---|---|---|
| Melt sim: 300 K ambient, 2000 K source, heating 0.05, cooling 0.01 per frame | per-step Mix factors; small because they accumulate | Thommes BCON23 |
| Blur Attribute weight 0.5; smooth 5 iterations; melt mask 500 to 2000 K | heat diffusion and softening | Thommes BCON23 |
| Drip 0.01 per frame along -Z; normal mix 0.1 (0.5 "looks like baking bread") | per-step offset | Thommes BCON23 |
| Tearing threshold 1 = tears as soon as longer than rest (too sensitive); reinforce 10; base random 1 to 1.1; Voronoi mode | edge length ratio | Thommes BCON26 |
| Sewing ramp: rest length x factor 1 to 0 over 1 s of accumulated Delta Time | avoids snapping | Thommes BCON26 |
| Threads on tears: about 2 cm, 3 points each | performance cap | Thommes BCON26 |
| Cloth asset defaults: Substeps 5, Constraint Steps 15, Collision Radius 0.01, Tearing Threshold 1.2 | read from the 5.2.1 asset | digest [verified] |
| Gizmo position = size x 0.5 for a centered grid; random factor 0.2 to 1 on the SECOND input | keeps drags glued | Thommes BCON24 |
| Stack: box origin at its bottom; random scale XY 1 to 1.5, Z 0.05 to 0.3 | Accumulate Field Trailing | Matrix video |
| Flatten regions: island min 5 faces; proximity falloff 0 to 0.2 m, Smoother Step; Volume to Mesh threshold about 0.5 | Erindale exercise | Erindale |
| Realize Instances: Realize All off, Depth 1 | flattens one hierarchy level | Thommes BCON24 |
G.check(md)okhard_refsG.attributeG.time_eval(obj)G.snapshotbx_review| Mistake | What it looks like | Fix |
|---|---|---|
| returns None, nothing links, no error | |
Setting | result unchanged | |
| Random Value with its implicit ID inside a for-each zone | red link, output silently wrong; | zone Index into ID; |
| Same Seed on two Random Value nodes | scale and rotation move together (correlation 1.0 [verified]) | offset seeds (seed + k) |
| State not wired Simulation Input to Output | value resets each frame | wire every state item through |
| Custom attribute inside Cloth or Hair Dynamics | resets every step, no warning | list it in Extra Sim Attributes |
| Hard-referenced controller object in an asset | works once, breaks on reuse | Object socket on the Group Input |
| Coupled fields updated by two nodes | velocity computed from the already-moved position | one Capture Attribute for both |
| Join order assumed = link order | new elements inserted first, solver or ids break | |
| Local direction used as world | effect rotates with the object | Self Object matrix conversion |
| Closure signature by auto-population | ERROR "Closure does not have output" | create both item lists, same names |
md.properties.inputs.<Socket_N>.valuemd["Socket_N"]obj.update_tag()ModeModeModeStageSocket_1Socket_2node.inputs["A"]Gravitybx_gn.sockobj.bound_boxpositioninstance_transformmd.execution_timesimulation_nodes_cache_calculate_to_framesimulation_nodes_cache_bakeGeometryNodeXPBDSolver<DATAFILES>/assets/nodes/geometry_nodes_essentials.blendgeometry_nodes_dynamics_assets.blendprocedural_hair_node_assets.blendG.append_group(name, library)references/expert-notes.mdreferences/procedures.mdreferences/critique.mdreferences/sources.mdscripts/bx_gn.py