MetaBall





ソースのみmetas.lzh(25.7kbyte)
実行ファイルのみmeta.lzh(29.4kbyte)

テクスチャー無しコメントあり、DIB非使用
mnotex.lzh(4.40kbyte)

実行ファイルのみの方の実行にはDelphi3のランタイムが必要です。
ない方でActiveXが使用可能な方はここで入手してください

または

vcl30.dpl(1.21Mbyte)
vclx30.dpl(209kbyte)

これらをダウンロードして
Windowsのシステムフォルダに入れてください

・メタボールとは
  いくつかの電荷を持った物体の回りの空間の等電位面を表面とする
 物体のようなものです。よく、凸凹の多い曲面を持つ物体の
 モデリングとかに使われます。

・投影の概念   レイトレーシングなどでは、視点から画面のピクセルへの
 線を伸ばして、物体との交点を探します。
 そして、物体の交点の色を調べてピクセルに描画すれば3DGraphicsが描けます。
・どうやって面を探すか
  球とかならば直線の方程式との交点を方程式を解くことで求められますが、
 メタボールの場合は、視線上を手前から順々に調べていき、濃度がある
 程度以上高くなったら、そこを面とします。
  ある位置における濃度を調べる計算は、点とメタボールまでの距離をrとして、
 1/(r2)とするのが正しいですが、私は気分で1/(1+r4)にしました。
 この計算を全てのメタボールについておこなって和を取ると、濃度となります。



  ということで、まず視線の方程式を作ります。

    x = Ex * t + xo
    y = Ey * t + yo
    z = Ez * t + zo

  というようになります。Ex,Ey,Ezは視線の向きを示す単位ベクトルのx,y,zの値です。
 つまりSqrt(Ex*Ex+Ey*Ey+Ez*Ez)が1ということです。xo,yo,zoは視線の位置です。
 多くの場合、簡略化のためにxo,yoを0にします。また、画面の位置は中心が
 原点にくるようにします。

  この線に沿って視点から初めて順々にここは面かどうかを調べていくのは
 結構重いので調べる範囲をもっと狭めます。
  これで球とかの交点を求めることが出来ます。

    x=Ex*t
    y=Ey*t
    z=Ez*t+zo

  これらを球の方程式に代入(球の中心x1,y1,z1)

    (x-x1)2+(y-y1)2+(z-z1)2=r2
    (Ex*t-x1)2+(Ey*t-y1)2+(Ez*t+zo-z1)2=r2
    (Ex2+ Ey2+Ez2)*t2+(-2Ex*x1-2Ey*y1-2Ez*z1+Ez*zo)*t
       +x12+y12+z12-zo2-2zo*z1-r2=0

  こういう感じにすればtを変数とする2次方程式が出来ます。
 これの解が、視線の球面との交点になります。(虚数解は視線が球と交わらない)
 球と直線の2つの交点の間で視線方向からtの値を適当に動かしてやって(tを加算する)、
 交点を求める処理をするという感じにしてやれば、調べる範囲は限定されます。

  座標はtの値に代入すれば得られます。
 その座標の値をもとにして、メタボールまでの距離を求めます。

・影付け
  影付けには法線ベクトルを使います。
 平行光源の場合は、光の方向ベクトルと法線ベクトルの内積を取ると
 それぞれが単位ベクトルなら、これらのベクトルの角度の余弦になります。
 これに1加えて2で割ると1から0の値が返ってきます。私の場合はこれをそのまま
 色の強さにしました。

  メタボールの場合の法線ベクトルの求めるには、まず見つかった境界面の点の近くに
 適当な3点をとります。この点の取り方はX軸方向にずれた点、Y軸方向にずれた点、
 Z軸方向にずれた点、という形にするのがいいと思います。これらの点の濃度差か  ら法線ベクトルを求めることが出来ます。

    見つかった境界面の点の濃度:D
    X軸方向にずれた点の濃度:Dx
    Y軸方向にずれた点の濃度:Dy
    Z軸方向にずれた点の濃度:Dz
    法線ベクトル:V=(Vx,Vy,Vz)
    法線ベクトルの大きさ:r
    法線ベクトル(単位ベクトル):EV=(EVx,EVy,EVz)

    Vx = Dx - D
    Vy = Dy - D
    Vz = Dz - D

   単位ベクトルにします。

    r = Vx * Vx + Vy * Vy + Vz * Vz
    EVx = Vx / r
    EVy = Vy / r
    EVz = Vz / r

  以上でとりあえずは終わりとします。わからないことがあったら
質問してください。
 テクスチャーの張り方はいまいち自信がないので今回は説明しません。
 見えないところで間違えている可能性があります。

変数対応表
説明文 プログラム
Ex
Ey
Ez
xa
ya
za
視線と球の交点 ot1,ot2
※ただし簡易化のために
複数の球が重なった場合は
それらの点の中で一番近いものと
遠いものが選ばれる

参考文献

CによるCGレイトレーシング
千葉則茂/村岡一信 共著
サイエンス社

by 黒田 Dycoon
意見、感想などはこちらへ、
Mail adress … dycoon@ceres.dti.ne.jp
上へ
目次へ


GigaHit