当前位置:首页 > 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实现日历的核心是动态生成日期表格,并处理月份切换逻辑。需要计算当前月的天数、起始星期几,并动态渲染到页面上。 获取当前日期信息 通过Date对象获取当前年…

jquery js

jquery js

jQuery 简介 jQuery 是一个快速、简洁的 JavaScript 库,简化了 HTML 文档遍历、事件处理、动画和 Ajax 交互。它兼容多种浏览器,提供易于使用的 API,使开发者能够更高…

js实现驼峰

js实现驼峰

实现驼峰命名的几种方法 使用正则表达式和字符串替换 通过正则表达式匹配字符串中的特定模式(如下划线或短横线),并将其后的字母转换为大写,同时移除分隔符。 function toCamelCase(s…

js实现防洪

js实现防洪

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

js实现目录

js实现目录

实现目录的基本思路 在JavaScript中实现目录功能通常涉及以下几个核心步骤:解析文档中的标题元素(如h1-h6),动态生成目录结构,并添加交互逻辑(如点击跳转)。以下是具体实现方法: 解析标题…

js实现代码雨

js实现代码雨

实现代码雨效果 使用HTML5 Canvas和JavaScript可以轻松实现经典的代码雨效果。以下是完整的实现代码和说明: HTML结构 <!DOCTYPE html> <…