webgl+canvas实现鼠标跟随电焊电弧光标动画效果代码

代码语言:html

所属分类:动画

代码描述:webgl+canvas实现鼠标跟随电焊电弧光标动画效果代码

代码标签: webgl canvas 鼠标 跟随 电焊 电弧 光标 动画

下面为部分代码预览,完整代码请点击下载或在bfwstudio webide中打开

<!DOCTYPE html>
<html lang="en" >

<head>
  <meta charset="UTF-8">
  


  
  
  
<style>
html,
body {
	height: 100%;
	margin: 0;
	background: #0b0f14;
}
#wrap {
	position: relative;
	width: 100%;
	height: 100%;
}
canvas {
	width: 100%;
	height: 100%;
	display: block;
	cursor: crosshair;
}
.hud {
	position: absolute;
	top: 10px;
	left: 10px;
	font: 12px/1.3 system-ui, Segoe UI, Roboto, Arial;
	color: #cfe8ff;
	background: rgba(0, 0, 0, 0.35);
	padding: 8px 10px;
	border-radius: 8px;
}
code {
	color: #9cf;
}
</style>

  
</head>

<body translate="no">
  <div id="wrap">
	<canvas id="fx"></canvas>
	<div class="hud">
		API: <code>const weld = new ArcWeldEffect(canvas[, options])</code><br />
		Méthodes: <code>start()</code> · <code>stop()</code> · <code>destroy()</code> · <code>setOptions()</code>
	</div>
</div>

<script>
	document.addEventListener('DOMContentLoaded', () => {
		const canvas = document.getElementById("fx");
		const weld = new ArcWeldEffect(canvas, {
			baseIntensity: 0.08,
			speedGain: 1.0,
			clickBoost: 1.6,
			glowRadius: 90,
			sparkCount: 500,
			color: [0.81, 0.93, 1.0],
			noiseSeed: 4025
		});
		weld.start();
		// quick smoke tests
		window.addEventListener("blur", () => weld.setOptions({
			baseIntensity: 0.02
		}));
		window.addEventListener("focus", () =>
			weld.setOptions({
				baseIntensity: 0.08
			})
		);
		window.addEventListener("resize", () => {
			/* handled internally by ResizeObserver */
		});
	})
</script>
  
      <script>
class ArcWeldEffect {
	constructor(target, options = {}) {
		// Public options (with defaults)
		this.opts = {
			baseIntensity: 0.08,
			speedGain: 0.9,
			clickBoost: 1.2,
			glowRadius: 80,
			sparkCount: 400,
			color: [0.85, 0.95, 1.0], // electric white-blue
			noiseSeed: 1337,
			...options
		};

		// Resolve canvas or container
		this._externalCanvas = false;
		if (target instanceof HTMLCanvasElement) {
			this.canvas = target;
			this._externalCanvas = true;
		} else {
			this.canvas = document.createElement("canvas");
			(target || document.body).appendChild(this.canvas);
		}

		// Pointer state
		this.pointer = {
			x: 0,
			y: 0,
			px: 0,
			py: 0,
			speed: 0,
			down: false,
			inside: false
		};

		this._running = false;
		this._raf = null;
		this._lastT = 0;
		this._flashT = 0; // short flash when click pressed

		// DPR / resize
		this._resizeObserver = null;

		// Try WebGL, else Canvas2D fallback
		this.gl = this.canvas.getContext("webgl", {
			premultipliedAlpha: false,
			alpha: true,
			antialias: false,
			depth: false,
			stencil: false
		});
		if (this.gl) {
			this._initGL();
		} else {
			this._init2D();
		}

		// Events
		this._bindEvents();
		this._resize();
	}

	// --- Public API ---
	start() {
		if (this._running) return this;
		this._running = true;
		this._lastT = performance.now();
		const loop = (t) => {
			if (!this._running) return;
			const dt = Math.min(0.05, Math.max(0, (t - this._lastT) / 1000));
			this._lastT = t;
			this._update(dt);
			this._draw(t / 1000);
			this._raf = requestAnimationFrame(loop);
		};
		this._raf = requestAnimationFrame(loop);
		r.........完整代码请登录后点击上方下载按钮下载查看

网友评论0