ちょっと、実験的な試みで、「いつもレイトレーシングで作っている様な物体をナノブロックで作ったらどうなるのだろう?」と、思って、試行してみました。
子供の頃、ブロック遊びが好きで、暇があればブロックを使って遊んでいた記憶があります。使いたい部品を探して、ブロックの入った箱の中をかき混ぜながら探すので、「うるさい!」と、怒られることもしばしば。でも懲りずに遊んでいました(1^^;)v。
ナノブロックと言うのは、その当時遊んでいたブロックよりも小さいブロックで、ちょっとしたマスコットやアクセサリみたいなものを作ることのできる玩具になっています。
ナノブロックを画像検索する(別ウインドウが開きます)
「ドット絵」の3D版(かつ、実物版)、みたいな感じでしょうか?自由度が制限され、小さなブロックで作る立体造形って、中々面白いです。
まずは、ナノブロック1個分のモデリングからスタートします。
基本的には、立方体のボディの上に、円筒形の凸部分が飛び出した形をしています。凸部分の逆側(下側)には、その凸部分を差し込めるような穴が開いています。これは、Xi-TRACEで扱うことのできる、直方体(cuboid命令)や円柱面(cylind命令)、平面(plane命令)などを組み合わせて作って行けば、さほど難しくはありません(下図)。
細部にこだわるあまり、細かく面取りを施してしまったり、普段は見えない内部構造まで作り込んでしまい、無駄に使用プリミティブ数(cuboid、cylind等、基本形状の数)を増加させてしまいました。後ほどリンクする完成データでは、ナノブロック1個当たりのプリミティブ数は19個です。仮に、1,000個のナノブロックを使ってモデリングした場合、プリミティブ数は1,000×19=19,000個となり、それだけメモリも食いますし、計算時間も増大します。
多数のナノブロックを使う場合には、少し簡略化して、プリミティブ数を落とした方が良いかもしれません。
ナノブロックは、1個だけでは意味をなさないので、いくつか組み合わせて、違和感がないか確かめておきます。
良さそうです。これで完成とします。モデル記述は、完成データ(nano_block.xitr)の手続き(procedure nano_blk)になっていますので、そちらでご確認ください。
次に、前節で作った1個分のナノブロックを使って、3Dの物体をモデリングします。
「数学曲面のモデリング」で作ったハートの手続きを使って、ハートの内部にナノブロックを充填してみます。
procedure heart x,y,z, r
{
// 大きさを調整する
x=x*1.25/r;
y=y*1.25/r;
z=z*1.25/r;
// y軸方向に立てるため、z座標とy座標を入れ替える
var tmp;
tmp=y;
y=z;
z=tmp;
heart=(x^2 + (9/4)*y^2 + z^2 - 1)^3 - x^2*z^3 - (9/80)*y^2*z^3;
}
この手続きは、座標(x,y,z)と、ハートのサイズrを渡すと、その座標がハートの表面にある時には、変数heart=0を返します。数学的に、座標がピッタリ表面に存在することはまれなので、ハートの内部にある場合のheart<0と合わせて、座標がハートの内部にあるかどうか?を判定し、充填します。
表から見えるか否かは判定条件に入っていないため、表から見えない内部にもブロックが詰まっています。見えてもいないのに物体として定義されるので、メモリを消費するし、計算時間を増大させています。「表から見えるか否か」の判定は、そう簡単ではないので、この状態で許容しておきます。
ちなみに、上図の状態で、使用したナノブロックは2,751個で、プリミティブ数は2,751×19=52,269個でした。
完成版データでは、レイトレーシングの度に、ナノブロックの座標計算を実施するのは処理時間の無駄なので、最初の1回だけ計算して、一時ファイルに座標値を書き出しておき、レイトレーシング実行時にはファイルから座標値を拾って物体を定義しています。
今回の試行で手ごたえを感じられたら、polygon命令など、Xi-TRACEの機能に組み込もうかと考えていました。
でも、どうでしょうね〜、色々と課題が:
実物のナノブロックを使って、マスコットなどのオブジェクトを手作りするならまだしも、二次曲面で作った物体を自動変換してレイトレーシングするには、適さないみたいです。
「3Dドット絵」を描ける(造れる)ツールが有って、そのデータからナノブロックに変換できるなら、面白いかも知れません。いずれにしても、再検討が必要みたいです。
完成したデータをリンクしておきます。
Xi-TRACEデータ | nano_block.xitr |
以下、Xi-TRACEでレイトレーシングした動画です。
冒頭のナノブロック単体部分は、比較的高速に計算できるのですが、後のハートのオブジェ計算は遅いです。