{"id":"9f81fffb-3cd9-4b65-ab1e-7eb5d8a6d6cb","slug":"ambershen-infinite-tunnel","name":"infinite-tunnel","description":"This skill covers creating infinite tunnel effects using Three.js and GSAP","canonicalUrl":"https://xpersona.co/skill/ambershen-infinite-tunnel","sourceUrl":"https://github.com/ambershen/infinite-tunnel","homepage":null,"source":"GITHUB_OPENCLEW","vendor":{"slug":"ambershen","label":"Ambershen","url":"https://github.com/ambershen/infinite-tunnel"},"protocols":["OPENCLEW"],"capabilities":["diverse"],"trustScore":null,"trustConfidence":"unknown","artifactCount":0,"benchmarkCount":0,"lastRelease":null,"freshnessAt":"2026-04-15T03:14:20.882Z","freshnessLabel":"Apr 15, 2026","securityReviewed":true,"openapiReady":false,"stats":[{"label":"Trust score","value":"Unknown"},{"label":"Compatibility","value":"OpenClaw"},{"label":"Freshness","value":"Apr 15, 2026"},{"label":"Vendor","value":"Ambershen"},{"label":"Artifacts","value":"0"},{"label":"Benchmarks","value":"0"},{"label":"Last release","value":"Unpublished"}],"factsPreview":[{"factKey":"docs_crawl","category":"integration","label":"Crawlable docs","value":"6 indexed pages on the official domain","href":"https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar","sourceUrl":"https://github.com/login?return_to=https%3A%2F%2Fgithub.com%2Fopenclaw%2Fskills%2Ftree%2Fmain%2Fskills%2Fasleep123%2Fcaldav-calendar","sourceType":"search_document","confidence":"medium","observedAt":"2026-04-15T05:03:46.393Z","isPublic":true},{"factKey":"vendor","category":"vendor","label":"Vendor","value":"Ambershen","href":"https://github.com/ambershen/infinite-tunnel","sourceUrl":"https://github.com/ambershen/infinite-tunnel","sourceType":"profile","confidence":"medium","observedAt":"2026-04-15T03:14:20.882Z","isPublic":true},{"factKey":"protocols","category":"compatibility","label":"Protocol compatibility","value":"OpenClaw","href":"https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/contract","sourceUrl":"https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/contract","sourceType":"contract","confidence":"medium","observedAt":"2026-04-15T03:14:20.882Z","isPublic":true},{"factKey":"traction","category":"adoption","label":"Adoption signal","value":"5 GitHub stars","href":"https://github.com/ambershen/infinite-tunnel","sourceUrl":"https://github.com/ambershen/infinite-tunnel","sourceType":"profile","confidence":"medium","observedAt":"2026-04-15T03:14:20.882Z","isPublic":true},{"factKey":"handshake_status","category":"security","label":"Handshake status","value":"UNKNOWN","href":"https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/trust","sourceUrl":"https://xpersona.co/api/v1/agents/ambershen-infinite-tunnel/trust","sourceType":"trust","confidence":"medium","observedAt":null,"isPublic":true}],"highlights":["5 GitHub stars","Trust evidence available"],"agentCard":{"name":"infinite-tunnel","description":"This skill covers creating infinite tunnel effects using Three.js and GSAP","source":"GITHUB_OPENCLEW","sourceId":"github:1142161831","repository":"https://github.com/ambershen/infinite-tunnel","documentation":"https://xpersona.co/skill/ambershen-infinite-tunnel/agent/ambershen-infinite-tunnel","protocols":["OPENCLEW"],"capabilities":["diverse"],"languages":["typescript"],"install":{"command":"git clone https://github.com/ambershen/infinite-tunnel.git","ecosystem":"git"},"examples":[{"kind":"example","language":"javascript","snippet":"// Calculate position on curve\nconst pos = curve.getPointAt(t_slot);\n\n// Calculate local coordinate frame\nconst tangent = curve.getTangentAt(t_slot).normalize();\nconst up = new THREE.Vector3(0, 1, 0);\n// Handle Gimbal lock for vertical tangents\nif (Math.abs(tangent.y) > 0.9) up.set(0, 0, 1);\n\nconst normal = new THREE.Vector3().crossVectors(tangent, up).normalize();\nconst binormal = new THREE.Vector3().crossVectors(tangent, normal).normalize();\n\n// Offset from center to wall\nconst angle = (slotIndex * 137.5) * (Math.PI / 180); // Golden angle distribution\nconst radius = tubeRadius - 1.5;\n\nconst offset = new THREE.Vector3()\n  .addScaledVector(normal, Math.cos(angle) * radius)\n  .addScaledVector(binormal, Math.sin(angle) * radius);\n\nitem.group.position.copy(pos).add(offset);\nitem.group.lookAt(pos); // Face center"},{"kind":"example","language":"javascript","snippet":"// Enable recursive search (true)\nconst intersects = raycaster.intersectObjects(interactables, true);\n\nif (intersects.length > 0) {\n  let hitMesh = intersects[0].object;\n  // Traverse up to find the root mesh\n  while (hitMesh && !interactables.includes(hitMesh)) {\n      hitMesh = hitMesh.parent;\n  }\n  // Now hitMesh corresponds to your pool item\n}"}]}}