当前位置:首页 > JavaScript

js实现黑洞

2026-03-14 18:13:44JavaScript

实现黑洞效果的JavaScript方法

在JavaScript中模拟黑洞效果可以通过Canvas或WebGL实现。以下是两种常见的方法:

使用Canvas绘制黑洞

创建一个Canvas元素并绘制渐变圆形模拟黑洞引力效果:

const canvas = document.createElement('canvas');
document.body.appendChild(canvas);
const ctx = canvas.getContext('2d');

function drawBlackHole() {
  // 设置画布尺寸
  canvas.width = window.innerWidth;
  canvas.height = window.innerHeight;

  // 清除画布
  ctx.clearRect(0, 0, canvas.width, canvas.height);

  // 创建径向渐变模拟黑洞
  const gradient = ctx.createRadialGradient(
    canvas.width/2, canvas.height/2, 50,
    canvas.width/2, canvas.height/2, 300
  );
  gradient.addColorStop(0, 'black');
  gradient.addColorStop(0.7, '#222');
  gradient.addColorStop(1, 'transparent');

  // 绘制黑洞
  ctx.fillStyle = gradient;
  ctx.beginPath();
  ctx.arc(canvas.width/2, canvas.height/2, 300, 0, Math.PI*2);
  ctx.fill();

  requestAnimationFrame(drawBlackHole);
}

drawBlackHole();

使用Three.js创建3D黑洞

通过WebGL库Three.js实现更逼真的3D效果:

import * as THREE from 'three';

const scene = new THREE.Scene();
const camera = new THREE.PerspectiveCamera(75, window.innerWidth/window.innerHeight, 0.1, 1000);
const renderer = new THREE.WebGLRenderer();
renderer.setSize(window.innerWidth, window.innerHeight);
document.body.appendChild(renderer.domElement);

// 创建黑洞几何体
const geometry = new THREE.SphereGeometry(5, 64, 64);
const material = new THREE.MeshBasicMaterial({ 
  color: 0x000000,
  side: THREE.DoubleSide
});
const blackHole = new THREE.Mesh(geometry, material);
scene.add(blackHole);

// 添加吸积盘效果
const diskGeometry = new THREE.TorusGeometry(7, 2, 16, 100);
const diskMaterial = new THREE.MeshBasicMaterial({ 
  color: 0x5500ff,
  side: THREE.DoubleSide,
  transparent: true,
  opacity: 0.7
});
const accretionDisk = new THREE.Mesh(diskGeometry, diskMaterial);
accretionDisk.rotation.x = Math.PI / 2;
scene.add(accretionDisk);

camera.position.z = 15;

function animate() {
  requestAnimationFrame(animate);
  blackHole.rotation.y += 0.01;
  accretionDisk.rotation.y -= 0.02;
  renderer.render(scene, camera);
}
animate();

实现引力效果

为黑洞添加引力效果,使周围物体被吸引:

const particles = [];
const particleCount = 100;

// 创建粒子系统
for (let i = 0; i < particleCount; i++) {
  const particle = {
    x: Math.random() * canvas.width,
    y: Math.random() * canvas.height,
    vx: Math.random() * 2 - 1,
    vy: Math.random() * 2 - 1
  };
  particles.push(particle);
}

function updateParticles() {
  const centerX = canvas.width/2;
  const centerY = canvas.height/2;

  particles.forEach(p => {
    // 计算粒子到黑洞中心的距离
    const dx = centerX - p.x;
    const dy = centerY - p.y;
    const distance = Math.sqrt(dx*dx + dy*dy);

    // 应用引力
    if (distance > 10) {
      const force = 1000 / (distance * distance);
      p.vx += dx / distance * force;
      p.vy += dy / distance * force;
    }

    // 更新粒子位置
    p.x += p.vx;
    p.y += p.vy;

    // 绘制粒子
    ctx.fillStyle = 'white';
    ctx.fillRect(p.x, p.y, 2, 2);
  });
}

性能优化建议

使用离屏Canvas进行预渲染 实现粒子对象的对象池管理 对距离计算使用近似值而非精确平方根 限制动画帧率在60FPS以内

js实现黑洞

这些方法可以组合使用,根据需求调整参数实现不同强度的黑洞视觉效果。

标签: 黑洞js
分享给朋友:

相关文章

js实现分页

js实现分页

分页的基本实现思路 在JavaScript中实现分页功能通常需要结合前端和后端逻辑。前端负责渲染分页控件和处理用户交互,后端负责提供分页数据。 前端分页实现 纯前端分页适用于数据量较小的情况,可以直…

js实现复制到剪贴板

js实现复制到剪贴板

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

js 实现链表

js 实现链表

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。与数组不同,链表在内存中是非连续存储的,插入和删除操作效率较高。 链表的实现 在 JavaScrip…

js实现点击显示和隐藏

js实现点击显示和隐藏

实现点击显示和隐藏的JavaScript方法 使用classList.toggle切换类名 通过添加/移除CSS类控制元素的显示与隐藏,需提前在CSS中定义隐藏样式(如display: none)。…

js实现防洪

js实现防洪

防抖(Debounce)实现 防抖的核心思想是在事件触发后延迟执行回调函数,若在延迟时间内再次触发事件,则重新计时。适用于输入框搜索、窗口调整等场景。 function debounce(func,…

链表实现js

链表实现js

链表的基本概念 链表是一种线性数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针(单向链表)或两个指针(双向链表)。与数组不同,链表在内存中非连续存储,插入和删除操作更高效,但随机…