捻四角曲面のレンダリング
楽墨堂 小倉康樹

捻四角曲面とは何か
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 のうち、小さい方から交点を計算する。


Copyright (C) 1998-2009 Ogura Koki All rights reserved.