パラメトリック曲面の解法
楽墨堂 小倉康樹

パラメトリック曲面とは何か
ここで述べるパラメトリック曲面は、3次元空間上の4つの点と
その点での法線を指定する事で定義された曲面である。
この曲面上の点は2つのパラメータ u, v により指定される。
つまり、パラメトリック曲面上の点は
PC(u,v), 0 <= u <= 1, 0 <= v <= 1
として表すことができる。
また、ここで用いる曲面関数は u, v それぞれに対して3次のもの(ベゼェ曲面
を使用する。
一般には、オブジェクトをメッシュで表すと複数の四角形ができるが、その
四角に対して、このパラメトリック曲面を使用し、全体として滑らかなオブ
ジェクトを生成したい時に用いられる。
この四角形をパッチと言う。
例えば、球面は8個のパッチで近似できる。この場合のパッチは3点で指定
するものが8個になるが、上記の4点でのパッチで、2点を同じものにする
事で実現する。

注意:
レンダリング段階で、このパラメトリック曲面を扱うのは稀で、普通はモデリング
段階で用いる。
モデリング段階で、メッシュの各点の位置や法線(あるいは接線)を操作し、
なるべく均等に曲面を分割する為に再帰的手法を用い、最終段階では細かな
三角形ポリゴンにしてからレンダリングするのが通常の方法である。


ベクトル演算記号の説明
* : 内積
x : 外積
|A| : Aのサイズ、すなわちsqrt(A*A)


ベクトル操作関数の定義
vr(A,B) = B - (A * B) / (|A|^2) * A
VR(A,B) = vr(A,B) / |vr(A,B)|


定義
位置 法線
点1 P1 N1
点2 P2 N2
点3 P3 N3
点4 P4 N4

点1から点4への順番は、例えばパッチ全体で構成する
オブジェクトの外側から見て右周りと決めておく。
また、法線ベクトルのサイズが大きいほど、その位置か
ら離れた所までの影響が大きくなる。
その大きさを1にする様に決めても良いが、例えばパッチ
で球面を近似したときに補正無しにする為に大きさの標準
4*(sqrt(2)-1)/3 とする事をお進めする。

ベクトルの準備
R1 = P1 + VR(N1, P2 - P1) * |N1|
T1 = P1 + VR(N1, P4 - P1) * |N1|
Q2 = P2 + VR(N2, P1 - P2) * |N2|
T2 = P2 + VR(N2, P3 - P2) * |N2|
Q3 = P3 + VR(N3, P4 - P3) * |N3|
S3 = P3 + VR(N3, P2 - P3) * |N3|
R4 = P4 + VR(N4, P3 - P4) * |N4|
S4 = P4 + VR(N4, P1 - P4) * |N4|
U1 = R1 + T1 - P1
U2 = Q2 + T2 - P2
U3 = Q3 + S3 - P3
U4 = R4 + S4 - P4

ベクトルを各要素とする4x4行列 M の準備
P1 R1 Q2 P2
T1 U1 U2 T2
S4 U4 U3 S3
P4 R4 Q3 P3


v をパラメータとする1x4行列 A(v) の準備
(1-v)^3 3 * (1-v)^2 * v 3 * (1-v) * v^2 v^3

v をパラメータとする1x4行列 A'(v) の準備
-3 * (1-v)^2 3 * (1 - 3 * v) * (1 - v) 3 * (2 - 3 * v) * v 3 * v ^ 2


u をパラメータとする4x1行列 B(u) の準備
(1 - u)^3
3 * (1 - u)^2 * u
3 * (1 - u) * u^2
u^3


u をパラメータとする4x1行列 B'(u) の準備
-3 * (1 - u)^2
3 * (1 - 3 * u) * (1 - u)
3 * (2 - 3 * u) * u
3 * u^2


パラメトリック曲面の位置 PC(u,v) と 法線 PC'(u,v)
位置の関数は以下のとおり
PC(u,v) = A(v) * M * B(u)

法線の関数は以下のとおり
PC'(u,v) = (A'(v) * M * B(u)) x (A(v) * M * B'(u))
御覧のように、この法線は外積で求めているので結果の大きさを
正規化する必要がある。

両関数とも u, v の範囲は
0 <= u <= 1, 0 <= v <= 1


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