int metamarch(int &index, string filename, vector &p0, vector &p1, float displace_bound)
p0とp1で定義した光線を受け取り、それをゼロまたはもっと細かい区間で区切り、それぞれの区間がfilenameからのメタボールのクラスタと交差します。 その区間が実際にはメタボールと交差しなければ、クラスタ上で非常に狭い境界を用意します。
この関数は、ray-marchingアルゴリズムが交差しない領域を“スキップ”して、メタボールで見つかった領域のみに集中してmarchingをします。
初めて関数をコールする時は、index=-1を使い、p0とp1を光線の終点に設定します。 関数が区間を見つければ、1を返し、p0とp1をその区間の終点に設定してから、indexの値を増やします。 そうでない場合は、0を返し、引数の値を変更しません。
つまり、indexの変数で関数を繰り返してコールすれば、交差する領域にray-marchingを実行して、交差しない空間をスキップすることができます:
int index; vector p0, p1; // 入力値を初期化 index = -1; p0 = Eye; p1 = P; result = 0; while (metamarch(index, metaball_file, p0, p1, displace_bound)) { result += ray_march(metaball_file, p0, p1); }
metaball | |
ray |