
时空引力透镜与光线偏折Canvas 绘制广义相对论先锋艺术1915 年阿尔伯特·爱因斯坦Albert Einstein发表了震撼人类文明的广义相对论General Relativity。爱因斯坦指出引力并不是一种传统意义上的超距“力”而是有质量的巨大天体导致其周围的四维时空结构发生了物理弯曲当来自遥远背景星系的光线穿过一个大质量天体如超大质量黑洞或星系团附近时光线会沿着弯曲时空的测地线Geodesic发生剧烈偏折——这在天文学中被称为“引力透镜效应Gravitational Lensing”。当背景光源、透镜黑洞与地球观察者处于绝对同一直线上时原本孤立的点光源会被引力场撕裂、拉伸为一个完美的明亮光环——这就是宇宙中最壮丽的几何图腾爱因斯坦环Einstein Ring。在生成艺术领域引力透镜是创造充满深邃宇宙宿命感、时空扭曲与高反差视觉张力的至高物理模型。本文将深入推导广义相对论引力光线偏折角方程并在 HTML5 Canvas 中手写一个鼠标实时驱动黑洞引力透镜巡弋的先锋生成艺术画卷。广义相对论光线偏折角与透镜方程推导设一个质量为 $M$ 的致密点质量透镜如黑洞其史瓦西引力半径Schwarzschild Radius为$$R_s \frac{2 G M}{c^2}$$当一束光线以碰撞参数Impact Parameter / 距离透镜中心的最短距离$b$掠过该天体时经典牛顿力学预测的偏折角为 $\hat{\alpha}_{Newton} \frac{2 G M}{c^2 b}$广义相对论结合时空弯曲给出的精确一阶弱场偏折角为牛顿值的整整 2 倍$$\hat{\alpha}(b) \frac{4 G M}{c^2 b} \frac{2 R_s}{b}$$遥远背景星源 (Source Plane: beta) \ \ (光线直行) \ ▼ (经过透镜平面 Lens Plane) [黑洞透镜 (质量 M / 偏折角 alpha 2Rs / b)] / / (光线发生剧烈时空弯折) / ▼ 观察者眼睛 (Observer Plane: 看到视位置 theta)引力透镜几何映射方程Lens Mapping Equation设未偏折前的真实天球角坐标为 $\boldsymbol{\beta}$观察者实际看到的视坐标为 $\boldsymbol{\theta}$$$\boldsymbol{\beta} \boldsymbol{\theta} - \boldsymbol{\alpha}(\boldsymbol{\theta}) \boldsymbol{\theta} - \theta_E^2 \frac{\boldsymbol{\theta}}{|\boldsymbol{\theta}|^2}$$其中 $\theta_E$ 为爱因斯坦环角半径Einstein Radius$$\theta_E \sqrt{\frac{4 G M}{c^2} \frac{D_{ds}}{D_d D_s}}$$物理直觉当视坐标处于爱因斯坦环外围$|\boldsymbol{\theta}| \theta_E$时光线向外轻微排开当视坐标接近中心$|\boldsymbol{\theta}| \to 0$时偏折角趋向无穷大视线被吸入黑洞事件视界Event Horizon在中心形成一片绝对虚无的漆黑暗影Canvas 逆向光线追踪引力透镜着色引擎在计算机屏幕上渲染引力透镜采用逆向光线投射算法Inverse Ray Lensing遍历屏幕上的每一个像素 $(x_{screen}, y_{screen})$计算其相对于黑洞中心的光线偏折反推坐标 $(x_{source}, y_{source})$并从背景宇宙深空星尘纹理中采样色彩// gravitational-lensing-engine.ts export class GravitationalLensStage { private canvas: HTMLCanvasElement; private ctx: CanvasRenderingContext2D; private bgStarsBuffer: ImageData | null null; // 黑洞爱因斯坦环物理半径 (像素) public einsteinRadius: number 72; public eventHorizonRadius: number 24; constructor(canvas: HTMLCanvasElement) { this.canvas canvas; this.ctx canvas.getContext(2d)!; this.generateCosmicBackground(); } // 1. 生成程序化深空星尘背景 (Procedural Deep-sky Stars Nebula) private generateCosmicBackground() { const w this.canvas.width; const h this.canvas.height; const imgData this.ctx.createImageData(w, h); const data imgData.data; for (let i 0; i data.length; i 4) { // 深邃冷夜底色 data[i] 7; data[i 1] 10; data[i 2] 19; data[i 3] 255; // 随机撒播 0.4% 的高亮恒星晶体 if (Math.random() 0.004) { const brightness Math.floor(Math.random() * 155 100); data[i] brightness; data[i 1] brightness; data[i 2] 255; } } this.bgStarsBuffer imgData; } // 2. 实时引力透镜光线畸变渲染 public renderLensingFrame(blackHoleX: number, blackHoleY: number) { if (!this.bgStarsBuffer) return; const w this.canvas.width; const h this.canvas.height; const outImgData this.ctx.createImageData(w, h); const outData outImgData.data; const bgData this.bgStarsBuffer.data; const thetaESq this.einsteinRadius * this.einsteinRadius; const rHorizonSq this.eventHorizonRadius * this.eventHorizonRadius; for (let y 0; y h; y) { for (let x 0; x w; x) { const outIdx (y * w x) * 4; // 计算当前视线距离黑洞中心的相对矢量 const dx x - blackHoleX; const dy y - blackHoleY; const distSq dx * dx dy * dy; // A. 坠入黑洞事件视界内部: 绝对虚无死黑 if (distSq rHorizonSq) { outData[outIdx] 0; outData[outIdx 1] 0; outData[outIdx 2] 0; outData[outIdx 3] 255; continue; } // B. 广义相对论引力偏折逆向寻址: beta theta - (theta_E^2 / distSq) * theta const deflectionFactor thetaESq / distSq; const srcX Math.floor(blackHoleX dx * (1 - deflectionFactor)); const srcY Math.floor(blackHoleY dy * (1 - deflectionFactor)); // C. 采样背景星空 (边界安全检查) if (srcX 0 srcX w srcY 0 srcY h) { const srcIdx (srcY * w srcX) * 4; // 若恰好处于爱因斯坦环附近 (distSq ≈ thetaESq)叠加高能引力高光发光环 const isRingGlow Math.abs(Math.sqrt(distSq) - this.einsteinRadius) 3.5; if (isRingGlow) { outData[outIdx] Math.min(255, bgData[srcIdx] 120); // 激发引力高光蓝白金 outData[outIdx 1] Math.min(255, bgData[srcIdx 1] 160); outData[outIdx 2] 255; } else { outData[outIdx] bgData[srcIdx]; outData[outIdx 1] bgData[srcIdx 1]; outData[outIdx 2] bgData[srcIdx 2]; } outData[outIdx 3] 255; } else { outData[outIdx] 7; outData[outIdx 1] 10; outData[outIdx 2] 19; outData[outIdx 3] 255; } } } this.ctx.putImageData(outImgData, 0, 0); } }总结引力透镜是广义相对论时空几何学在浩瀚宇宙中书写的宏伟诗篇。通过将光线偏折角微分方程转化为 Canvas 上的逆向光线投射着色算法我们在屏幕上亲手点亮了一座让时空弯曲折叠、星尘流转汇聚的爱因斯坦环为现代数字生成艺术注入了来自理论物理学最深邃的宇宙史诗之美。