int metaimport(int handle, string attrib, vector P, <type>&value)
<type>[] metaimport(string file, string attribute, vector P)
すべての値を繰り返すのではなく、この形式は、すべてのメタボールから同時に値をインポートします。スカラーの時と同様にキーワードを使うことができます…
-
meta:density
-
meta:prim
-
meta:transform
…メタボールから非アトリビュートの情報をインポートします。
metastartとmetanextを使ってメタボールのハンドルを一度取得すれば、metaimport
でメタボールのアトリビュートを検索することができます。
検索できる“特別な”アトリビュートが3つあります:
float meta:density
現在のメタボールの密度。
float meta:prim
現在のメタボールのプリミティブ番号。
matrix meta:transform
現在のメタボールに関連したトランスフォーム。このトランスフォームの逆行列を適用すれば、ポイントがメタボールの“空間”に変換されます。
例えば、metaweight関数は、以下の方法で表現することができます:
float metaweight(string file; vector P) { int handle; float density, tmp; density = 0; handle = metastart(file, P); while (metanext(handle)) { if (metaimport(handle, "meta:density", P, tmp)) density += tmp; } return density; }
評価されるアトリビュートは、そのポジションでのメタボールのウェイトで事前に乗算されないので、ブレンドで乗算しなければなりません。 例えば、メタボール上のvectorアトリビュート(color)を評価するには、以下のように関数を使います:
vector meta_attribute(string file, attrib_name; vector P) { int handle; vector result, tmp; float density; handle = metastart(file, P); result = 0; while (metanext(handle)) { if (metaimport(handle, "meta:density", P, density)) { if (metaimport(handle, attrib_name, P, tmp)) result += density * tmp; } return result; }
i3dコンテキストでは、デフォルトのメタボールジオメトリ(コマンドラインでi3dgenプログラムに-g
オプションを指定)があります。
ファイル名が空っぽの文字列なら、デフォルトのジオメトリが使われます。
metaball |