ブラックホールの「陰」と光の舞いを可視化する — C++/WebAssemblyで動くシュワルツシルト測地線トレーサーを遊んでみよう

要約

C++で実装しWebAssemblyにコンパイルしたインタラクティブなシュワルツシルト空間の光線トレーサー。観測点やインパクトパラメータを変えながら、事象の地平線・光子球・降着円盤といった一般相対論的な効果をリアルタイムで可視化できる。

この記事を読むべき理由

日本でも大学の教室、プラネタリウム、ゲームやVR表現で「重力レンズ」やブラックホールの見た目を正確に再現したい需要が高まっています。本ツールは軽量でブラウザで動き、概念理解からプロトタイプ実装まで応用しやすい点が魅力です。

詳細解説

このデモはシュワルツシルト計量に従う「光の経路(null geodesics)」を数値積分して、各初期光線が事象の地平線に落ちるか(捕獲)、遠方に脱出するか、あるいは光子球付近でスワールするかを判定し、ピクセルごとに色を割り当ててレンダリングします。

基本となる計量は \(ds^2 = -\left(1-\frac{2M}{r}\right)dt^2 + \left(1-\frac{2M}{r}\right)^{-1}dr^2 + r^2(d\theta^2+\sin^2\theta\,d\phi^2),\) で、光(null)の運動はエネルギー $E$、角運動量 $L$ を保存するため、影響を受けるのは有効ポテンシャル \(V_\mathrm{eff}(r)=\frac{L^2}{r^2}\left(1-\frac{2M}{r}\right).\) 光子球は半径 $r=3M$ に位置し、臨界インパクトパラメータは $b_c=3\sqrt{3}\,M$ で、これを境に光が捕獲されるか回避されるかが決まります。

実装面のポイント:

WebAssembly化の利点:

デモにある主要パラメータ(原文のUI表現から)

簡潔な擬似コード(C++): 積分の考え方を示します。

// cpp
Vec4 initPhoton(int i, int j, Camera cam);
void integrateNullGeodesic(Vec4 x, Vec4 k, double M) {
  for (int step=0; step<MAXSTEP; ++step) {
    rk4Step(x, k, dt, M);
    double r = radius(x);
    if (r <= 2.0*M) { markCaptured(); break; }     // event horizon
    if (r > R_ESC) { markEscaped(); break; }       // escaped to infinity
    if (nearPhotonSphere(r, 3.0*M)) { markPhotonSphere(); }
  }
}

日本市場との関連

実践ポイント

引用元

📌 引用元:
Schwarzschild Geodesic Visualization in C++/WebAssembly
Hacker News Score: | Comments: