four_seasons.jpg


四季の移ろい

 こんな感じ(↓)で、無作為に立方体オブジェクトを散らしたような空間があります。

topv.jpg

 画面中心に近づくと立方体が大きくなっていて、外側に目を移すと逆に小さくなっているようです。4色の立方体が4方向から混じっています。

 無作為(ランダム)に散らばったように見える立方体ですが、実は、ある決まった一点から見ると、文字が読めるように配置されています。「決まった一点」から眺めたシーンを集めたのが、こちら(↓)。

four_seasons.jpg

 今回は、「春夏秋冬」の4文字を散らしてみました。

モデリング

 「文字を3Dデータに変換する」では、文字を3D空間にマッピングしました。

chr2ply.jpg

 今回は、これを応用します。まずは、「春夏秋冬」の文字をグラフィック画面に描画して、1文字づつPLYファイルに変換しておきます。
 PLYファイルから読み込んだ3Dドットデータを以下図の様に、4つの面に配置します。

topv2.png

 この時、「決まった一点」から見た時に奥行き方向に見えるランダムな深度(位置)へ、ドットをずらして配置します(↓)。

  procedure prjcub l,m,n, r
  {
    var ex=HH/2;
    var ey=HH/2;
    var ez=0.5*CR;
    l=l - ex;
    m=m - ey;
    n=n - ez;
    var dd=sqrt (sq (l) + sq (m) + sq (n));
    var d2=dd + rnd (CR);
    para ex,ey,ez;
    cuboid l*d2/dd,m*d2/dd,n*d2/dd, r*d2/dd;
  }


 変数(ex,ey,ez)が「決まった一点」の座標です。view命令を使って、この点に視点を配置すると、その位置からだけ、文字を読み取ることが出来ます。この手続きの呼び出し元に一次変換命令が作用していると、座標(ex,ey,ez)も、その一次変換に影響を受けて移動します。その分を考慮して、view命令の視点座標を設定する必要があります。
 この時、奥行き方向の奥まったところに移動させた立方体(cuboid命令)は小さく見えてしまうので、奥に配置された分だけ大きくしてあります。

 こうして、「決まった一点」から見た時の奥行き方向に散らばった立方体が出来上がり、その結果が最初に示した図となります(以下図、再掲)。

topv.jpg

動かす

 「決まった一点」は、文字毎に4か所あるので、正方形の周りをまわりながら、4か所の「決まった一点」からの画像を表示して行きます。

  model
  {
    var fp1f=(fp1%0.25)/0.25;
    var fp1i=int (fp1/0.25);
    rotx -90*(1 - cos (PI*fp2))/2;
    roty 90*fp1i + 90*(1 - cos (PI*fp1f))/2;
    view 1*CR, 0,1,0, 0,0,0, 0,0,1.5*CR;
    leverz 1,2,3;
    loc 0,0,1.5*CR, 1, 0.70,0.70,0.70;
  }


 「決まった一点」からほんの少しずれただけで、全く文字に見えなくなってしまうため、「決まった一点」の周囲で回転スピードを抑えるように計算しています。roty命令のパラメータがその苦労の後です。


完成データ

 完成したデータをリンクしておきます。

Xi-TRACEデータ four_seasons.xitr

 上のデータでレイトレーシングして作成した動画をご覧に入れます(↓)。



 文字列は4文字で固定してあります。3文字や5文字など、異なる文字数に対応したい場合は、ご自身でどうぞ。4文字だと四字熟語の表示には使えますが、人の名前とかを表示したい場合には、3文字とか5文字とかに対応した方が応用が広がりますからね。


home

download

gallery