← SplineCONTENT HISTORY

Update to Spline

Snapshot Oct 24, 2026 · 13:29 UTC · version 1.2.0

Collection source: downloaded plugin package.

WHAT CHANGED

First saved snapshot

No earlier snapshot is available to establish a change.

Save Spline and check future changes in Following.

Up to 10 plugins free · no card required.

Compare saved observations

Download comparison JSON
Full technical diff · 0 changed fields
Full snapshot data
{
  "description": "Hair Systems: simulated strands (hair, fur, grass, fibers) via hair() — growing strands from an object's surface or a built-in scalp, strand shape (length, width, kink/curl, clumping), physics (gravity, wind, stiffness), root/mid/tip coloring or inheriting the base object's surface color, and recipes (character hair, fur, grass). Load for prompts like \"hair\", \"fur\", \"furry\", \"fluffy\", \"grass\", \"beard\", \"mustache\", \"hairy\".",
  "included_files": [],
  "name": "spline-3d-hair",
  "skill_md_contents": "---\nname: spline-3d-hair\ndescription: \"Hair Systems: simulated strands (hair, fur, grass, fibers) via hair() — growing strands from an object's surface or a built-in scalp, strand shape (length, width, kink/curl, clumping), physics (gravity, wind, stiffness), root/mid/tip coloring or inheriting the base object's surface color, and recipes (character hair, fur, grass). Load for prompts like \\\"hair\\\", \\\"fur\\\", \\\"furry\\\", \\\"fluffy\\\", \\\"grass\\\", \\\"beard\\\", \\\"mustache\\\", \\\"hairy\\\".\"\n---\n\n# Hair Systems (simulated strands)\n\nA Hair System is its OWN object type (`'Hair'` in the scene tree): a\nTressFX-style strand simulation with physics, wind, clumping, and root-to-tip\ncoloring — THE tool for hair, fur, grass, and fibers. NEVER model hair as\ncustom geometry (tubes/cones): it reads rigid and fake, and it can't move.\nStrands render on the WebGPU backend (the default); the WebGL fallback does\nnot draw them.\n\n## Create & edit\n\n```\nhair('new', { on: 'Head', hairLength: 1.2 });  // create + configure\nrename('Hair');\n```\n- `hair('new', props?)` creates a hair system (returns it like `mesh` does);\n  `add('Hair')` is the bare equivalent.\n- `hair(props)` (no 'new') MERGES props over the SELECTED hair system(s) —\n  partial props edit it in place, other selected object types are skipped\n  (same edit contract as `particles`). `select(o => o.type === 'Hair')` or\n  by name first when editing later.\n- The system is a normal object: `position`/`rotation`/`scale`/`rename`/\n  `group`/`hide` all work.\n\nThe default system is a shoulder-length auburn head of hair on a built-in\nsphere scalp — gentle gravity, a little wind, simulating while you edit.\nTreat the recipes below as overrides of that.\n\n## Where the strands grow\n\n- `on: 'Head'` (a name, id, or object handle) — grow the strands from that\n  object's surface. THE common ask. Resolved when the commands run, so an\n  object created earlier in the SAME block is a valid base. A group or\n  imported model works too — every visible mesh in its subtree sprouts. An\n  unknown name is silently skipped (the strands keep their current base), so\n  spell it from the scene snapshot. `on: null` detaches back to the\n  built-in sphere.\n- `headShape: 'sphere' | 'torus' | 'cylinder'` — built-in scalp shapes\n  (the scalp is part of the hair object; `headColor` tints it). Passing\n  `on` sets `headShape: 'object'` for you.\n\n## Strand shape\n\n- `hairLength` (0.01–3, default 0.75) — length relative to the base's size.\n- `hairWidth` (0.1–20, default 1.75) — ribbon width; thick = chunky/stylized.\n- `guideStrands` (64–16384, default 8192) — simulated strand count; lower it\n  for wispy coverage or performance, raise for density.\n- `kink` (0–1) + `kinkFrequency` (0–10) — waviness/curl: amplitude and how\n  many waves along each strand. Both 0 (the default) = straight.\n- `clumpStrength` (0–1) + `clumpSize` (4–256 strands) + `clumpTipScale`\n  (0.5–4) — pull neighboring strands into locks; the classic \"styled hair\"\n  cue (0 = loose and uniform).\n- `spreadRadius`, `tipSeparation` — root spread / tip fan-out dials; leave\n  them at their defaults unless a screenshot says otherwise.\n\n## Physics\n\n- `gravity` (−30–30, default 10) — droop. 0 for grass that stands up;\n  negative lifts the strands (floaty / underwater looks).\n- `windStrength` (0–100, default 0) — ambient wind sway. Off by default:\n  windless hair settles and lets the viewport idle; any wind keeps the sim\n  (and its shadow updates) running every frame.\n- `localStiffness` (0–1, default 0.67) — hold each strand's rest shape;\n  high = brush-stiff, low = silky.\n- `globalStiffness` (0–1, default 0.5) + `globalRange` (0–1) — pin strands\n  toward their rest pose over the first fraction of their length (keeps a\n  hairdo from collapsing).\n- `damping`, `elasticity`, `stiffnessFalloff`, `vspCoefficient` — motion\n  fine-tuning; the defaults are well tuned, adjust from a screenshot.\n- `autoPlay` (default true) — keep simulating while editing. Play mode and\n  exports always simulate regardless.\n\n## Color\n\nTwo sources, switched by `hairColorSource`:\n- `'custom'` (default) — a root→mid→tip gradient: `hairRootColor`/\n  `hairMidColor`/`hairTipColor` (hex/CSS strings fine), plus `headColor`\n  for the built-in scalp.\n- `'object'` — each strand samples the BASE OBJECT's surface color at its\n  root (vertex colors, else the material's color/gradient layers, else its\n  flat color) — fur that matches the creature's own patterning.\n  `hairShadeRoot`/`hairShadeTip` (default 0.6/1.15) ramp the inherited\n  color's brightness root→tip (1/1 = verbatim).\n\nExtras: `noiseEnabled: true` mixes a 3D-noise tint over hair + scalp\n(`noiseColorA`–`noiseColorD`, `noiseScale`, `noiseMixHair`/`noiseMixHead`) —\npunk/fantasy multicolor looks. Sheen dials: `specularPower`/\n`specularIntensity`/`diffuseIntensity`/`ambientIntensity`, `opacity`,\n`tipFade` (fade tips to transparent, default 0.4). `castShadow`/\n`receiveShadow` default true.\n\n## Recipes (starting points — screenshot and tune)\n\nCharacter hair on a modeled head:\n```\nhair('new', { on: 'Head', hairLength: 1.4, kink: 0.25, kinkFrequency: 3,\n  clumpStrength: 0.4, clumpSize: 48,\n  hairRootColor: '#2c1a0e', hairMidColor: '#4a2f1a', hairTipColor: '#6b4a2c' });\nrename('Hair');\n```\n\nFur that inherits the creature's surface colors:\n```\nhair('new', { on: 'Fox', hairLength: 0.25, hairWidth: 1.2,\n  hairColorSource: 'object', localStiffness: 0.85, gravity: 2,\n  windStrength: 6 });\nrename('Fur');\n```\n\nGrass on a ground patch (stiff, upright, wind-swayed):\n```\nhair('new', { on: 'Lawn', hairLength: 0.35, hairWidth: 3, gravity: 0,\n  localStiffness: 0.9, windStrength: 10, clumpStrength: 0.15,\n  hairRootColor: '#3f5233', hairMidColor: '#5d7a4d', hairTipColor: '#79975f' });\nrename('Grass');\n```\n(Believable-register greens: olive families, never mint/lime — see # Style\nregister. For a whole lawn, one system on the ground plane beats many small\nones.)\n\n## Gotchas & verifying\n\n- Changing `hairLength`/`spreadRadius`/`guideStrands`/`headShape`/`on`\n  REGROWS the strands from scratch (the sim snaps to the new rest pose);\n  the other props update live.\n- The strands are simulated, so a screenshot taken the instant after a big\n  change may catch them mid-settle — give it a beat, then\n  `take_screenshot()`. `autoPlay` keeps the sim running while editing;\n  `play()` always simulates.\n- Scale the BASE object rather than the hair object to resize a furry thing —\n  strand length follows the base.\n"
}

SHA-256 of public snapshot: d029d882d9b210aed41c008381fdb1e6efc48537fa76a6b454b2f9d58e6f4c56