本記事はHoudini Apprentice Advent Calendar 2023 の22日目の記事となります。
先日のセミナーでSidefxからTopoflowに関して説明がありました。
以前Wrap4Dをみてテクスチャでマーカーを解析できるなんて便利だなーと思っていたので、今回はこのTopoflowを検証してみることにしました。
Houdiniを全く触っていない方でも、こういう機能がついたのでぜひ興味をもっていただけると嬉しいです!
スキャンした様々な表情のジオメトリを同時に撮影したマーカー付きの顔のテクスチャを使用してテンプレートメッシュにトポロジーをリターゲティングしましょうというものになります。
この機能を使用するためには、あらかじめTopo Transferを使用してテンプレートメッシュを整えておく必要があります。
Topo Transferの記事は別に用意しましたのでこちらをご参考ください。
SideFXのWebサイトよりサンプルをダウンロードすることも可能です。
下記からはSideFXよりダウンロードできるサンプルのネットワークを元に、自分で用意したモデルを使用し解説します。
まずは、Topo Transferで用意したテンプレートメッシュとテンプレートメッシュ様にベイクしたテクスチャが必要です。
モデルは引き続きCGWORLDの池田さんのスキャンを使っていきます。
スキャンに関しては、Topo Transferの記事をご参照ください。
このテンプレートメッシュに様々な表情のトポロジと転送していきます。
元のニュートラルなスキャンメッシュとテクスチャも必要になります。
ここにはテンプレートメッシュに適用したいスキャンメッシュを読み込みます。
今回の一連のスキャンデータはすべてのスキャンセット(ジオメトリ、テクスチャ等)が同じ構造で納品いただきました。
それぞれのスキャンごとに数字でディレクトリが分かれているのみです。
各数字フォルダの中をみると下記のようなすべて同じように下記の構造になってました。
そのため、読み込むFileノードでは数字をフレームと考え$Fとしてパスを設定
フレームを切り替えれば、ターゲットスキャンが変わるように設定しています。
あと、スキャンされた顔テクスチャは8Kありましたが、これだと解析に時間がかかるかつ+落ちる・・。ということで、すべて2Kで保存しなおしています。
Topo Transferの基本的な接続はこの2つでも大丈夫です。
Topo Transferのようにメッシュに手動でリファレンスポイントを設定する必要は基本的には必要ありません。
Topo FlowのターゲットスキャンテクスチャにはTopoflowSampleを接続します。
Topoflowsampleのパラメータです。
Textureには、テンプレートメッシュにリベイクしたマーカー付きテクスチャを指定します。
スキャンデータままのテクスチャではなく、Topo Transferで整えたテンプレートメッシュにベイクしなおしたスキャンテクスチャを使います。
これに割り当てられているテクスチャですね。
Topoflowsampleでテクスチャを設定し、Show Handleツールを有効にすると下記のように3Dビューポートにグレイスケール化されたテクスチャとリファレンスポイントとなる緑の点が配置されます。
画像を解析し、特異点にリファレンスポイントが配置されるのですが、「そこは違う!」という場所に配置される可能性があります。
ここだとキャップからはみ出た髪の毛にサンプルが生成されていて、その分頬辺りにサンプルができていません。
そこで、H20で追加されたTexture Mask Paintをテンプレートメッシュに接続し、マスク部分をペイントします。
Mask Nameで指定している名前がマスクボリュームとして出力されます。デフォルトはmaskに設定されています。
ビューポートでリファレンスポイントを生成したい場所だけ城でペイントしていきます。
ポイントにではなく、テクスチャをペイントしているため、一度出力する必要があります。
出力にはHeightField_outputを使用します。
Geometry出力ではなく、Mask Volumeを接続します。
マスクは黒白のグレイスケールでペイントしているので、下記のようにしてしました。
Output Layerとしてmaskと入力します。
これでFilenameで定義した場所にマスク画像が出力されます。
Topoflowsampleにもどり、Maskに出力した画像を指定します。
下記では、heightfield_output1に決めた出力ファイル名を読み込むようにしました。
そうするとキャップからはみ出た髪の毛に作成されたリファレンスポイントを消すことができました。
耳のところもおかしいのでマスクをさらに修正して保存しても良いですね。
3Dビューポートに表示されるリファレンスポイントをみながら、パラメータを調整します。
Minimum Spaingは特徴点間で維持する最小ボクセル距離です。これはテクスチャ解像度によって変わります。解像度が大きい場合、この値を大きくする必要があります。
Blurring Window Radiusは、ボクセル近傍の分析に使用されるブラー ウィンドウのサイズです。数値が少ないと顔に配置したマーカーにより正確に配置されますが、広がっていたりボケている特異点は無視されるようです。
Gradient Windows Radiusは、ボクセル近傍の分析に使用するウィンドウ勾配のサイズとなっています。
必要な場所に特異点が生成できるように調整していきます。
ここでより多くの特異点を正確に取得できれば、後の手間を減らすことができます。
撮影後に実際にHoudiniでアレコレ朝礼しているときに思ったのは、唇の上とか瞼とか目の端とか円了せずにマーカーをがっつり書けばよかったということです。
今回はマーカーをホワイドボードの黒マーカーで書いたのですが、もっと小さくシャープに書けばよかったと思いました。大きな点だと場所に多少のぶれが出てしまうためです。
Topoflowノードは入力を設定しただけでは計算されません。
パラメータでスキャンメッシュのRestはニュートラル、Targetsは新しい表情のスキャンをそれぞれジオメトリ、テクスチャともに指定する必要があります。
Rest Scanは最初に読み込んでおいたニュートラルな表情のスキャンメッシュとテクスチャを使用します。
次にTargetsには変化させたい表情のスキャンメッシュとテクスチャを指定します。
これでクックした結果は・・・
あー、後頭部ジオメトリが。。。
TopoflowノードのConstraintsタブにて、Rigid Primitivesの横の選択ボタンをクリックし、投げ縄ツールでトポロジーを転送しない場所を定義します。
Enterキーを押して、再度クックすると計算が始まります。
結果は。。。
あーーー、なんかおしい。
マニュアルにも記載があります。
For 4D processing, these landmarks constrain facial regions around the eyes and lips that generally don’t track well with optical flow.
一般的にオプティカルフローでうまく追跡できない目や唇の周りの顔領域を・・・
今回のテンプレートメッシュは口の中が作成されているのでその部分が追跡できていないようです。
こんな時に使うのがTopoflowの3番目4番目の入力を使用します。
ここに接続するのはTopo Landmarkです。
Topo Landmark(トポ・ランドマーク)」ノードを使用して、フィッティングのガイドとなるランドマークコンストレインを追加指定します。この機能を使用することでジオメトリ コンポーネントとの対応を維持することが可能です。
Topo Landmarkの1つ目の入力にはTemplate Meshを入力し、2つ目はターゲットメッシュが必要となります。
ターゲットメッシュはスキャンメッシュとなります。
接続したShow Handleを選択すると、Topo Transferと同じようなツールが表示されます。
目の周りにポイントを追加します。
この時、目の周りと口周りだけで十分です。
Gキーを押して、ターゲットメッシュの位置へポイントを移動します。
Topo LandmarkのパラメータにてLandmark Attributeにlandmarkという名前が設定され、そのlabelとしてconstraintsと入力しました。
Topo Landmarkのアトリビュートを確認すると
ポイントアトリビュートとして、landmarkアトリビュートが作成され、そこにconstrain#が設定されていることがわかります。
これをTopoflowで使用します。
設定したらTopo Flowへ接続します。
※Topoflowを選択するとすぐに計算が始まるので、パラメータを設定するまではBypassなどしておくと無駄な計算を省くことができます。
TopoflowパラメータのConstraintsにて、Enable Geometry Constraintsを有効にして、Landmark Attributeにlandmarkを指定します。
これでクックを実行すると口が開いた!
気に入らなければTopo Landmarkを修正します。
口や目が大きく変化する表情はTopo Landmarkの追加設定がないと正直厳しいです。
更に表情のスキャンを変えて
1つのテンプレートメッシュに様々な形状をTopo Transferで1つずつリファレンスポイントを設定していくよりは楽だと思います。
ただ、最初に紹介した動画内でいっていたとおり、スキャンメッシュがとても重いデータだったり、スキャンテクスチャのサイズが大きいとTopoflowノードの計算にかなり時間がかかったり、落ちちゃったりと大変かもしれません。
最終的にはTopo Landmarkで作成した追加ジオメトリコンストレインが、ターゲットメッシュを変えても解析を追従してくれるといいなとテクスチャ解像度は2Kもあれば十分なのではとも思いました。
(実際にレンダリングに使用するテクスチャではないので)
後は、テンプレートメッシュとスキャンメッシュの大きさ、位置は大体揃えていた方が解析はうまくいくと思います。あまりにも位置や大きさが異なるとうまくいかないことも多かったのです。
また、搭載したての機能のため、最初は試行錯誤が必要かもしれませんが、Houdiniだけでスキャンメッシュをテンプレートメッシュにトポロジーのリターゲティングできるということは頼もしいですね。
参考になれば幸いです。