{"id":"kinetic-mobile","version":"1.0.0","title":"Kinetic Mobile","summary":"A Calder-style hanging mobile of brass arms and lacquered shapes, swaying and creeping round forever. Loops perfectly.","kind":"object","target":"three","collections":["satisfying","product-reveals","hypnotic-loops"],"tags":["mobile","kinetic sculpture","calder","hanging mobile","balance","brass","art","design","studio","loop","3d"],"loopable":true,"motion":"procedural","durationSeconds":20,"status":"published","media":{"poster":"https://aipixelwizard.com/media/kinetic-mobile/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/kinetic-mobile/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/kinetic-mobile/1.0.0/sample.mp4","sampleBytes":1728635,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/kinetic-mobile","manifest":"https://aipixelwizard.com/api/v1/visuals/kinetic-mobile/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/kinetic-mobile/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/kinetic-mobile/1.0.0/","demo":"https://aipixelwizard.com/registry/kinetic-mobile/1.0.0/index.html"},"description":"A hanging mobile in the manner of Alexander Calder: a tree of slender brass arms, each carrying two things on fine strings — a lacquered shape, or another arm that carries two more. Every arm turns about its own string at its own pace, swaying and creeping round, and every shape spins slowly, so the whole sculpture keeps finding new arrangements. Choose how many levels of arms (4, 8 or 16 shapes), the colours (primary, pastel, sunset or mono), how far the arms sway, how many whole turns they creep round per loop, the seed, the backdrop colour and whether the camera sways.","role":"Object (3D, three.js): a calm, designer-feel kinetic sculpture for home, art and design content.","useCases":["An art, design or interiors brand scene","A calm, mindful background","A nursery or kids' product backdrop"],"synonyms":["calder mobile","hanging sculpture","baby mobile","balanced mobile","kinetic art","suspended shapes"],"digest":"24ccb373de0646a7181595a0a60a7da972f4d3386787fe08059a384bd16bc86b","implementation":{"target":"three","runtime":"browser","language":"javascript","module":"esm","entry":"src/kinetic-mobile.js","exports":[{"name":"createMobile","signature":"createMobile({ levels?, palette?, sway?, spin?, seed? }) => { group, setProgress(progress), dispose() }","description":"The mobile hung from y = 8, about 6 wide and 6 tall; needs an environment map."},{"name":"PALETTES","signature":"PALETTES: { primary, pastel, sunset, mono }","description":"Lacquer colours for the shapes."}],"reusable":["src/kinetic-mobile.js"],"demo":"demo.js","harness":"index.html"},"dependencies":[{"id":"three","version":"0.185.1","scope":"source","reason":"Renderer, geometry and shader materials."},{"id":"chrome-material","version":"1.1.0","scope":"demo","reason":"Studio environment light, backdrop and contact shadow."},{"id":"apw-runtime","version":"1.0.0","scope":"demo","reason":"Demo harness."}],"uses":[],"usedBy":[],"params":[{"key":"levels","label":"Levels","help":"Levels of arms: 2 gives 4 shapes, 3 gives 8, 4 gives 16.","type":"integer","min":2,"max":4,"step":1,"default":3},{"key":"palette","label":"Colours","type":"select","default":"primary","options":[{"value":"primary","label":"Primary"},{"value":"pastel","label":"Pastel"},{"value":"sunset","label":"Sunset"},{"value":"mono","label":"Mono"}]},{"key":"sway","label":"Sway","type":"number","min":0,"max":1.6,"step":0.1,"default":1},{"key":"spin","label":"Creep turns","help":"Whole turns the arms creep round per loop.","type":"integer","min":0,"max":2,"step":1,"default":1},{"key":"seed","label":"Seed","type":"integer","min":1,"max":999,"step":1,"default":11},{"key":"background","label":"Backdrop","type":"color","default":"#c9ccd4"},{"key":"orbit","label":"Camera sway","type":"boolean","default":true}],"presets":[{"id":"default","label":"Primary, three levels","params":{}},{"id":"pastel","label":"Pastel, nursery","params":{"palette":"pastel","sway":0.7,"background":"#e8dcd8","seed":4}},{"id":"sunset","label":"Sunset, dark","params":{"palette":"sunset","levels":4,"background":"#241a28"}},{"id":"mono","label":"Mono, two levels","params":{"palette":"mono","levels":2,"spin":0,"background":"#d8d8dc"}}],"output":{"width":1080,"height":1080,"fps":30,"durationSeconds":20,"posterSeconds":4,"alpha":false,"motion":"procedural","loop":{"seamless":true,"cycleSeconds":20,"method":"Every arm creeps round a whole number of turns per loop and sways in a sine of whole cycles of the loop, every shape turns a whole number of times and the camera sway is a sine of the loop, so the last frame meets the first."},"seed":{"param":"seed","behavior":"Seed picks each shape, its size and colour, and each arm's sway pace, direction and phase: same seed, same mobile."}},"composition":{"inputs":"Time within the loop; the levels, colours, sway, creep, seed, backdrop and camera sway.","outputs":"A full frame rendered in 3D with a studio environment.","coordinates":"The mobile hangs from a hook at y ≈ 9.5 on a thread to the root arm at y ≈ 6.7; the root arm is 3.4 wide and each level is 0.58 times the one above; the camera looks at y = 4.8.","lighting":"A warm key light with a shadow map, a shadow-catching floor and the studio environment.","timing":"setProgress(progress) sets every arm's turn and every shape's spin; frames render in any order.","compatibleWith":["chrome-material","orbit-camera","kinetic-title","number-reveal"],"notes":["Arms are nested groups, so each arm's motion carries everything it holds."]},"reuse":["Gallery: Primary, three levels.","Nursery: Pastel.","Evening: Sunset, dark."],"integration":{"newProject":"Create a WebGLRenderer with a studio environment and a shadow-casting light, add createMobile().group and call mobile.setProgress(progress) each frame.","existingProject":"Copy src/kinetic-mobile.js; add the group to your scene with an environment map."},"performance":{"notes":"Up to 16 shapes and 30 arms as separate meshes (a few hundred draw calls at most) with a shadow map: about a millisecond a frame on an integrated Intel GPU.","limits":"Software WebGL renders in about a second a frame."},"limitations":["Arms do not physically balance: the motion is a formula, so heavy shapes do not tilt their arms.","Shapes hang at fixed heights below their arms."],"license":{"spdx":"MIT","notice":"Copyright (c) 2026 AI Pixel Wizard. Released under the MIT License. See LICENSE in this folder.","thirdParty":[]},"rights":{"approvedForPublicRelease":true},"provenance":"Adapted from the owner's threejs-sketches/objects-scenes/kinetic-mobile (MIT) and rebuilt for AI Pixel Wizard in October 2026 as an original studio object: a seeded recursive tree of brass arms and lacquered shapes with whole-turn creep, whole-cycle sway and spinning shapes on an exact loop.","changelog":[{"version":"1.0.0","date":"2026-10-05","notes":"Initial release."}],"verification":{"testedOn":"2026-10-06","inputs":{"kinetic-mobile@1.0.0":"24ccb373de0646a7181595a0a60a7da972f4d3386787fe08059a384bd16bc86b","three@0.185.1":"664ca387e5fab46ff2daaa6895e1d015426850891af5ea5082cbbcc3985b068c","chrome-material@1.1.0":"ecb41776bfc1ee88997604f916a5ffe833f971d7edcc97c855697a5792d6f1dd","apw-runtime@1.0.0":"5be859cdac74823ba0bcc32c6daf06688a871104d24db5d4ceaffffd84d7c40d"},"environment":"Chrome 154.0.8037.97 headless on Linux 7.0.0-38-generic (x64), Node 22.14.0","renderer":"WebGL 2 via SwiftShader (software)","width":1080,"height":1080,"fps":30,"frames":600,"renderSeconds":426.1,"loopCheck":{"checked":true,"seamless":true,"maxDifference":0,"note":"Frame 0 vs end state (progress 1): mean |Δ| 0.0000, max |Δ| 0 of 255."},"determinism":{"checked":true,"identical":true},"errors":[],"media":{"poster":"/media/kinetic-mobile/1.0.0/poster.webp","preview":"/media/kinetic-mobile/1.0.0/preview.mp4","sample":"/media/kinetic-mobile/1.0.0/sample.mp4","sampleBytes":1728635}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/kinetic-mobile/1.0.0/LICENSE"},{"path":"asset.json","size":7888,"sha256":"8334a2e69c1da959794ed3efcabe69fd64ffb6ae65d1e1f7b192175f5ea2e6be","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/kinetic-mobile/1.0.0/asset.json"},{"path":"demo.js","size":2381,"sha256":"00e28e17d9d9a462df5fc767e3887ddf7947ebf8366ca6be43fc1f0b41b43d66","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/kinetic-mobile/1.0.0/demo.js"},{"path":"index.html","size":528,"sha256":"305fb63d23e468db44f57c5fb64d7d6ecbaa9cea0a7354b25773bc5edc997606","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/kinetic-mobile/1.0.0/index.html"},{"path":"src/kinetic-mobile.js","size":5433,"sha256":"8b130fa19c7ec2627d547f3157233eec3ba962aac1cf0eb587d99b2e36c711a1","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/kinetic-mobile/1.0.0/src/kinetic-mobile.js"}],"warnings":[]}