当前位置:首页 > JavaScript

js实现水柱

2026-03-02 08:31:55JavaScript

实现水柱效果的JavaScript方法

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

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();

物理模拟优化

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

// 改进的波动方程参数
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库处理复杂水效果:

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
分享给朋友:

相关文章

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 使用JavaScript实现拖拽功能需要监听鼠标事件,包括mousedown、mousemove和mouseup。以下是实现的基本逻辑: const draggableEleme…

js实现拖拽

js实现拖拽

实现拖拽的基本步骤 通过监听鼠标事件(mousedown、mousemove、mouseup)实现拖拽功能。以下是核心代码逻辑: const draggableElement = document.…

js实现复制功能

js实现复制功能

使用 document.execCommand 方法 这种方法适用于较旧的浏览器,但在现代浏览器中可能被逐步淘汰。通过创建一个临时的 textarea 元素,将文本内容放入其中,然后执行复制命令。…

js实现复制到剪贴板

js实现复制到剪贴板

使用document.execCommand方法(传统方式,已废弃但部分浏览器仍支持) 该方法适用于旧版浏览器,但已被标记为废弃。执行前需确保文本已被选中: function copyToClipb…

js画图实现

js画图实现

使用Canvas API绘制图形 Canvas是HTML5提供的绘图API,通过JavaScript操作Canvas元素可以绘制各种图形。以下是一个简单的示例: <canvas id="myC…

js实现图片滚动

js实现图片滚动

图片滚动的实现方法 使用CSS动画实现 通过CSS的animation和@keyframes可以实现简单的图片滚动效果。这种方法适合静态图片的无缝循环滚动。 <style> .scr…