何はともあれ、2020年はオリンピックイヤーなわけです。しかも東京。1月には、お台場の海の上に巨大なオリンピックシンボルが設置されたそうです。TVのニュースで、海の上に浮かんでいるところを遠目に見たら、「そんなに大きいのかな?」って、感じでしたが、台船の上で作業している人の姿が写っていて、それと比べたら、おっきかったです。W32.6m×H15.3m×D1.7mだそう。
作者も「少しは浮かれて見ようか」と思い立ち、オリンピックのシンボル、「五輪の輪」をモデリングしてみました。
オリンピックのシンボルは、5個のリングが、鎖の様につながったようなデザインになっています。5個のリングは、五大陸(ヨーロッパ、南北アメリカ、アフリカ、アジア、オセアニア)を表現したもので、その相互の結合、連帯を意味しているそうです。色は左から順番に、青、黄、黒、緑、赤の順番です。
そうか、五大陸の結合や連帯を表しているのなら、やっぱり、鎖の様につながったデザインが重要な意味を持っているわけですね。単に、同じ色のリングを5個作って、同じ位置に表示しても、オリンピックシンボルにはならない、と言う事か……。
それを立体の物体で作るとなると、ちょっと骨ですね。正面から見ると、綺麗な円形に見えないとかっこ悪いし、と言って、リングを鎖の様に繋げるためには、どうしてもリングをひねったり、傾けたりしないとなりません。
オリンピックシンボルの2Dデザインを観察して、各リングを「左側−中央−右側」の3か所に分けて考え、それぞれの高さ(または奥行き)を、−1、0、1の3段階で評価したところ、以下図の様になりました。
例えば、青と黄のリングが重なるところは2か所あります。青の中央(下)と、黄の左側が重なったところは、青の奥行きが0で、黄の奥行きが1ですので、黄のリングが手前に見えます。もう一か所、青の右側と黄の中央(上)が重なったところは、青の奥行きが1で黄の奥行きが0ですので、青のリングが手前に見えます。
その他の重なり部分に関して、上図の奥行き(−1,0,1)と、手前に見えるべきリングとのつじつまが綺麗に合いました。つまり、奥行き0の点を中心に、奥行き1の点が少し手前に来て、奥行き-1の点が少し奥に引っ込むように傾斜をつけるだけで、自然と上図の様なオリンピックシンボルを作ることができます。
上段3個と下段2個のリングで、傾斜の方向が逆になっていることがミソですね。
Xi-TRACEのデータ記述にすると、以下の様になります(リング1個分の記述)。
and
{
model
{
plane 0,0,-DD/2, 0,0,-1; // 背面
roty s;
plane 0,0,DD/2, 0,0,1; // 正面
}
// 側面
attr white;
cylind 0,0,0, 0,0,1, R1;
cylind 0,0,0, 0,0,1, -R2;
}
わかり難いかもしれませんが、「roty s;」の記述で、正面のパネルをs°傾けています。
最後にリンクするデータでは、s=±0.1°と、わずかにしか傾けていませんので、リングが歪んだりと言った、違和感は感じないはずです。
今回は、「リングを鎖の様に繋ぐ」のとは違って、正面から見た時にオリンピックシンボルに見える様に、厚みのある円筒を組み合わせました。まさに、お台場の巨大なオブジェと同じ様な感じです。
お台場の巨大オリンピックシンボルを画像検索(別ウインドウが開きます)
上の図で検討した、「奥行き(→傾斜)」の考え方は、オリンピックシンボルを鎖のように立体的につなげる時にも、有効だと思いますが、今回は未使用です。鎖にする場合には、さすがにs=0.1°という、小さな傾きでは、板の様に薄っぺらいリングしか交差させられません。厚みのあるリングを交差させるためには、ある程度sを大きくする必要が出てくるため、見る角度によっては、多少歪みが気になるかもしれませんね。
お台場の巨大オブジェクトをイメージして、今回モデリングしたオリンピックシンボルも、海をイメージした波の上に配置したいと思います。
「海の波」と言うと、トロコイド波を使う方が実際の波に近いのですが、今回は簡略化して、正弦波にしました。トロコイド波については、「トロコイドで作る海の波」をご覧ください。
以下の様にして、1周期分の正弦波を、画素の輝度値を高さに見立てて描画し、これを凹凸マッピングデータとして使用します。
// 波の凹凸データ生成
ginit 128,256,32;
// 描画
var pc;
var iy;
iy=0;
while (iy<fhei)
{
pc=(sin (2*PI*iy/fhei) + 1)/2;
col2pix pc,pc,pc, pc;
line 0,iy,fwid - 1,iy, pc;
// 継続
iy=iy + 1;
}
bmap sinwav, 0,0,fwid - 1,fhei - 1, 16,fhei;
数学的に計算した正弦波をそのまま、繰り返しマッピングして、並行な進行波として使うのですが、それではあんまり、なので、ちょっと、ひねってみます。
var bwt=1/2;
bump floor2=
{
nmap sinwav, WW/3;
mpla 0,0,0, 0,1,0, 0,0,-1, 2*R1,2*R1;
mreg 0,0, 0,0, 0,fpa*3/fn_pt2*fn_all;
muxa bwt;
};
bump floor1=
{
nmap sinwav, WW/5;
mpla 0,0,0, 0,1,0, 1,0,-1, R1,R1;
mreg 0,0, 0,0, 0,fpa*2/fn_pt2*fn_all;
muxa bwt, floor2;
};
muxaと言うパラメータを使って、2つの進行波を異なる角度で合成(多重)して、凹凸マッピングをかけています。
海や湖の水面には、色々な波が立っています。風が水面を動かして、波を作るのですが、その風も、常に決まった一定の方向から吹き続けるわけでは無いし、場所によっても風向きは変わるので、実はいろいろな方向から波が打ち寄せて、全ての波の合成波になっています。
今回は、「多重マッピング」という手法を使って、2方向からの正弦進行波を重ね合わせています。波の高さや波長、進行速度をそれぞれ異なる値に設定したので、少し複雑な波になっていると思います。
自然界の合成波は2個どころの合成ではないので、もっと複雑なはずですが、CGと言うことで、「らしさ」を醸し出せれば良いかと……。
ちなみに、多重マッピングには、上限を設けていないので、メモリと演算速度が許すなら、何重にも重ねることができます。多重マッピングの解説と、3重マッピングの例題は、こちらを参照(「WAVファイルのミキシング」)してください。
オリンピックシンボルを構成するリングが登場するシーンでは、1つ1つのリングがポンポン跳ねながら登場するようにしました。
物体が地面と完全弾性衝突して跳ね上がると、重力加速度g(=9.8m/s2)に引かれて落下します。一定加速度で加速された物体の速度は、時間tの経過の二次式になるので、一定方向に移動しながら跳ねる物体の軌跡は、放物線を描きます。
高さ方向をhとして、時間t経過した時の高さをtの関数として表現してみると、地面と衝突する周期をTと置いて、以下の様な数式になります。
h(t)=1−√(2×((t/T)%1)−1)
※a%b=a−floor (a/b)*b
時間t経過時の高さ方向の位置を上式で求め、横方向xには一定速度で移動させると、x(t)=V×tで横位置が求められます。後は、最終的な停止位置がオリンピックシンボルのリング位置となるように、パラメータを調整したら、完成です。
完成したデータをリンクしておきます。
Xi-TRACEデータ | olympic_symbol.xitr |
出場選手の活躍もさることながら、大会が滞りなく終わることを祈りたいと思います🎌。
Xi-TRACE R16以前のバージョンでは、bmap命令のsampleオプションの調整が不完全なため、波の境界線が見えてしまいます。画質を犠牲にして、バグを回避するデータになっていますので、より良い画質でレンダリングするためには、最新バージョン(R17以降)をダウンロードしてお使いください。