スポンサーサイト

--年--月--日 --:--

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

ペルトマッピングあれこれ その2

2006年09月19日 17:54

前回からの続き~!
ってことでペルトマッピングのこと書きます。


前回はエッジの処理方法まで書きました。

後は各頂点間をバネモデルで結び、カッティングエッジ部分を外側に引っ張るだけです。


これだけなんですけど、そう簡単には行きません。

まず問題点を列挙しましょう。
・各頂点間を結ぶ時、どうやって新しく生成したエッジの頂点を対応させるか?
・カッティングエッジ部分を引っ張る方向はどうやってきめるのか?

この2つが大まかな問題として存在します。


それでは順に説明しましょう。
まず「どうやって新しく生成したエッジの頂点に対応させるか?」は、前回生成したエッジの座標系を使用します。
まず、カッティングエッジで使用されている頂点を含む三角形だけ処理します。
それ以外は単純にバネモデルで結ぶだけでOKです。

ちょっと長ったらしいので カッティングエッジで使用されている頂点 を TweakVert と呼称します。



さて、TweakVert を含む三角形には4つの場合があります。
・TweakVert を3つ含む三角形(カッティングエッジを2つ含む三角形)
・カッティングエッジを1つ含む三角形
・カッティングエッジは含まないけど TweakVert を2つ含む三角形
・TweakVert を1つ含む三角形


一番特殊なのは TweakVert を3つ含む三角形ですね。
この場合、「カッティングエッジの1筆書きリスト」で連続して3つ全ての頂点が出ている箇所を調べ(かならずあるはずです)
その対応頂点でバネモデルを作成します。


次に特殊なのは2番目のカッティングエッジを一つ含む三角形。
この場合は、TweakVert じゃない頂点がエッジ座標系のX軸との内積が正か負かで対応頂点(たとえば逆向きの方でX軸との内積が正だった場合、新しく生成された頂点になる)を決めます。


次はカッティングエッジは含まないけど TweakVert を2つ含む場合。
この場合だとほぼ次の TweakVert を1つ含む場合と一緒に処理できます。
用は、きちんと対応する TweakVert を探せば言い訳なので、一番近いエッジを探し、座標系のX軸との内積が正か負かを調べればOKです。
正の場合は順、負の場合は逆になるので、対応する頂点を設定します。


これで、バネモデルの構築は終わりました。



次の問題は TweakVert の引っ張る方向です。
コレに関してもエッジの座標系のX軸を使います。

まず下準備として TweakVert で「共分散行列を対角化する行列」を求めます。
要は「最適な姿勢のバウンティングボックス」を求めます。
なぜ求めるか?は「共分散行列を対角化する行列」を求める最中に、「一番偏りが少ない軸」を見つけることが出来るからです。
「一番偏りが少ない軸」を「面法線とする平面」は、投影するにはもってこいなわけです。


次に、エッジを構成している TweakVert にその TweakVert が使用しているエッジの座標系のX軸を累積加算していきます。
全ての TweakVert に対して処理が終わったら、加算結果を正規化し方向にします。

その後、各 TweakVert の位置から先ほど求めた平面に最短線を引きます。
また、モデル中央からも同様に平面に最短線を引きます。


次からは全てこの平面上で行う処理です。


先ほど求めた TweakVert の方向ベクトル、これをそのまま使用するだけじゃ綺麗に放射状に広がりません。
同じく先ほど求めたモデル中央からの最短線でぶつかった点と TweakVert の各位置から引いた最短線がぶつかった点で方向ベクトルを求めます。
これをいい割合で TweakVert の方向ベクトルに加算してやることで綺麗に放射する方向ベクトルが手に入ります。


ちょっとわかりにくいのでまとめてみると、、、
 ★「共分散行列を対角化する行列」から一番偏りが少ない軸を求め、
  その軸を法線とする平面を定義する。
 ①各 TweakVert が使用しているエッジの座標系のX軸を平均化した方向ベクトル
 ②モデル中央と★の平面との一番近い点 から 各 TweakVert と★の平面との一番近い点
  への方向ベクトル

 ①と②をステキな割合(あるけは ①:② = 1:2.5で設定しました)で
 混合した方向ベクトルを求める。


です。

後は展開先の平面の法線方向の射影を引いた分をこれまた正規化してやって方向を求めます。

そして、モデル中央と平面との一番近い点から求めた各 TweakVert の方向ベクトルを適当な距離だけ倍してやると綺麗に放射状に広がる引っ張り位置を求めることが出来ます。

要は、TweakVert の引っ張り位置を放射状におきたいわけです。
各自いいと思うアイディアでやってみてください。

あるけがやった方法は答えではありません。一種の提案です。
無論、これより結果がいい方法があるでしょう。




さて、出来上がったツールはというと、、、。

pelt0.jpg


pelt1.jpg



こんな感じになりました。

これは球体をペルト(展開)している様をあらわしています。


ってことで、後はUIとかを作ればツールとして完成だけど、面倒だから一旦放置w


次はなにやろうかなー(・∀・)y‐┛~~



blog_rank

スポンサーサイト


コメント

    コメントの投稿

    (コメント編集・削除に必要)
    (管理者にだけ表示を許可する)

    トラックバック

    この記事のトラックバックURL
    http://angra.blog31.fc2.com/tb.php/73-27dcca52
    この記事へのトラックバック


    最近の記事


    上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。