- UVマッピング
年末年始にかけて実装できそうなものを物色していたのだがその中でとりあえず手持ちの
部品(ライブラリ)だけで出来そうなものは幾つかあったのだが...現在CCTLはパラメトリック曲面に対してテクスチャマッピングが正しく(?)行え
る。これはパラメトリック曲面だからだ。テクスチャマッピングは写真等の2次元の画像を3次元曲面に貼り付ける手法だが、どうしてそんな事ができるかとい
うとパラメトリック曲面には3次元の点に対して2次元座標(U,V)が必ず対応している。
P(x,y,z) = S(u, v)
のような写像Sが始めっから存在するからなのだ。ところがこの写像Sが存在しない場合がある。例えば陰関数曲面や最初からメッシュ(ポリゴン)が与えられ
た場合がそれである。なのでこれらの形状にはCCTLでは(本当は)テクスチャマッピングが
正しく行えないのです。
三角形メッシュ(T1,T2,...,Tn)と各三角形の頂点Ti =( Pi1(xi1, yi1, zi1), Pi1(xi2, yi2, zi2), Pi1(xi3, yi3, zi3))に
対して1対1対応するUV座標を与えるわけだ。つまり、
Ti =(
Pi1(xi1, yi1, zi1), Pi1(xi2, yi2, zi2), Pi1(xi3, yi3, zi3))
= S( ui, vi) となる (Ui, Vi)
を与える写像Sを求める問題となる。一見、簡単そうに思える。例えば、メッシュTi が z = f(x, y ) のような曲面上にあると考えれば
(U,V) = (x, y) となる。そうでなくてもXY平面に投影した点の座標を(U,V)とすればよい。しかし話はそう簡単ではない
単純に投影するような写像では1対1対応の関係が築けないのである。ここでは詳しくは述べないがParameterizationというらしい技法が存在
する。Floaterの手法は比較的実装は簡単そうだった。簡単に言うと
(Ui, Vi) = Σj
= (i,j) λij
(Uj,
Vj) λij >=
0 Σj =
(i,j) λij
=1.0 という関係から (Ui, Vi)を求めるらしいのだ。線形方程式っぽく書くと(jは頂点iに連結したエッジのもう一方の頂点である)
Au = b
( b=(Ui, Vi) A =
λij)だ。
bに相当するところは境界(0,0)-(1,0)-(1,1)-(0,0)で適当に決めることができる。具体的には境界の長さを1/4にしてそれぞれに固
定したUV値((0,0)-(1,0)-(1,1)-(0,0))を線形に与えておけばよい。問題はλの値をどうするかだ。Floaterの論文(その
他)では結構ややこしい(私のような凡人に対してはだが)。そこで最も安直な方法で試して見た。方法は頂点iに繋がる頂点jの個数をNi
とするときに、λij = 1/Ni とする訳だ。こうするとλの条件式
λij >=
0 Σj =
(i,j) λij
=1.0
を自動的に満足する。ちなみに頂点iに無関係なλの値は全部ゼロだ。そうすると行列Aはあの厄介なスパース行列になってしまう、そのためにはスパース向き
の線形計算をしないといけない。幸い共役勾配法がいいらしいしこの部品は以前作っているので準備はOkということだ。
試して見た。
ボロボロだった。しかしよく見ると(最初の画像)何となくメッシュが出来かけている。収束が足りないか別の
問題がありそうだ。
|