{"id":46309,"plugin_id":"plugin_asdk_app_6acd235a70a48191812b3ba9c471b4ac","kind":"skill","collection_source":"plugin_package","comparison_source":null,"observed_at":"2026-10-24T13:29:11.547Z","digest":"c6147c1fd3053d94343d5f9bb25e4347f6de5fe68c319de5222d819d3d030cfc","against":null,"payload":{"description":"Planet & space scenes: realistic textured planets (AI texture layer — take the initiative), stylized procedural planets, atmosphere rims, rings, moons, space lighting and backdrop. Load for prompts like \"planet\", \"earth\", \"mars\", \"moon\", \"solar system\", \"space scene\".","included_files":[],"name":"spline-3d-planets","skill_md_contents":"---\nname: spline-3d-planets\ndescription: \"Planet & space scenes: realistic textured planets (AI texture layer — take the initiative), stylized procedural planets, atmosphere rims, rings, moons, space lighting and backdrop. Load for prompts like \\\"planet\\\", \\\"earth\\\", \\\"mars\\\", \\\"moon\\\", \\\"solar system\\\", \\\"space scene\\\".\"\n---\n\n# Planets & space\n\nA planet is a texture-and-light job, not a geometry job. The user saying\n\"a realistic planet\" IS the ask — generate the surface texture on your own\ninitiative; don't wait for the word \"texture\".\n\n## Realistic planet (the default read of \"planet\")\n\n```\nbackground('#05060f');                                    // deep space\nmesh('Sphere', { width: 400, height: 400, depth: 400 });\nlayer('texture', { style: 'earth-like planet surface, oceans and continents, seamless' });\nlayer('fresnel', { color: '#9ec5ff', alpha: 0.45, scale: 1 }); // atmosphere rim\nshading({ category: 'physical', roughness: 0.9, metalness: 0,\n          bumpMap: 'texture', roughnessMap: 'texture', bumpMapIntensity: 6 });\nrename('Planet');\nlight('Directional', { intensity: 1.1, color: '#fff3df' });      // the sun\n```\n- The planet's slow spin is MOTION, so it lives in the file's motion\n  document (# Motion & interactivity; `animation` skill):\n  `spline.updateObject(planetId, { rotation: { y: (t * 15) % 360 } })`\n  per frame. The moons below ride the same loop.\n- Space is a ONE-light setting: move the sun key up and to one side and let\n  the night side fall dark — no fill. Two defaults fight this: a fresh scene\n  usually already has a Directional Light — reuse it as the sun (or `remove`\n  it) instead of adding a second one — and the page's always-on ambient fill\n  washes the dark side: kill it with `environment({ ambient: false })`, or if\n  the dark side must stay readable keep it dim instead,\n  `environment({ ambient: { color: '#1b2340', intensity: 0.3 } })`. A sun\n  slightly above intensity 1 is OK here ONLY because the ambient fill is\n  disabled — with the ambient on, that same key overexposes.\n- `bumpMap`/`roughnessMap: 'texture'` reuse the surface texture as relief and\n  gloss maps: continents and craters catch the sun, darker oceans read\n  glossier. The shorthand resolves to the material's top texture layer, so\n  keep the `shading` call AFTER `layer('texture', …)`. There is no metalness\n  map — `metalness` stays a plain number.\n- Match the fresnel color to the planet: blue for earth-like, '#e8b28a' dust\n  haze for mars, none for an airless moon.\n- Texture `style` prompts that work — always append 'seamless' (the image\n  wraps the sphere's UVs): 'earth-like planet surface, oceans and continents,\n  seamless'; 'red rocky mars surface, craters and dust, seamless'; 'banded gas\n  giant clouds, beige and rust, seamless'; 'gray cratered moon rock, seamless'.\n- The texture resolves ASYNCHRONOUSLY — a checkerboard placeholder until then.\n  Don't fight it: re-`take_screenshot()` on a later turn. Generation is also a\n  PAID feature — on plans without the AI-texture entitlement the call can fail\n  outright. Either way (error, or a checkerboard that never resolves), fall\n  back to the stylized recipe below (full caveats in materials-and-look).\n\n## Stylized planet (toy / low-poly scenes)\n\nSkip the image; build the surface procedurally — always renders:\n```\nmesh('Sphere', { width: 400, height: 400, depth: 400 });\ncolor('#2f6fb0');                                                // ocean base\nlayer('noise', { alpha: 0.55 });                                 // continents\nlayer('fresnel', { color: '#9ec5ff', alpha: 0.4, scale: 1 });    // atmosphere\nshading({ category: 'physical', roughness: 0.8, metalness: 0 });\n```\n\n## Rings (Saturn look)\n\nA `Torus` flattened on y, tilted, and slightly translucent:\n```\nmesh('Torus', { width: 900, height: 900, depth: 900, tubularSegments: 64 });\nscale({ y: 0.04 });\nrotation({ x: 12, z: 8 });\ncolor('#d8c9a8');\nopacity(0.8);\nrename('Rings');\n```\nMatch the planet's tilt on the planet itself (`rotation({ z: 8 })`) so the\nrings read as equatorial.\n\n## Moons & satellites\n\nSmall spheres at varied distances:\n```\nfor (let i = 0; i < 2; i++) {\n  const d = 90 - i * 30;\n  mesh('Sphere', { width: d, height: d, depth: d });\n  layer('texture', { style: 'gray cratered moon rock, seamless' });\n  shading({ category: 'physical', roughness: 1, metalness: 0,\n            bumpMap: 'texture', bumpMapIntensity: 8 });\n  position({ x: 420 + i * 260, y: 60 + i * 90, z: -120 * i });\n  rename('Moon ' + (i + 1));\n}\n```\nTheir motion is code — the `animation` skill's \"Orbits, spins & travel\":\neach moon gets its OWN orbit radius/speed/phase around the planet\n(`x = px + Math.cos(t * w + phase) * r; z = pz + Math.sin(t * w + phase) * r`\n— a REAL orbit, which states never gave you) plus a slow spin\n(`rotation.y = (t * 20 + i * 40) % 360`), every body out of sync so the\nsystem reads layered, never synchronized.\n\n## Finishing\n\n- `group` the planet, rings, and moons and name the group so the scene tree\n  stays readable. Select them with a name FILTER over the names you set —\n  `select(o => o.name === 'Planet' || o.name === 'Rings' || o.name.startsWith('Moon'))`\n  — NEVER a bare string: `select('Planet')` is the select-ALL wildcard and\n  would sweep the camera and sun into the group. Do the grouping in a LATER\n  `run_code` call than the one that created the objects (filters only see the\n  scene as of the call's start).\n- Frame with `set_view` and screenshot ONCE the texture has had a turn to\n  resolve — judging the look against a checkerboard wastes a screenshot.\n- No post-effects finishing pass: the mood comes from the texture, the\n  fresnel rim, and the lighting. `fx` effects are opt-in — add\n  bloom/vignette only when the user asks for them.\n"},"changes":[],"summary":"First saved snapshot. No earlier version is available for comparison.","summary_kind":"deterministic","summary_metadata":{}}