ZwrapとSoftWrapを比較してみた

#はじめに
こんにちは。
キャラクターアーティスト、コンセプトスカルプターのちろナモといいます。

この記事は
[Blender Advent Calendar 2019](https://qiita.com/advent-calendar/2019/blender)
の25日目として書かれています。

Zbrushのプラグイン**Zwrap**を使うと、リトポロジーが圧倒的に楽になります。
あらかじめUV展開された綺麗なトポロジーの素体メッシュさえ用意しておけば、スカルプトメッシュや3Dスキャンモデルをあっという間にリトポできます。
取り回しの良さからZwrapを導入しているスタジオも多いと聞きます。

2ヶ月ほど前、それと似た使い方が出来そうなBlender向けアドオン**SoftWrap**が販売開始されました。とても面白そうだったので購入し、何度か使ってみました。
はたしてSoftWrapは業務にも使えるレベルのアドオンなのか、Zwrapと比較しながら見ていきたいと思います。
　※検証モデルはZBrushのDemoSoldierとNickz_humanMaleAverageを使用しました

**■SoftWrap**
[BlenderMarket SoftWrap - Dynamics For Retopology.](https://blendermarket.com/products/softwrap)

**■ZWrap**
[ZWrap Plugin for ZBrush](https://www.russian3dscanner.com/zwrap/)


#作業の流れ
####■ZWrap
![1.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/1ceeee64-17a7-dc62-9d7b-88601d63c98b.png)
Zwrapの作業画面。左がローポリ、右がハイポリ。
メッシュ上をクリックしていくとポイントが打たれ、1から順番に数字が割り振られていきます。
ラッピング実行時に、ローポリのポイントがハイポリの同じ数字のポイントに向かって吸着することで形状を揃えることができます。
尖っている所や穴など、特徴的な形状の箇所に打っていくと良いです。<br>
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/a0fbdac1-683a-78dc-b315-ff092d88d0b3.png)
ラッピング結果
①ポイントが足りなかったことによるラップミス。ポイントを打つ作業に戻ってラッピングし直すのが良いと思います。耳は耳輪から耳垂にかけて４つほどポイントを打っておくとミスしにくいです。
②今回のモデルでは、ローポリ側には用意されている口内のトポロジが、ハイポリ側にはありません。そのため行き場を失った 歯が、ベロが、のどてぃんこが外に漏れだしました。後で触れる**マスク機能**を使えば回避可能です。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/8661d75b-4b00-a527-f97b-9d887ac71103.png)
ラッピングが上手くいってもポイント周辺はエッジがよれていたりします。
Zwrapの作業としてはここまでで十分です。
Zwrapだけで完璧なトポロジーを目指そうとするのではなく、ある程度うまくいったら後はブラシで整えつつ、マスクをかけて部分的にProject Allしていくのがオススメです。

<br>
####■SoftWrap
いろいろテストして、おすすめの作業画面の構成が見つかったので紹介したいと思います。<br>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/a95b0c04-f2d7-0812-2fcc-541eaa0bef1a.png)
まずはローポリとハイポリの位置、大きさをある程度合わせておくと良いです。
最後にトランスフォームを適用します。綺麗なトランスフォーム値にしておかないと望まない挙動になります。



![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/942e6e7f-884c-a4b9-b68a-c8edd5344b6f.png)
Collectionを用意します。
ハイポリ（Target Mesh）、ローポリ(Source Mesh)、ピンの3つを用意します。ピンは、ZWrapでいうところのポイントです。ピンコレクションのアイコンをクリックしておけば、以降ピンを増やした際このコレクションに格納されます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/25bdff1d-82aa-84d9-e740-d40ac83154fb.png)
画面を左右に2分割します。
どちらのビューも、サイドバーのViewパネルからLocal Collectionsにチェックを入れます。ここにチェックを入れているとコレクションごとの表示非表示が各ビューごとに設定できるようになります。
左のビューではハイポリを非表示に、右のビューではローポリを非表示にします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/5f5276c1-e8e9-aeca-efb7-f1358b8f78d4.png)
SoftWrapパネルに移動しSource MeshとTarget Meshをそれぞれ指定したらStartを押します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/30cd7030-bdbe-ae61-d23b-cd676ee509e4.png)
Startを押した直後に一度Pauseを押します。シミュレーションをストップさせた状態でピンを打っていきます。
左のSource Meshの上でShift+Clickするとピンが打たれます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/f21ceee7-5455-65b8-5540-1f8861fd7fd1.png)
打たれたピンの拡大図。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/3ed96a1d-8ad7-77c4-3a38-0f7d9449aef8.png)
ピンを選択して**Gキー**を押してピンを動かしてみると、こんな表示になります。
シミュレーションの開始時に、ブルーのポイントが赤色のポイントに吸着します。
つまり**Source Mesh上にピンを打つ ⇒ Target Mesh上の任意の場所にピンを動かす**という流れを繰り返すことになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/f7cb39c1-55b9-654d-f065-1766cd82622f.png)
右のTarget MeshのビューでSnapをONに、Snap toをFaceにしておきます。
ピンが選択された状態でGキーを押して、ハイポリの対応する位置までピンを動かします。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/7bc215e2-a089-96ad-1b7e-b185c4e45620.png)
ひたすらピンを打っていきます。
ZWrapだと左右のビューのカメラ動作をシンクロさせる機能があって非常に便利なのですが、Blenderでも連動できたら便利だなと思います。やり方を知っている方がいらっしゃれば教えていただけると嬉しいです。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/a260396d-ef19-a310-1a33-b861e60f16a1.png)
片側のピンを打ち終わったら、MirrorのXをクリックすればX軸に左右反転してくれます。
ここまで準備できたらいよいよシミュレーションです。Pauseを再度クリックしてPauseを解除するとシミュレーションが始まります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/4f931681-c4d0-37e1-5835-d2535c84ae75.png)
真っ先にSnapping Strengthは1.00にすると良いと思います。吸着します。
ポリゴンがパカパカ動いてしまって安定しない場合は、
・Source MeshのポリゴンをLMBドラッグで引っ張ってみたりしてヨレを直せるかどうか見てみる
・ピンの位置が適切か（Target Meshの表面から離れてたりしないか）確認する
・Stiffnessの値を下げてみる
・Smoothの値を上げてみる
またDragの値を上げるとシミュレーションがゆっくりになって安定しやすくなります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/669512ce-ce73-3cea-bd50-d3a9a8eb070f.png)
最終的にこんなパラメータで満足いく結果になりました。
あとはShrinkWrapモディファイヤを使いながら細かく調整すればいいと思います。

#マスキングの挙動
口のなかにポリゴンがある場合、普通にラッピングするとうまくいかないことがあります。口の中をあらかじめマスクしておくことでラッピングの計算から除外することができます。

####**■ZWrapの場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/72faf2ee-9696-0a7b-a9e3-8ec788f3fcf2.png)
すごくシンプルで、ZWrapをかける前に口の中をマスクしておけばいいです。
マスクしたからと言ってその部分が動かなくなるわけじゃなく、周囲のメッシュの変形に合わせて適切な位置へ移動はしてくれます。
非常に便利です。
<br>
####**■SoftWrapの場合**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/539597/2512b725-519c-a6c9-d37b-ebca10e614c5.png)
SoftWrapの場合はグループを作ります。頂点グループでウェイトが設定されている所だけ吸着の計算が行われます。
気を付けないといけないのは、ウェイトが設定されていない部分も吸着がされないだけで布のようなシミュレーションはかかります。
そのため口内がある場合はDragの値を高めにしておくなどして、あまり激しくメッシュが動かないようにするのが良いと思います。激しく動かすと結局口内がはみ出てくる可能性があります。


#作業の快適さ
SoftWrapがかなり軽快に動作するので驚きました。
ピンの表示が少しうるさいのと、最初はポリゴンがかなり暴れて手に負えなくなるのですが、慣れればZWrapと同じくらい快適に扱えました。
僕の環境では7万ポリゴンのSource Meshを50万ポリゴンのTarget Meshに吸着させましたが、ヌルヌル動きました。

一方ZWrapの方は同じポリゴン数で計算終了までに5分かかりました。
問題なのは、ZWrapは途中で計算を止めることができないということです。計算途中ですでに満足する結果になっていたとしても、計算終了まで待たないといけません。キャンセルはできますがそうするとZWrapが終了してしまいポイントを打つところからやり直しになってしまいます。
とはいえZWrapはアルゴリズムがとにかく優秀で、だいたいの形状は良い感じに吸着してくれます。変に計算に関与しようとせず、ポイントを打つ数を減らした方が良い結果になったりもします。


#作業のSave Load
ZWrapには、打ったポイントをテキストデータで保存しておく機能があります。
どうやら頂点番号と紐づいているらしく、頂点番号さえ変わらなければ一度打ったポイントを読み込んでそのまま使うことができます。逆に言えば、頂点番号が少しでも変われば使えなくなります。
このSave Loadを活用できるのは素体モデル（ローポリメッシュ）の方だけだと思います。ハイポリメッシュはスカルプトデータをDecimation Masterでポリゴン数削減して用意することが多いので、そうなると修正のたびに頂点番号は変わってしまいます。
「Zwrapの計算を途中でキャンセルするとポイントを打ちなおす必要がある」と上で書きましたが、計算開始前にきちんとポイントをSaveしておけばLoadすることで打ち直しの必要は無くなります。ただこれはデメリットを解消しているだけなので、メリットとは言い難いです。

ZWrapでできるような「素体モデルのポイントをSaveしておいて使いまわす」ようなことは、SoftWrapでも可能だと思います。
SoftWrapでそれをやるなら、Source Mesh（素体モデル）の全身にピンを打った状態でTarget Meshは空白のままにしてシーンを保存しておきます。
リトポする時にはこのシーンにハイポリメッシュを読み込んでTarget Meshとして登録し、各ピンを適切な場所にスナップさせていけばいいと思います。
またSoftwrapは頂点番号を参照しておらず、単純にピンのworld座標にスナップされるので、スカルプトに修正が入ってDecimationが再度かけられたとしても問題ないと思います。修正箇所付近のピンを正しく動かしてシミュレーションをかけなおすだけです。

#価格
■Zwrap 
INDIE　　 　　　99USD / Year
PROFESSIONAL　249USD / Year

■SoftWrap
40USD  1回買い切り



#まとめ
以上ZWrapとSoftWrapを比較してきましたが、個人の感想としては業務に十分使えると感じました。部分的にはZWrapを上回ってもいると思います。
参考になると幸いです。