株式会社デジタル・フロンティア-Digital Frontier

Header

Main

  • TOP
  • DF TALK
  • ClosestPoint それが1番大事!? ~Maya: DF_cageDeformer(高速Wrapデフォーマ)~

ClosestPoint それが1番大事!? ~Maya: DF_cageDeformer(高速Wrapデフォーマ)~

2013/11/25

Tag: ,,,

ども~開発室ゴトー[@jackybian]です。
いよいよ寒くなってきました熱燗が美味しい季節ですねー。そうかと思えば今年もあと1ヶ月半!早過ぎるっ!

さて先日、今年のクリエイティブ カンファレンス(CGWORLD2013)も無事に終わり…と言いたかったところですが
今年は例年になく?ダダ滑りでした~꒰꒪д꒪||꒱汗ッ
登壇後「声が聞き取りづらかった」というお声も頂き、聞き苦しい内容ですみませんでした。
来年もし機会があれば、もうちょっと真面目にやりますのでお許しを~<(_”_)>
さてそんなCGWも終わり、ひと段落と思いきや開発は新しいデータ構造への変更とDF_Launcher(弊社専用ランチャーソフト)
のリリースでちょいとバタバタしておりました。開発者Hもそろそろ疲れがピークな頃ですが懸命に頑張ってくれております。

さて今回はCGW2013でもご紹介した”DF_cageDeformer(高速Wrapデフォーマ)”ですが
セッションでは話してなかったところをもう少しお話しようかと思います。

この”DF_cageDeformer”への要求は次のようなものでした。
■要望
 ①Wrapより軽く速いこと!
 ②マルチインフルエンス対応(WeightPaint機能つき)
■用途
 ①ClothメッシュでRenderメッシュを拘束したい!
 ②Bindメッシュ(lowRes)でRenderメッシュ(HiRes)を拘束したい!
まずWrapよりも高速でなければ意味がないッ!と実際に言われた訳ではありませんが←コレかなりMustでした。
そこでよりシンプルで高速な手法という観点や諸々の理由もあり辿りついたアルゴリズムが
ターゲットメッシュ(以下Targetと略)の1頂点がインフルエンスメッシュ(以下Cageと略)上の1点により拘束されるものでした。
↓のGifアニメを使ってご説明しますと、

①デフォーマ作成時にTarget上の頂点毎に以下の情報を格納
・Cage上でのClosestPoint(最近点)を求め、その重心座標(Barycentric coordinate)
・同ClosestPointでの法線ベクトル
・同ClosestPoint~Target頂点の2点間の単位ベクトル&距離
②実際のデフォーム計算(Cageが変位した時)
1.格納時の重心座標から現在の位置を取得
2.格納時の法線ベクトルと現在の法線ベクトルより回転を取得
3.格納時の単位ベクトルに2.で求めた回転を与える
4.3.で求めたベクトルに格納時の距離を掛けた先がデフォーム後の位置
という手法です。
つまりTarget上の点はCage上の1点=ClosestPointに拘束される訳です。
一般的にHiResメッシュ(Target)をLowResメッシュ(Cage)でデフォームする使い方が多かと思いますが、
ここで拘束する点は果たして本当にClosestPointで良いのでしょうか?
次のようなTargetとCageの場合を考えてみましょう。

↑のようにClosestPointが複数ある場合、どちらを採用するべきでしょう?
どちらにしても拘束する位置として好ましくない!というのが正解でしょう。
このような場合、最も好ましい点としては

”Target上の点の法線ベクトル方向(+法線方向)で交差した最近点”が一番好ましい位置ではないでしょうか?
でもこれでは十分ではないんです。↓のようにCageが凹型でTargetの内側に入り込んでいる場合、
(Cage側は厚みがないオブジェクト、Target側は厚みがあるオブジェクトのときなど)

+法線方向に交差点はありません!従って法線ベクトルを反転した方向(-法線方向)にも交差点を見に行く必要があります。
さらにこれでもまだ十分ではありません。洋服のような場合、
+法線方向にも-法線方向にもそれぞれ交差点がある場合があります。

このような場合は、もちろん距離が短い方の点を採用するべきですよね。
といった具合に単純なClosestPointだけではダメで特にTargetとCageの形状差が大きい(CageがLowRes過ぎる)場合、
このような問題が起こり易いのでこの辺りの処理も実装しました。

今回のデフォーマは特に軽く速いこと!が重要だったのでOpenMPによる並列化をしていますが、
いかに非スレッドセーフなメソッドを使わずに実装するか!が鍵でClosestPointを求める場合も
スレッドセーフはメソッドを探し使うようにしたり、データ構造も高速化に繋がるように工夫したりしました。
そのおかげかFPS値にして最大15倍高速(当社比)!!になったものもッ!(゚∀゚)ノ
【サンプルムービー】

元々はSetupチームからの依頼で開発したものですが、
・Facialリグで使いたい!
・モデリング時にも使いたい!
などの声や追加要望も出てきてますので、今後拡張していけたらと思っています。

という訳でお時間がきたようなので今回はこのあたりで。では(´∀`*)ノ マタ~

※免責事項※
本記事内で公開している全ての手法の有用性、安全性について、当方は一切の保証を与えるものではありません。
これらの手法を使用したことによって引き起こる直接的、間接的な損害に対し、当方は一切責任を負うものではありません。
自己責任でご活用ください

Pocket

コメント

コメントはありません

コメントフォーム

コメントは承認制ですので、即時に反映されません。ご了承ください。

*