鏡地獄:球面鏡の内部のレイトレース
シミュレーション条件
半径1の球面(球殻)を考え、その球の壁面は完全反射(反射率が100%)する鏡で出来ているとします。 その内部に高さ0.155、横幅0.3 のカラー文字列「永谷」(左図参照)を置いて、 並進や回転などの運動をさせます。 この文字列は自発的に発光しているものとし、 文字列は背後からの光を透過させない不透明なオブジェクトとします。 そして、球面内部の観測者は球面の中心から0.4離れた所から球面の中心方向を眺める事とします。
シミュレーション結果
完全反射する球面鏡内部では無限回の反射が内部の光景に寄与しますが、 計算時間の都合上、256回までの反射を計算しました。 その結果をGIFアニメーション(SphereInside.anim1.gif、ファイルサイズ2687kb、解像度320x256、96コマ)にして、以下の図1に張り付けました。
観測者にはこの様な光景が見えると予測されます。 一番手前に見える文字列が実像で、その他の(歪んだ)文字列像が反射によるものです。 このアニメーションを作るに際しての計算所要時間は、ThinkPad570E (Mobile PentiumIII 500MHz)を用いて4時間20分でした。 一コマ当たりの計算所要時間は、平均2分42秒、最大8分25秒、最小7秒と結構バラツキがありました。 コマの映像が派手(?)なほど再帰計算のレベルが浅いため、短時間で済みます。 文字列は単に発光しているだけで反射や屈折をしないため、計算量は単に球面での反射回数に比例するのみです。(そうしておかないと、計算爆発が起こってしまう…。) マシンの能力と時間次第で、より高次の反射の影響まで容易に計算できます。
反射率が90%の鏡で出来た球面反射鏡の内部では、 50回程度の反射で光線は十分減衰します。
(0.9)^50 ≒ 0.0051 ≒ 1/256
この事から必要な計算は有限で済む事が分かります。 反射率が90%でコマ数を2/3にケチり、それ以外の条件を同じにした場合もシミュレーションしてみました。 結果のGIFアニメーションです。 この場合の計算所要時間はちょうど1時間でした。
結論?
とりあえず、『球形の鏡の部屋』の内部の光景は計算してみました。 現実問題としては、光源として懐中電灯などを携えていく必要があります。 この計算結果から、実際に鏡の部屋に入った場合に発狂するかどうかは判断出来ませんでした。 多分、短時間なら鏡球殻の内部でも発狂しないという事でしょう。 長時間に渡って閉じ込められると、どんな部屋でも拘禁反応で発狂する気もしますが…。
プログラム公開
このシミュレーションなどのために C++言語(gcc向け)などで作ったプログラムを以下に公開します。
- 3次元物体のクラスと光線追跡のクラス定義の集合体のヘッダ: raytrace.h
- 計算時間管理のヘッダ: timerecord.h
- 球殻鏡内のアニメーション作成のためのC++メインコード:
SphereInside.cc
- コンパイル用&PPM文字列像作成用 makefile
- 「永谷」の文字列:nagatani.eps
出展さえ明示して頂ければ、自由に使用・改変してもらって構いません。
追記
この話題のネタ元は江戸川乱歩の小説「鏡地獄」(amazon:鏡地獄--江戸川乱歩怪奇幻想傑作選)だそうです。 ネットで検索すると、 「ウテバ響ク」さんの 「鏡地獄─江戸川乱歩」が結構分かりやすいレイトレーシングになっています。
永谷幸則@京都大学 基礎物理学研究所