| 3次元空間上の4つの頂点で定義された四角形である。 4つの頂点は同一平面上にある必要はない。 隣接する頂点をつなぐ4つの辺は直線である。 |
| * : 内積 x : 外積 |A| : Aのサイズ、すなわちsqrt(A*A) |
| 頂点1: P1 = [ P1x, P1y, P1z ] 頂点2: P2 = [ P2x, P2y, P2z ] 頂点3: P3 = [ P3x, P3y, P3z ] 頂点4: P4 = [ P4x, P4y, P4z ] 視点位置: Pe = [ Pex, Pey, Pez ] 視線方向: Pd = [ Pdx, Pdy, Pdz ] |
| B = P4 - P2 - P3 + P1 C = P2 - P1 D = P3 - P1 E = P1 - Pe とすると、この曲面は次の2つの式を満たす。 Pd * (B x C) * u*u + Pd * (B x E - C x D) * u + Pd * (D x E) = 0, 0 <= u <= 1 Pd * (B x D) * v*v + Pd * (B x E - D x C) * v + Pd * (C x E) = 0, 0 <= v <= 1 第一の式から u を求める。(2次式なので、2つの解がある可能性あり) その u が 0 <= u <= 1 を 満たす時 v = -(Pd x (C * u + E) / (Pd x (B * u + D)) より v を求める。その v が 0 <= v <= 1 を満たすとき、(u,v) の組合せから交点が求まる。 交点を PP とすると PP = B * u * v + C * u + D * v + P1 PP = Pe + Pd * s, s >= 0 から s = (B * u * v + C * u + D * v + E) / Pd = (Pd * B * u * v + Pd * C * u + Pd * D * v + Pd * E) / |Pd| ここで |Pd|=1 とすると s = Pd * (B * u * v + C * u + D * v + E) ここで s >= 0 を満たすならば交点は存在する。 このとき 各頂点の重み W1, W2, W3, W4 は W1 = (1 - u) * (1 - v) W2 = u * (1 - v) W3 = (1 - u) * v W4 = u * v 高速演算方法は W4 = u * v W3 = v - W4 W2 = u - W4 W1 = 1 - W2 - W3 - W4 となる。 注意: 一般に捻四角曲面では交点が2つできる。 透明を考慮しないレンダリングでは2つの s のうち、小さい方から交点を計算する。 |