「トランプをモデリングする」の時にモデリングしたトランプカード(下図)を応用して、もう少し別な作品を作ってみようと思います。
2枚のトランプカードを頂点で支え合わせて三角形の構造物を作り、それを積み上げることでピラミッドを作成してみました。三角形の構造物を2個並べ、頂点部分に、もう一枚トランプカードの橋を渡していくと、下図の様なピラミッドになります。
三角形は、トランプカードの長辺を使っているため、正三角形になっています。
実物のカードで同じ形状を作ろうとしても、カード同士がツルツル滑ってしまったりして、うまく組み上げられないでしょう。そこら辺りは仮想現実のCGならでは、と言う所です。
※実物のトランプカードでも、頂点部分に接着剤を使うなどして組み上げれば、制作できなくは無いと思います。
トランプカードは、A、2〜10、J、Q、Kの13枚あり、マークがクラブ、ハート、ダイヤ、スペードの4種類なので、合計52枚です(ジョーカは除いています)。
三角形の構造物1個には、言わずと知れた3枚のトランプカードが必要です。それが、ピラミッドの最下段(第5段)には5個、その上の第4段には4個、……と続き、最上段(第1段)には1個となりますので、合計すると:
第5段: 5個×3枚=15枚
第4段: 4個×3枚=12枚
第3段: 3個×3枚=9枚
第2段: 2個×3枚=6枚
第1段: 1個×3枚=3枚
−−−−−−−−−−−−−−−−
合計: 45枚
トランプカード52枚の内、45枚使いましたので、残りは7枚です。7枚では、もう一段増やすには足りないので、1セットで作製できる一番大きなピラミッドが5段となります。
全52枚の非重複乱数列を生成して順番に上から引きながらピラミッドを作ったので、1枚も重複したカードは使っていません(下コード)。
// unique random number sequence
var CN=13*4; // カードの種類(数)
varray card_draw:0,#(CN)=0;
var icard;
var ix,iy;
iy=0;
while (iy<4)
{
ix=0;
while (ix<13)
{
card_draw#(iy*13 + ix)=ix*10 + iy;
// continue
ix=ix + 1;
}
// continue
iy=iy + 1;
}
ix=0;
while (ix<CN)
{
iy=@(rnd (CN));
swap card_draw#(ix),card_draw#(iy);
// continue
ix=ix + 1;
}
上のコード実行後、配列変数card_draw#()に非重複乱数列が格納されているので、それを添え字0番から順々に使って行けば、1枚も重複しないカードを使うことができるのです。
また、下の完成動画を見ていただくと、いくつかのシーンから出来上がっていることが判ります。実はシーン毎に異なる乱数列を使って非重複乱数列を生成しているので、シーン毎に異なるカードの順番でピラミッドが出来上がっています。
rseed 134 + ( fp1=1 ) + ( fp2=1 ) + ( fp3=1 ) + ( fp4=1 ) + ( fp5=1 );
そう言った芸の細かさにも注目して見てくださいm(1^^)m。
※擬似乱数列の種(rseed命令)を作る時、実行の度に異なる乱数列を使うため、実行時の時刻などを使う場合が多いですが、分算レイトレーシングする時は使用厳禁です。上例の様に定数(固定値)で指定しないと、分散したCPU毎に異なる乱数を使ってしまうため、完成画像がぐちゃぐちゃになります。
完成したデータをリンクしておきます。
1) | Xi-TRACEデータ | card_pyramid.xitr |
2) | マッピングデータ(表) | card_front_full.xpic |
3) | マッピングデータ(裏) | card_back_maze.xpic |
1)〜3)でレイトレーシングを実行します。2)3)は、こちらで作成したマッピングデータの使い回しです。
完成した動画を以下にリンクしておきます。
リンクしたデータ(card_pyramid.xitr)の方は修正しておいたのですが、シーン選択のコード部分にバグがある状態で上の動画を計算してしまいました。バグによって、後ろの方のシーンに行くにつれ、局所光線源が1個づつ追加され、全体的に明るくなっています。計算時間も、その分多くかかっていたはず……。