以前、Olive+の「万華鏡フィルタ」機能で万華鏡の動画データを作成しましたが、今度は、Xi-TRACEのレイトレーシングを使って万華鏡を再現してみます。
3つの鏡の板を正三角形の辺上に配置、その中に、ビーズやカラーセロハンなどの小片を配置する。適切に小片を動かすと万華鏡が出来上がるはず。
正三角形の辺上に鏡を配置して、万華鏡のメインの部分を作ります。
正三角形を形成する3つの辺を確定するのに、座標や方向をMODELAで計算するのは面倒ですので、回転させて作ってみます。
回転の中心となる点を決めます(原点(0,0,0)を中心にすることにします)。中心から一定距離(R2)離れた点を含む平面を作成し、この平面の属性を鏡面とします。この状態で、360/3°回転させ、その後、先ほどと同じ位置に2枚目の平面を配置します。これで、二辺分の鏡が配置できました。この状態で、更に360/3°回転させます。そして、またまた、先ほどと同じ平面を定義します。これできれいに正三角形の辺上に3つの鏡を配置することができました(下図)。
Xi-TRACEの記述は以下の様になります。
var idx;
idx=0;
static : while (idx<NN)
{
rotz 360/NN;
plane R2,0,0, -1,0,0;
idx=idx + 1;
}
正三角形なので、NN=3に設定してあります。回転によって正多角形を形成しているため、NNを適切な値にすることで正三角形以外の形状にすることも簡単です。後で、別な形状も試してみましょう。
なお、回転の一次変換rotzを使っていますが、一次変換はブロック{ }の内部だけで有効なため、ブロックを生成するwhileにstaticを付けて、ブロック{ }内の一次変換が、ブロック{ }の外まで有効になるように指定しています。
鏡面の属性を作るには、鏡面反射率を設定するreflを使います。
attr 万華鏡=
{
refl 0.90,1,0.2;
};
鏡面反射率を0.90(=90%)としてあり、反射すると、光が10%づつ減衰するようになっています。従って、底面の正三角形が少しづつ濃い色の灰色に見えるようになり、鏡の境界線が確認できるようになっています。ここを1.00(=100%にすると、正三角形は視認できなくなります。
最初に実行した時に、小片の初期位置、形、色、等々をランダムに決定し、アニメーションのフレーム番号毎に動かして、座標値などをファイルに書き出しておきます。以降のレイトレーシングでは、ファイルを読み込みながら現在のフレーム番号に相当するデータについて、実際の物体を定義しています。
動きの方向は、最初にランダムに決定しておきます。一度動きの方向が決定すると、一定の場所に到達するまで動き続けます。「一定の場所」、これを正三角形の外接円の円周とします。
動かした結果、座標が外接円の円周(あるいはその外側)に到達した場合、その時点で動きの方向をランダムに設定しなおします。すると、小片は外接円の円周でランダムに跳ね返る動作を繰り返すようになります。動く方向は乱数で決めているので、運が悪いと、スピードが0または、0に近い小片ができてしまう可能性がありますが、気になる場合は、乱数の種を変更して、乱数の出方を変えてみてください。
rseed 123; // 乱数の種を固定値にして、毎回同じ乱数を発生させる
rseedのパラメータに0を指定すると、その時の内部タイマ値を種として設定しますので、毎回違った動きにすることが可能です。ただし、「今日は半分まで計算させて、(PCをシャットダウン)、明日残りを計算させよう」とか、複数のCPUに分配して計算させたりする場合、気を付ける必要があります。実行の度に異なる乱数を発生しますので。
上の例の様に、非0の固定値にしておけば、毎回同じ乱数が同じ順番で発生するので、安心です。種の数値さえ覚えておけば、同じ状態を再現することができます。
まずは、普通の万華鏡(正三角形)画像。
一回、鏡で反射すると、光線強度が90%に減少するようになっているので、底面の正三角形の色(灰色の濃さ)で反射回数がわかります。この画像だと、5回反射まで視界に入っています。視野を広げて、もっと先の反射像まで見えるようにする場合、cond命令のトレースレベル値(第3パラメータ)に注意してください。
cond 0,3, 10,10,0;
現在の設定では、10(第3パラメータ)になっていますので、10回反射まではトレースしますが、それを超えると、トレースを途中で断念して計算時間を節約しようとします。10回を超える反射像まで見たい場合は、このパラメータ値をもっと大きな値にする必要があります。
もう一つ、図の矢印で示した立方体に注目してください。物体としては同じもの(鏡の中の像)が見えているはずですが、ハイライトの入り方(光り方、テカり方)が違います。ハイライトは光線源の方向と視線の方向で決まります。鏡の中の像は、反射によって視線の方向が変化しているため、鏡を通さずに見た場合と比べて、ハイライトの付き方が変わるみたいですね(単に90%の減衰で暗くなっただけ、ではないですよ)。
鏡を配置するところで説明したように、定数NNの値を変更すると、鏡の形状を変えることができるようになっています。NN=5として正五角形の万華鏡を覗いてみましょう。
ちょっと複雑な画像になりました。こんな風に見えるんですね……。物理モデルに従って反射光を計算しているので、実際に正五角形の万華鏡を作ると、こんな風に見えるはずです。
正三角形の万華鏡では、境界線を挟んで互いに鏡像が映り込むのですが、正五角形バージョンでは、互いに鏡像にならない、不連続な境界線が発生しており、ちょっと、美しさに欠ける様に思います。
静止画だけですが、計算させてみました。
これ、動かすとどうなるのでしょう??興味ある方は、データをダウンロードして計算させてみてくださいね。
はい。調子に乗りました。
どこまでNNの値を大きくしても、所詮は平面で作った多角形、反射像がカクカクして見えています。ですが、さすがに正360角形くらいまでくると、ほぼほぼ「円」なわけです。円筒状の鏡を覗くと、こんな感じに見えるんですよ、きっと(カクカクがなくなって、なめらかに見えるハズですが)。
ただまあ、「ふ〜ん」と言う感じですね……。もはや、万華鏡ではない。綺麗な(綺麗に見える)万華鏡を作るなら、正三角形がベストみたいです。
完成したデータと動画です。
Xi-TRACEデータ:kaleidoscope.xitr
まずは正三角形の万華鏡。
次はNN=5に設定して計算させた、正五角形の万華鏡です。
比較的新しい機能をちまちまと使っていますので、Xi-TRACEは最新版をダウンロードして使ってください。