LED(発光ダイオード)が、まるでロウソクの炎の様に瞬く「LEDキャンドル(別ウインドウで検索)」が市販されています。
それを作者なりに考察して、同じ様に瞬かせてみた記事が「#4-6 LEDキャンドル」からご参照いただけます。
今回は、そのテクニックを使って、レイトレーシングでLEDキャンドルを再現してみました。
デザインとしては、ロウソクを模した円柱状のオブジェクトの上に、RGB LEDと言う、R,G,B各色のLEDが1パッケージ内に集積された素子が挿さった形になっています。LEDの部分が、ロウソクで言うところの芯と炎に当たります。
ロウソクの光は、1/fゆらぎで瞬いているのだそうです。原理と言うか、ロウソクっぽく見せるためのテクニックは、「#4-6 LEDキャンドル」で解説してありますので、ご参照ください。1/fゆらぎ乱数列の作り方などもそちらのページで解説してあります。
こちらはレイトレーシング版ですので、更に「ロウソクの炎」に寄せるため、いくつか工夫してあります。
まず、ロウソクを模したLEDの光ですが、局所光線源と言う物を使って、再現しています。光線源の中心座標は、LEDを模した砲弾型の物体中心付近に配置してあります。実物のLEDを使った「#4-6 LEDキャンドル」(実物版)では、ここまでしかできないのですが、レイトレーシング版では、光線源の中心座標も、1/fゆらぎ乱数列を使って、揺らしています。
ロウソクの炎も同じで、空気の揺らぎ(風など)で炎が揺れると、光点が移動するので、それに伴って、炎が作り出す影も揺れます。実物版では、光点が移動しない(できない)ので、LEDの光が作り出す影が揺らぐことは無く、その点では本物の「ロウソクの炎」と違って見えてしまいます。
もう一点は、光の色合いです。「ロウソクの炎」も、燃焼の具合によって、微妙に色合いが変化しているものと考えられます。そこで、炎っぽく見える、基準となる色を決めておいて、その中で、R,G,Bの各色成分を別々な1/fゆらぎ乱数列を使って、制御することで、微妙な色合いの変化を作り出すようにして見ました。
こちらは、実物版でもやろうと思えばできたのですが、実際に使ったRGB LED(実物)の色再現性がそんなに良くなかったので、適用しませんでした。レイトレーシングでは、設定した色の通りに、きちっと発光してくれるので、適用することにしました。
光線源の明るさと、色、位置の微小変化分を、「#4-6 LEDキャンドル」に記載した方法で作成した1/fゆらぎ乱数列を使って生成し、ファイル(led_candle.txt)を用意しました。
実物版ではできなかった表現に、影の揺らめきがあります。レイトレーシング版では、局所光線源の中心座標を1/fゆらぎ乱数列で揺らしているので、影も揺らめきます。
普通、レイトレーシングの作り出す影は、きっちりとした輪郭線を持っているのですが、ここでも実際の「ロウソクの炎」に寄せるため、「半影」というテクニックを使っています。
Xi-TRACEの半影は、「光線源が有限の(0でない)大きさを持つ」ことに起因する、輪郭線のぼけた影です。
上図は、通常のレイトレーシング(左)と、半影表現を有効にしたレイトレーシング(右)の比較です。
Xi-TRACEでは、以下の2点を設定することで、半影表現を有効にします。
ある程度綺麗に見える画質で計算しようとすると、時間がかかるので、「ここぞ」と言うときにしか使い難いのですが、効果は絶大です。
完成したデータをリンクしておきます。
1) | Xi-TRACEデータ | led_candle.xitr |
2) | 瞬きデータ | led_candle.txt |
3) | 壁(コンクリート)の凹凸マッピングデータ | tetrapod_concrete.jpg |
1)でLEDキャンドルのレイトレーシングを実行します。2)は1)から読み込まれるLEDの瞬きデータ(1/fゆらぎ乱数列から生成しました)、3)は「消波ブロックのモデリング」で作成した、コンクリートの凹凸マッピングデータです。1)と同じディレクトリに置いてください。
以下、1/fゆらぎでロウソクの炎をエミュレートしているので、〜30FPSの再生速度が必要です。PC+有線LANなど、高速インターネット環境推奨です。
Arduinoという、MCU開発ボードを使って、RGB LEDをロウソクの様に光らせた、実物の動画はこちら(↓)。レイトレーシング版と同じ、1/fゆらぎ乱数列を使っています。
きっと、本物のロウソク(の炎)と並べてしまうと、全く違って見えるのではないでしょうか……?しかし、LEDキャンドル単体で眺めていると、それらしく見えてくるので不思議です。