{"id":"dupin-cyclide","version":"1.0.0","title":"Dupin Cyclide","summary":"A smooth iridescent cyclide that breathes from a fat ring to a lopsided loop and back while it turns. Loops perfectly.","kind":"object","target":"three","collections":["chrome-glass","hypnotic-loops","product-reveals"],"tags":["dupin cyclide","cyclide","torus","surface","geometry","mathematics","iridescent","morph","studio","loop","3d"],"loopable":true,"motion":"procedural","durationSeconds":16,"status":"published","media":{"poster":"https://aipixelwizard.com/media/dupin-cyclide/1.0.0/poster.webp","preview":"https://aipixelwizard.com/media/dupin-cyclide/1.0.0/preview.mp4","sample":"https://aipixelwizard.com/media/dupin-cyclide/1.0.0/sample.mp4","sampleBytes":1535531,"sampleNote":"Pre-rendered with the default settings. Customised settings must be exported locally (npm run render)."},"urls":{"page":"https://aipixelwizard.com/visuals/dupin-cyclide","manifest":"https://aipixelwizard.com/api/v1/visuals/dupin-cyclide/versions/1.0.0","agentMd":"https://aipixelwizard.com/registry/dupin-cyclide/1.0.0/agent.md","files":"https://aipixelwizard.com/registry/dupin-cyclide/1.0.0/","demo":"https://aipixelwizard.com/registry/dupin-cyclide/1.0.0/index.html"},"description":"A Dupin cyclide: the smooth surface that bends, pinches and swells as its two shape numbers change, the generalisation of the torus. Here the numbers glide round a closed circle of values, so the surface breathes between a fat ring and a lopsided pear-shaped loop while it turns in space and an iridescent finish plays across it. Choose the finish (iridescent, chrome, pearl or gold), whether a net of curves lies on the surface, the mesh fineness, the turns per loop, how far the shape changes, the backdrop colour and whether the camera sways.","role":"Object (3D, three.js): a mathematical showpiece with a liquid, iridescent look for science, design and tech content.","useCases":["A maths or design-tech title scene","A premium product-style abstract loop","A calm iridescent backdrop"],"synonyms":["cyclide surface","morphing torus","parametric surface","ring cyclide","math sculpture","liquid metal ring"],"digest":"600a2db12eed39274f4307017c07866cd8eca9bbc13f4a32aa8a629a156425f5","implementation":{"target":"three","runtime":"browser","language":"javascript","module":"esm","entry":"src/dupin-cyclide.js","exports":[{"name":"createCyclide","signature":"createCyclide({ finish?, lines?, detail?, turns?, morph? }) => { group, setProgress(progress), dispose() }","description":"The morphing cyclide (about 4.4 across, centred on the origin); needs an environment map."},{"name":"FINISHES","signature":"FINISHES: { iridescent, chrome, pearl, gold }","description":"Surface finishes: colour, metalness, roughness, iridescence and film index."}],"reusable":["src/dupin-cyclide.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":"finish","label":"Finish","type":"select","default":"iridescent","options":[{"value":"iridescent","label":"Iridescent"},{"value":"chrome","label":"Chrome"},{"value":"pearl","label":"Pearl"},{"value":"gold","label":"Gold"}]},{"key":"lines","label":"Surface lines","type":"boolean","default":true},{"key":"detail","label":"Mesh detail","type":"number","min":0.6,"max":1.4,"step":0.1,"default":1},{"key":"turns","label":"Turns per loop","type":"integer","min":0,"max":3,"step":1,"default":1},{"key":"morph","label":"Shape change","type":"number","min":0,"max":1.5,"step":0.1,"default":1},{"key":"background","label":"Backdrop","type":"color","default":"#161a28"},{"key":"orbit","label":"Camera sway","type":"boolean","default":true}],"presets":[{"id":"default","label":"Iridescent, one turn","params":{}},{"id":"chrome","label":"Chrome, bare","params":{"finish":"chrome","lines":false,"background":"#10141c"}},{"id":"gold","label":"Gold, big morph","params":{"finish":"gold","morph":1.5,"background":"#241a12"}},{"id":"pearl","label":"Pearl, two turns","params":{"finish":"pearl","turns":2,"background":"#1e1a28"}}],"output":{"width":1080,"height":1080,"fps":30,"durationSeconds":16,"posterSeconds":3,"alpha":false,"motion":"procedural","loop":{"seamless":true,"cycleSeconds":16,"method":"The two shape numbers are sines of the loop, the surface turns a whole number of times per loop and the camera sway is a sine of the loop, so the last frame meets the first."},"seed":null},"composition":{"inputs":"Time within the loop; the finish, lines, detail, turns, shape change, backdrop and camera sway.","outputs":"A full frame rendered in 3D with a studio environment.","coordinates":"The cyclide is centred on the origin, scaled to a fixed root-mean-square radius of 2, hung 3.3 above the floor.","lighting":"A warm key light with a shadow map and the studio environment.","timing":"setProgress(progress) rewrites the mesh from a closed form; frames render in any order.","compatibleWith":["chrome-material","orbit-camera","kinetic-title","number-reveal"],"notes":["About 11 000 vertices are rewritten on the CPU each frame and the seam normals are averaged."]},"reuse":["Maths title: Iridescent, one turn.","Product-style loop: Chrome, bare.","Warm accent: Gold, big morph."],"integration":{"newProject":"Create a WebGLRenderer with a studio environment, add createCyclide().group and call cyclide.setProgress(progress) each frame.","existingProject":"Copy src/dupin-cyclide.js; add the group to your scene with an environment map."},"performance":{"notes":"About 11 000 vertices rewritten and re-normalised each frame: a few milliseconds a frame on an integrated Intel GPU.","limits":"Software WebGL renders in about a second and a half a frame."},"limitations":["The surface is scaled to a steady size, so its horns and pinches change apparent proportions.","The ring cyclide has a singular point at its horn at the extreme of the morph, softened by the limited range."],"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/geometry-math/dupin-cyclide (MIT) and rebuilt for AI Pixel Wizard in October 2026 as an original studio object: the ring cyclide's closed form with its two shape numbers on a closed loop, a size-steady mesh rewritten each frame and an iridescent finish on an exact loop.","changelog":[{"version":"1.0.0","date":"2026-10-05","notes":"Initial release."}],"verification":{"testedOn":"2026-10-05","inputs":{"dupin-cyclide@1.0.0":"600a2db12eed39274f4307017c07866cd8eca9bbc13f4a32aa8a629a156425f5","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":480,"renderSeconds":1966.2,"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/dupin-cyclide/1.0.0/poster.webp","preview":"/media/dupin-cyclide/1.0.0/preview.mp4","sample":"/media/dupin-cyclide/1.0.0/sample.mp4","sampleBytes":1535531}},"files":[{"path":"LICENSE","size":1072,"sha256":"8a5f3a96f07e11522ec4bdd0a583356f99bad1245920f9709cee09b995a45153","contentType":"text/plain; charset=utf-8","url":"https://aipixelwizard.com/registry/dupin-cyclide/1.0.0/LICENSE"},{"path":"asset.json","size":7516,"sha256":"c0e4e2524686bc66caf7b9c540516b203a7728da29594fcbea567be080cd2b44","contentType":"application/json; charset=utf-8","url":"https://aipixelwizard.com/registry/dupin-cyclide/1.0.0/asset.json"},{"path":"demo.js","size":2909,"sha256":"bea3d647320769044e517dfca7a7c1c7c0bb93b784703eb6ff05f12fd5edb60d","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/dupin-cyclide/1.0.0/demo.js"},{"path":"index.html","size":527,"sha256":"93e405639e819da61ebd574cf409d23d4d7515a27667d0c5ba4e1adf8b1804b7","contentType":"text/html; charset=utf-8","url":"https://aipixelwizard.com/registry/dupin-cyclide/1.0.0/index.html"},{"path":"src/dupin-cyclide.js","size":6600,"sha256":"09953e2b07154b24928f91e6aee9b7f4fff571ff7ab1b5e370d5aad61c17d7d9","contentType":"text/javascript; charset=utf-8","url":"https://aipixelwizard.com/registry/dupin-cyclide/1.0.0/src/dupin-cyclide.js"}],"warnings":[]}