rydotの呟''

プログラミングとかCGとかDTMとか適当にいろいろのことを適度にやる気なく綴るはず。

交線追跡法

曲面と曲面の交線を求める。
(光線追跡法(ray tracing)ではない。)

曲面と平面の交線

交線は曲面上のパラメータとする。
曲面と平面の幾何的な関係から微分方程式を立てて求める。

曲面  S = S(u,v)
平面  \Pi = \{ N \cdot (X - P) = 0 | X \in R^3 \}
交線  C = C(t) = (u(t),v(t))
実際の交線  \Gamma = S(C(t))
平面は陰関数表現とし、
 N: 法線ベクトル
 P: 通過点
である。

曲面上のパラメータとして、ある交点  X_0 = C(t_0) = (u_0, v_0) を考える。
曲面と平面の式に代入すると、
 N \cdot S(X_0) - P = 0
である。
交線のパラメータで微分する。
 N \cdot (S_u u^\prime + S_v v^\prime) = 0
分解して、以下の微分方程式が得られる。
 C^\prime = (u^\prime, v^\prime) = (\pm N \cdot S_v, \mp N \cdot S_u)
(uとvの添字がひっくり返っているのが正しい。)
符号は交線をどちら向きに追跡するかに相当する。

線長パラメータ

パラメータを線長パラメータで正規化すると扱いやすい。
実交線のパラメータでの微分
 \Gamma^\prime = S_u u^\prime + S_v v^\prime
であるので、これを用いて交線を正規化する。
 \dot{C} = \frac{C^\prime}{\sqrt{\Gamma^\prime \cdot \Gamma^\prime}}
線長パラメータでの微分 \dot{C}と表記している。
分母のルートの中身は第1基本形式である。展開すると以下のようになる。
 \Gamma^\prime \cdot \Gamma^\prime = S_u \cdot S_u {u^\prime}^2 + 2 S_u \cdot S_v u^\prime v^\prime + S_v \cdot S_v {v^\prime}^2
 = E {u^\prime}^2 + 2 F u^\prime v^\prime + G {v^\prime}^2
 E,F,Gはそれぞれ以下の通りである。
 E = S_u \cdot S_u
 F = S_u \cdot S_v
 G = S_v \cdot S_v

曲面と曲面の交線

TODO