こんな感じ(↓)で、無作為に立方体オブジェクトを散らしたような空間があります。
画面中心に近づくと立方体が大きくなっていて、外側に目を移すと逆に小さくなっているようです。4色の立方体が4方向から混じっています。
無作為(ランダム)に散らばったように見える立方体ですが、実は、ある決まった一点から見ると、文字が読めるように配置されています。「決まった一点」から眺めたシーンを集めたのが、こちら(↓)。
今回は、「春夏秋冬」の4文字を散らしてみました。
「文字を3Dデータに変換する」では、文字を3D空間にマッピングしました。
今回は、これを応用します。まずは、「春夏秋冬」の文字をグラフィック画面に描画して、1文字づつPLYファイルに変換しておきます。
PLYファイルから読み込んだ3Dドットデータを以下図の様に、4つの面に配置します。
この時、「決まった一点」から見た時に奥行き方向に見えるランダムな深度(位置)へ、ドットをずらして配置します(↓)。
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命令)は小さく見えてしまうので、奥に配置された分だけ大きくしてあります。
こうして、「決まった一点」から見た時の奥行き方向に散らばった立方体が出来上がり、その結果が最初に示した図となります(以下図、再掲)。
「決まった一点」は、文字毎に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文字とかに対応した方が応用が広がりますからね。