three实现可配置参数的声音驱动水波纹鼠标交互动画效果代码
代码语言:html
所属分类:动画
代码描述:three实现可配置参数的声音驱动水波纹鼠标交互动画效果代码,按h键修改参数,鼠标移动有涟漪动画交互效果。
代码标签: three 配置 参数 声音 驱动 水波纹 鼠标 交互
下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开
<!DOCTYPE html> <html lang="en" > <head> <meta charset="UTF-8"> <style> @font-face { font-family: "GT Standard"; src: url("https://assets.codepen.io/7558/GT-Standard-VF-Trial.woff2") format("woff2-variations"); font-weight: 300 900; font-stretch: 0% 150%; font-style: normal; font-display: swap; } @font-face { font-family: "PPSupplyMono"; src: url("https://assets.codepen.io/7558/PPSupplyMono-Regular.ttf") format("truetype"); font-weight: normal; font-style: normal; font-display: swap; } * { margin: 0; padding: 0; box-sizing: border-box; } body { overflow: hidden; background: #000; font-family: "PPSupplyMono", monospace; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } #container { position: relative; width: 100vw; height: 100vh; display: flex; justify-content: center; align-items: center; } #controls { position: absolute; top: 20px; left: 20px; z-index: 100; opacity: 0.3; transition: opacity 0.3s ease; } #controls:hover { opacity: 1; } button { background: none; color: white; border: none; cursor: pointer; font-family: inherit; font-size: 12px; text-transform: uppercase; transition: opacity 0.2s ease; } button:hover { opacity: 0.7; } button:disabled { cursor: not-allowed; opacity: 0.5; } canvas { display: block; } .tp-dfwv { position: fixed !important; top: 20px !important; right: 20px !important; z-index: 1000 !important; display: none !important; transition: opacity 0.3s ease !important; } .tp-dfwv.visible { display: block !important; } .info { position: absolute; bottom: 20px; left: 50%; transform: translateX(-50%); color: white; font-size: 12px; text-transform: uppercase; text-align: center; z-index: 1000; line-height: 1.4; opacity: 0.8; } .info a { color: white; text-decoration: none; border-bottom: 1px solid rgba(255, 255, 255, 0.3); transition: border-bottom-color 0.2s ease; } .info a:hover { border-bottom-color: white; } .credit { margin-top: 4px; opacity: 0.6; font-size: 11px; } .help-hint { position: absolute; top: 20px; right: 20px; color: white; font-size: 11px; text-transform: uppercase; opacity: 0.5; z-index: 1000; transition: opacity 0.3s ease; } .help-hint.hidden { opacity: 0; } @media (max-width: 768px) { .info { font-size: 10px; bottom: 10px; } #controls { top: 10px; left: 10px; } .help-hint { top: 10px; right: 10px; font-size: 10px; } } </style> </head> <body translate="no"> <div id="container"> <div id="controls"> <button id="audioBtn">[ play ]</button> </div> <div class="help-hint" id="helpHint">Press 'H' for controls</div> <div class="info"> <div>Move mouse to create audio-reactive fluid ripples</div> <div class="credit">Music by me • Shader inspiration by <a href="" target="_blank">XOR</a></div> </div> </div> <script type="module"> import * as THREE from "//repo.bfw.wiki/bfwrepo/js/module/three/build/177/three.module.js"; import { Pane } from "//repo.bfw.wiki/bfwrepo/js/tweakpane.4.0.3.js"; const scene = new THREE.Scene(); const camera = new THREE.OrthographicCamera(-1, 1, 1, -1, 0.1, 10); const renderer = new THREE.WebGLRenderer({ antialias: true }); renderer.setSize(window.innerWidth, window.innerHeight); renderer.setPixelRatio(Math.min(window.devicePixelRatio, 2)); document.getElementById("container").appendChild(renderer.domElement); let isPlaying = false; let audioContext = null; let analyser = null; let dataArray = null; let source = null; let panelVisible = false; let audioLevels = { bassLevel: 0, midLevel: 0, trebleLevel: 0, overallLevel: 0 }; let bassMonitor, midMonitor, trebleMonitor, overallMonitor; const audio = new Audio(); audio.src = "//repo.bfw.wiki/bfwrepo/sound/5e148aa3821f2.mp3"; audio.preload = "auto"; audio.volume = 1.0; audio.crossOrigin = "anonymous"; audio.addEventListener("ended", () => { if (isPlaying) { audio.currentTime = 0; audio.play(); } }); audio.load(); function initAudioAnalysis() { try { if (!audioContext) { audioContext = new (window.AudioContext || window.webkitAudioContext)(); analyser = audioContext.createAnalyser(); analyser.fftSize = 256; analyser.smoothingTimeConstant = 0.8; const bufferLength = analyser.frequencyBinCount; dataArray = new Uint8Array(bufferLength); source = audioContext.createMediaElementSource(audio); source.connect(analyser); analyser.connect(audioContext.destination); console.log("Web Audio API initialized successfully"); } } catch (e) { console.warn("Web Audio API failed to initialize:", e); analyser = null; dataArray = null; } } const waterSettings = { resolution: 256, damping: 0.913, tension: 0.02, rippleStrength: 0.2, mouseIntensity: 1.2, clickIntensity: 3.0, rippleRadius: 8, splatForce: 50000, splatThickness: 0.1, vorticityInfluence: 0.2, swirlIntensity: 0.2, pressure: 0.3, velocityDissipation: 0.08, densityDissipation: 1.0, displacementScale: 0.01 }; const resolution = waterSettings.resolution; let waterBuffers = { current: new Float32Array(re.........完整代码请登录后点击上方下载按钮下载查看
网友评论0