ベジエクリッピング法によるメタボールの表示

各メタボールの密度分布を ベジエ関数 で定義し、レイ(視線)上の総密度もベジエ関数として表して、 総密度 = しきい値 となる最初の点(表面との交点)をベジエクリッピング法で求めます。 2つのボールが近づくと密度が加算され、滑らかに融合します。
操作:画像をクリックすると、その画素のレイ上の密度関数(ベジエ関数)と制御多角形、クリッピングで絞り込まれた区間が下に表示されます。
密度関数 f(s)(s = r²/R², b₀=1, b₃=0 固定)

クリックしたレイ上の密度関数 F(t) − T(ベジエ関数)とクリッピング

画像をクリックしてください。

アルゴリズム

  1. 密度関数をベジエ関数で定義:中心からの距離 r を s = r²/R² に正規化し、密度を3次ベジエ関数で表す(s ≥ 1 では 0)。
    f(s) = Σk=0..3 bk Bk3(s), b₀ = 1, b₃ = 0(b₂ = 0 で s = 1 において C¹ 連続)
    b = (1,0,0,0) のとき f = (1−s)³ となり、従来のソフトオブジェクトの密度関数と一致する。b₁, b₂ で分布形状を自由に制御できる。
  2. レイ上で区間分割:レイ p(t) = o + t d と各ボールの影響球(半径 R)の出入り点で t 軸を区間に分割する。各区間では、どのボールが影響しているかが一定である。
  3. レイ上の密度をベジエ関数に:区間 [ta, tb] を u ∈ [0,1] に正規化すると si(u) は u の2次式(2次ベジエ関数)。 ベジエ関数の乗算で f(si(u)) は 6次ベジエ関数 となり、総密度からしきい値を引いた
    G(u) = Σi f(si(u)) − T (6次ベジエ関数,制御点 gj は u = j/6 に配置)
  4. ベジエクリッピング:制御点 (j/6, gj) の凸包と u 軸の交差区間 [umin, umax] の外には解がないので、de Casteljau 法でその区間を切り出す。 縮小率が小さい(区間が 80% 以上残る)ときは2分割し、手前(t の小さい側)を優先して探索する。凸包が u 軸と交わらなければその区間に交点はない(取りこぼしなし)。
  5. 法線と色:交点で密度の勾配 ∇F = Σ f′(si)·2(p − ci)/R² を求め、−∇F を法線とする。色は各ボールの密度を重みとして混合する。
参考:T. Nishita, E. Nakamae, "A Method for Displaying Metaballs by using Bezier Clipping," Computer Graphics Forum, Vol.13, No.3, 1994, pp.271-280.