three.js : 与音频联动的球体动画
<audio id="aud" src="https://music.163.com/song/media/outer/url?id=1464843172" autoplay loop controls></audio> <script type="module"> import * as THREE from 'https://esm.sh/three'; import { OrbitControls } from "https://esm.sh/three/examples/jsm/controls/OrbitControls"; let rotRaf, isPaused = true; const scene = new THREE.Scene(); const camera = new THREE.PerspectiveCamera(75, window.innerWidth / window.innerHeight, 0.1, 1000); camera.position.z = 20; const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); document.body.appendChild(renderer.domElement); const geometry = new THREE.SphereGeometry(2, 32, 32, 0, 2 * Math.PI, 0, 2 * Math.PI); for (let i = 0; i <= 8; i++) { const material = new THREE.MeshNormalMaterial({ transparent: true, opacity: 0.6, side: THREE.DoubleSide }); const ball = new THREE.Mesh(geometry, material); const radian = (360 / 8) * (Math.PI / 180); if (i < 8) ball.position.set(8 * Math.sin(radian * i), 8 * Math.cos(radian * i), 0); scene.add(ball); } const controls = new OrbitControls(camera, renderer.domElement); controls.enablePan = true; controls.maxPolarAngle = 1.5; controls.minPolarAngle = 0.0; controls.autoRotate = true; controls.dampingFactor = 0.5; isPaused = aud.paused; const mState = () => { isPaused = aud.paused; aud.paused ? cancelAnimationFrame(rotRaf) : rotating(); }; const rotating = () => { if (isPaused ) return; controls.update(); renderer.render(scene, camera); rotRaf = requestAnimationFrame(rotating); }; aud.onplaying = aud.onpause = () => mState(); aud.onseeked = () => cancelAnimationFrame(rotRaf); rotating(); </script> <style> body { margin: 0; } audio { position: absolute; bottom: 20px; right: 20px; } </style>
前一篇: 使用three.js画一条水平线
下一篇: three.js材质汇总
发表评论:
评论列表 [2条]
#2 | 悄然 于 2025-5-10 17:53 发布: 它直接跟音乐联接起来了,点击可控球体暂停。它真的可以用到贴子里去了。。感觉代码会一如既往的复杂,现在看看去。。
#1 | 飞飞 于 2025-5-10 17:52 发布: 这个球体比我想象中的更真实耶。。闪亮闪亮的,还是半透明的。。移动的时候,能通过一个球身看到别的球体。。赞。。