免费体验沉浸式迷幻波浪动画!WebGL+Three.js 支持鼠标交互调节,2025 最新开源教程来袭

2025-06-30| 2553 阅读

? 免费体验沉浸式迷幻波浪动画!WebGL+Three.js 支持鼠标交互调节,2025 最新开源教程来袭


? 为什么选择 WebGL+Three.js?


WebGL 是浏览器原生的 3D 渲染技术,而 Three.js 则是基于 WebGL 的 JavaScript 库,它将复杂的底层操作封装成简单易用的 API,让开发者无需深入了解 WebGL 细节,就能轻松创建 3D 场景、动画和交互效果。Three.js 的优势在于 跨平台兼容性高性能渲染以及 丰富的社区资源,无论是网页游戏、数据可视化还是艺术展示,都能轻松胜任。

2025 年,Three.js 迎来了重大更新,例如 r175 版本对性能优化、WebGPU 支持和材质系统进行了改进,让 3D 开发更加高效和灵活。

?️ 环境搭建:从零开始


1. 项目初始化


  • 创建 HTML 文件

html
DOCTYPE html>
<html>
<head>
    <meta charset="UTF-8">
    <title>沉浸式波浪动画title>
    <style>
        body { margin: ; }
        #container { width: vw; height: vh; }
    style>
head>
<body>
    <div id="container">div>
    <script type="module">
        // 代码将在这里编写
    script>
body>
html>

  • 引入 Three.js 库:通过 CDN 或本地下载,在 script 标签中引入 Three.js。例如:

html
<script src="https://cdnjs.cloudflare.com/ajax/libs/three.js/r175/three.min.js">script>

2. 核心组件初始化


  • 场景(Scene):场景是所有 3D 对象的容器,用于组织和管理物体、灯光等元素。

javascript
const scene = new THREE.Scene();

  • 相机(Camera):常用的有 PerspectiveCamera(透视相机)和 OrthographicCamera(正交相机)。这里我们使用透视相机来模拟真实视角:

javascript
const camera = new THREE.PerspectiveCamera(, window.innerWidth / window.innerHeight, 0.1, );
camera.position.z = ; // 相机位置

  • 渲染器(Renderer):将场景和相机渲染到网页上:

javascript
const renderer = new THREE.WebGLRenderer({ antialias: true }); // 开启抗锯齿
renderer.setSize(window.innerWidth, window.innerHeight); // 设置渲染区域大小
document.getElementById('container').appendChild(renderer.domElement); // 将渲染器添加到页面

? 波浪动画核心实现


1. 创建波浪平面


  • 几何体(Geometry):使用 PlaneGeometry 创建一个平面,并设置足够的细分段数(例如 200×200),以保证波浪的平滑度:

javascript
const planeGeometry = new THREE.PlaneGeometry(, , , ); // 平面尺寸和细分

  • 材质(Material):使用 MeshStandardMaterial 来模拟水面效果,设置颜色、粗糙度和金属度等属性:

javascript
const planeMaterial = new THREE.MeshStandardMaterial({
    color: 0x00ffff, // 水的颜色
    roughness: 0.2, // 粗糙度
    metalness: 0.3, // 金属度
    envMap: envMapTexture, // 环境贴图(可选)
});

  • 网格(Mesh):将几何体和材质组合成网格,并添加到场景中:

javascript
const wavePlane = new THREE.Mesh(planeGeometry, planeMaterial);
scene.add(wavePlane);

2. 顶点位移实现波浪效果


波浪效果的核心是通过正弦和余弦函数动态改变平面顶点的位置。在动画循环中,对每个顶点的 z 坐标进行位移:

javascript
// 定义波浪参数
let time = ;
const waveSpeed = 0.05; // 波浪速度
const waveAmplitude = 0.5; // 波浪振幅

function animate() {
    requestAnimationFrame(animate);
    time += waveSpeed;

    // 获取平面顶点数据
    const vertices = wavePlane.geometry.attributes.position.array;

    // 遍历每个顶点,计算位移
    for (let i = ; i < vertices.length; i += ) {
        const x = vertices[i];
        const z = vertices[i + ];

        // 波浪公式:y = amplitude * sin(x * frequency + time * speed) + cos(z * frequency + time * speed)
        const waveY = waveAmplitude * (Math.sin(x *  + time) + Math.cos(z *  + time));
        vertices[i + ] = waveY; // 更新 y 坐标
    }

    // 通知 Three.js 顶点数据已更新
    wavePlane.geometry.attributes.position.needsUpdate = true;
    wavePlane.geometry.computeVertexNormals(); // 重新计算法线,确保光照正确

    renderer.render(scene, camera);
}
animate();

?️ 鼠标交互调节


1. 基础交互:旋转、缩放和平移


使用 Three.js 提供的 OrbitControls 类来实现基础的相机控制:

javascript
import { OrbitControls } from 'three/addons/controls/OrbitControls.js'; // 引入控件

const controls = new OrbitControls(camera, renderer.domElement);
controls.enableDamping = true; // 启用阻尼,使动画更平滑
controls.dampingFactor = 0.05; // 阻尼系数
controls.autoRotate = false; // 是否自动旋转
controls.autoRotateSpeed = 2.0; // 自动旋转速度

// 在动画循环中更新控件
function animate() {
    requestAnimationFrame(animate);
    controls.update(); // 更新控件状态
    // ...其他动画逻辑
    renderer.render(scene, camera);
}

2. 自定义交互:调节波浪参数


通过监听鼠标事件(如滚轮、点击),动态改变波浪的速度、振幅等参数:

  • 滚轮控制波浪速度

javascript
window.addEventListener('wheel', (event) => {
    event.preventDefault();
    waveSpeed += event.deltaY * 0.001; // 根据滚轮方向调整速度
    waveSpeed = Math.max(0.01, Math.min(0.2, waveSpeed)); // 限制速度范围
});

  • 点击改变波浪颜色

javascript
renderer.domElement.addEventListener('click', (event) => {
    // 将鼠标坐标转换为归一化设备坐标(NDC)
    const mouse = new THREE.Vector2();
    mouse.x = (event.clientX / window.innerWidth) *  - ;
    mouse.y = -(event.clientY / window.innerHeight) *  + ;

    // 创建射线投射器
    const raycaster = new THREE.Raycaster();
    raycaster.setFromCamera(mouse, camera);

    // 检测与波浪平面的交点
    const intersects = raycaster.intersectObjects([wavePlane]);
    if (intersects.length > ) {
        // 生成随机颜色
        const randomColor = new THREE.Color(Math.random(), Math.random(), Math.random());
        wavePlane.material.color.set(randomColor);
    }
});

3. 移动端适配


为了支持移动端的触摸交互,需要监听 touchstart、touchmove 和 touchend 事件,并处理双指缩放和单指旋转:

javascript
renderer.domElement.addEventListener('touchstart', (event) => {
    event.preventDefault(); // 阻止默认触摸行为
    if (event.touches.length === ) {
        // 单指旋转
        const touch = event.touches[];
        controls.handleTouchStartRotate(touch);
    } else if (event.touches.length === ) {
        // 双指缩放和平移
        const touch0 = event.touches[];
        const touch1 = event.touches[];
        controls.handleTouchStartDollyPan(touch0, touch1);
    }
});

renderer.domElement.addEventListener('touchmove', (event) => {
    event.preventDefault();
    if (event.touches.length === ) {
        controls.handleTouchMoveRotate(event.touches[]);
    } else if (event.touches.length === ) {
        controls.handleTouchMoveDollyPan(event.touches[], event.touches[]);
    }
});

? 高级优化与效果增强


1. 光照与阴影设置


  • 环境光(AmbientLight):提供场景整体照明:

javascript
const ambientLight = new THREE.AmbientLight(0xffffff, 0.5); // 颜色和强度
scene.add(ambientLight);

  • 平行光(DirectionalLight):模拟太阳光,产生阴影:

javascript
const directionalLight = new THREE.DirectionalLight(0xffffff, );
directionalLight.position.set(, , ); // 光源位置
directionalLight.castShadow = true; // 开启阴影
directionalLight.shadow.mapSize.set(, ); // 阴影贴图分辨率
scene.add(directionalLight);

  • 设置物体投射和接收阴影

javascript
wavePlane.castShadow = true; // 波浪平面投射阴影
wavePlane.receiveShadow = true; // 波浪平面接收阴影
renderer.shadowMap.enabled = true; // 渲染器启用阴影

2. 材质与纹理优化


  • 法线贴图(NormalMap):增强波浪表面的细节和立体感:

javascript
const normalTexture = new THREE.TextureLoader().load('water_normal.jpg');
planeMaterial.normalMap = normalTexture;
planeMaterial.normalScale.set(0.1, 0.1); // 法线强度

  • 置换贴图(DisplacementMap):通过纹理控制顶点位移,使波浪效果更真实:

javascript
const displacementTexture = new THREE.TextureLoader().load('water_displacement.jpg');
planeMaterial.displacementMap = displacementTexture;
planeMaterial.displacementScale = 0.2; // 置换强度

3. 性能优化


  • 几何体合并:如果场景中有多个相似的波浪平面,可以使用 BufferGeometryUtils.mergeBufferGeometries 合并几何体,减少渲染调用次数。
  • 纹理压缩:使用压缩格式的纹理(如 ETC、ASTC),减小文件大小,加快加载速度。
  • LOD(Level of Detail):根据物体与相机的距离,动态切换不同细节层次的模型,提升性能。

? 开源项目与资源推荐


  • Three.js 官方仓库:GitHub - mrdoob/three.js,包含完整的文档、示例和源码。
  • 波浪动画示例:CSDN 博客 - three.js 波浪效果实践,提供完整的代码示例和详细解释。
  • 材质与纹理资源:AmbientCG,提供高质量的 PBR 材质和纹理。

? 总结


通过 WebGL 和 Three.js,我们可以轻松创建出沉浸式的迷幻波浪动画,并通过鼠标交互实现参数调节。从基础的环境搭建到高级的光照、材质优化,Three.js 提供了丰富的工具和 API,让 3D 开发变得简单而高效。无论是网页开发者、设计师还是创意人员,都能通过这个教程快速上手,打造出令人惊艳的 3D 交互效果。

【该文章由 dudu123.com 嘟嘟 AI 导航整理,嘟嘟 AI 导航汇集全网优质网址资源和最新优质 AI 工具】

分享到:

相关文章

创作资讯2025-06-02

第五 AI 生成论文靠谱吗?手机用其一键生成论文教程 2025

第五 AI 生成论文靠谱吗?手机用其一键生成论文教程 2025 在学术写作领域,AI 工具的应用愈发广泛,第五 AI 作为其中一员,其生成论文的可靠性和操作便捷性成为用户关注焦点。那么,第五 AI 生

第五AI
创作资讯2025-01-21

朱雀大模型检测官网免费使用教程及检测报告下载

在 2025 年的内容创作领域,AI 生成内容的普及带来了效率的飞跃,但也引发了信任危机。腾讯朱雀检测系统的出现,如同悬在创作者头上的达摩克利斯之剑,让每一篇 AI 生成的内容都面临被识破的风险。不过

第五AI
创作资讯2025-01-25

如何用有一云AI写出10w+爆款文案?掌握这些技巧就够了

有一云 AI 的 AI 写作功能可不止是简单的 “写”,它还能 “聪明地写”。只要输入关键词,AI 瞬间就能输出原创内容框架。更厉害的是它的全网热点追踪引擎,能实时抓取热词,自动把爆款基因融入文章,让

第五AI
创作资讯2025-06-18

Waverly AI 健康管理怎么用?智能分析数据 + Pilot 耳机实时翻译助你畅享生活

? 快速上手 Waverly AI 健康管理核心操作 刚开始用 Waverly AI 时,第一步得先把 APP 下载到手机里。不管你用的是苹果还是安卓手机,直接去应用商店搜 “Waverly AI”

第五AI
创作资讯2025-07-12

Trendyol 如何支付?时尚服装电子产品快速配送全解析

? 支付方式全解析:Trendyol 如何让购物更便捷? Trendyol 作为土耳其领先的电商平台,支付方式丰富多样,满足不同用户的需求。** 现金支付(COD)** 是当地最受欢迎的方式,占比高达

第五AI
创作资讯2025-06-20

小荷作文网竞赛活动 + 投稿指南,中小学生作文范文 + 写作技巧免费获取!

? 小荷作文网竞赛活动 + 投稿指南,中小学生作文范文 + 写作技巧免费获取! 最近发现一个超实用的中小学生作文学习平台 —— 小荷作文网,这里不仅有丰富的竞赛活动和投稿指南,还能免费获取作文范文和写

第五AI
创作资讯2025-06-26

AI 与学术资源结合的古籍整理发布平台:免费开放《儒藏》等文献,体验沉浸式阅读!

? 平台背景:当 AI 遇上千年古籍的数字化革命 你有没有想过,那些沉睡在图书馆角落里的古籍,如何跨越千年与现代人对话?现在有这样一个平台,把 AI 技术和学术资源玩出了新花样 —— 专门做古籍整理发

第五AI
创作资讯2025-07-12

免费无水印 SVG 编辑器选哪个?SVG.IO 在线编辑支持多功能设计更简单

? SVG.IO:免费无水印 SVG 编辑器的优选 在众多免费无水印的 SVG 编辑器中,SVG.IO 凭借其独特的优势脱颖而出。它是一款完全免费且无水印的在线 SVG 编辑器,支持多种功能设计,操作

第五AI