当前位置:首页 > JavaScript

js实现水柱

2026-03-02 08:31:55JavaScript

实现水柱效果的JavaScript方法

使用Canvas绘制动态水柱效果,结合流体力学公式模拟水的波动。以下为关键代码示例:

js实现水柱

const canvas = document.getElementById('waterCanvas');
const ctx = canvas.getContext('2d');
let width = canvas.width;
let height = canvas.height;

// 水柱参数
let waveHeight = 50;
let waveSpeed = 0.05;
let waveLength = 100;
let time = 0;

function animate() {
    ctx.clearRect(0, 0, width, height);

    // 绘制水面
    ctx.beginPath();
    ctx.moveTo(0, height/2);

    for(let x = 0; x < width; x++) {
        let y = waveHeight * Math.sin(x/waveLength + time) + height/2;
        ctx.lineTo(x, y);
    }

    ctx.lineTo(width, height);
    ctx.lineTo(0, height);
    ctx.closePath();
    ctx.fillStyle = 'rgba(64, 164, 223, 0.7)';
    ctx.fill();

    time += waveSpeed;
    requestAnimationFrame(animate);
}

animate();

物理模拟优化

添加流体动力学参数提升真实感,使用波动方程增强交互性:

js实现水柱

// 改进的波动方程参数
const damping = 0.996;
const spread = 0.5;
let surface = Array(width).fill(height/2);
let velocity = Array(width).fill(0);

function updateSurface() {
    for(let i = 1; i < width-1; i++) {
        // 波动传播计算
        velocity[i] += (surface[i-1] + surface[i+1])/2 - surface[i];
        velocity[i] *= damping;
    }

    for(let i = 1; i < width-1; i++) {
        surface[i] += velocity[i] * spread;
    }
}

交互功能实现

添加鼠标交互产生涟漪效果:

canvas.addEventListener('click', (e) => {
    const posX = e.clientX - canvas.offsetLeft;
    velocity[posX] = -20; // 点击位置产生扰动
});

性能优化建议

使用WebGL的Three.js库处理复杂水效果:

import * as THREE from 'three';

// 创建水面几何体
const waterGeometry = new THREE.PlaneGeometry(10, 10, 128, 128);
const waterMaterial = new THREE.ShaderMaterial({
    uniforms: {
        time: { value: 0 }
    },
    vertexShader: `
        uniform float time;
        void main() {
            vec3 pos = position;
            pos.y += sin(pos.x * 5.0 + time) * 0.2;
            gl_Position = projectionMatrix * modelViewMatrix * vec4(pos, 1.0);
        }
    `,
    fragmentShader: `
        void main() {
            gl_FragColor = vec4(0.0, 0.5, 1.0, 0.8);
        }
    `
});

以上方法可根据需求选择实现方案,Canvas方案适合轻量级应用,WebGL方案适合高性能要求的场景。

标签: 水柱js
分享给朋友:

相关文章

vue.js实现轮播

vue.js实现轮播

Vue.js 实现轮播功能 使用第三方库(推荐) Vue.js 生态中有许多成熟的轮播组件库,例如 vue-awesome-swiper 或 swiper,它们功能丰富且易于集成。 安装 swipe…

js实现轮播

js实现轮播

实现轮播图的基本思路 轮播图的核心逻辑是通过定时切换展示的图片或内容,通常结合左右滑动按钮和指示器(小圆点)增强交互性。以下是基于原生JavaScript的实现方法。 HTML结构 构建轮播图的HT…

js实现密码

js实现密码

密码强度验证 使用正则表达式验证密码强度是一种常见方法。以下代码检查密码是否包含大小写字母、数字和特殊字符,且长度至少为8位: function checkPasswordStrength(pass…

js实现吸色

js实现吸色

使用Canvas实现吸色功能 通过Canvas的getImageData方法获取像素颜色数据。创建一个Canvas元素,将目标图像绘制到Canvas上,通过鼠标事件获取坐标对应的颜色值。 const…

js实现弹框

js实现弹框

使用 alert 实现简单弹框 JavaScript 的 alert 方法可以直接显示一个简单的弹框,内容为纯文本: alert("这是一个简单的弹框"); 使用 confirm 实现确认弹框…

js实现递归

js实现递归

递归的基本概念 递归是一种通过函数调用自身来解决问题的方法。在JavaScript中,递归通常用于处理具有重复子问题或分治结构的数据,例如树形结构、阶乘计算等。 递归的实现要点 基线条件(Base…