当初は完璧に思えたDazToMaxによるDazモデルのmaxへのインポートだが、使ってくうちに色々と問題点が分かってきた。
気付き次第、解決策を探しつつ加筆してく。
仕様構造から生じる問題点†
DazToMaxは、まずDaz側のボーンをDummyオブジェクトとしてインポートした後、各々に対応するCATボーンを作成し、Daz側のボーンをそれぞれPosition ConstraintとOrientation ConstraintでCAT側に拘束するような手法を取っている。
この仕様そのものに問題があって*1、例えばインポート直後の直立ポーズから体全体を180度回れ右させただけで足首に歪みが生じる。
ひとまず、足首の歪みに限っての解決策†
- DazToMaxで読み込んだ直後の状態で、Daz側の脛ボーン(lShin, rShin)を、CAT側の脛ボーン(*.Shape_LCalf, *.Shape_RCalf)に直リンクしてしまおう。
→
- 続いて、lShin, rShinのPosition, RotationをデフォルトのPosition XYZ, Euler XYZに切り替えてそれぞれのコンストレイントを切るのだが、*2
すぐにこれをやるとKeep Initial Offsetがリセットされるため、対象ボーンが明後日の方角にブッ飛んでってしまう。
なので、まずはDummyを作って、Shinボーンのピボットに、位置と角度をAlignしておく。
- それからShinボーンのPosition, Rotationのコンストレイントを切って、
- さきほど合わせておいたDummyに、Alignし直すことで位置・角度を合わせて作業完了。
これで足首の歪みは解消される。
体全体を180度後方回旋させた時の下肢の状態。
階層構造を修正した結果正しく変形された左足首と、まだ構造修正を行っていない歪んだ右足首の違いに注目。
ただ、このPosition, Orientation ConstraintによるDaz側ボーンの制御によるズレ問題は・・・†
他の箇所、たとえば腕や肩などでも発生している可能性は否めない。
実際Daz Studioでのポージングに比べてmaxだと腕の挙上時の肩回りの変形などに劣化が否めないのは、この問題の影響もあるのかもしれない。
・・・ということで、肩回りの問題が判明したので、修正。†
- デフォルトのままだと、180度回転時に僧帽筋や背中周りが痩せてしまっている。
↓180度回転時
- これはDAZ側の鎖骨CollarがCAT側のCollarboneにPosition, Orientation Constraintされているのが原因。
なので、DAZのlCollar, rCollarボーンを、それぞれCATのLCollarbone, RCollarboneに直リンクしてやる。
続いて、Position, Orientation Constraintを切る作業。
以下は左肩に設定する手順。
- まず、Dummyを作って、lCollarにAlignして位置・回転情報を保存しておく。
- それからDAZのCollarボーンに設定されているPosition, Orientation Constraintを切って、それぞれデフォルトのPosition XYZ, Euler XYZ Controllerに変更してやる。
すると左肩がブッ飛ぶので、、、
- 先ほど保存しておいたDummyにlCollarをAlignして元に戻す。
これで180度回転後の、左肩まわりの歪みが解消される。
- 右肩にも同じ手順を繰り返す。
これで完成。
あと、足指にもPosition, Orientation Constraintが適用されてるのは作成者のミスだねこれは†
Dazボーンの足の親指~小指の第1関節に、CATボーン側の*.Shape_L(R)Toeへの位置・角度コンストレイントが付いてるのだが、そのせいで180度旋回時などにおかしなことになってる。
Dazボーン側は五指の上にlToe, rToeボーンを持っていて、それらが既に.Shape_L(R)Toeにコンストレイントされているので、
構造的に眺めても、五指第一関節へのこれらのコンストレイントは全く不要。
先ほど膝ボーンでやった「DummyのAlign→全てのコンストレイントを外す→Dummyへの再Alignで位置角度合わせ」をすることで、この問題は解決する。
足指全体を大雑把に曲げ伸ばす時にはCATの方の爪先ボーンでコントロールすれば良いし、さらにDaz側の5指のボーンの第1・第2関節をそれぞれに回転させれば足指の個性的な表情も作れる。
膝が潰れる†
これは多くの3Dドールで見受けられる「あるある問題」だが、膝を深く曲げると下肢と上肢が重なり合って膝周辺の形状が潰れてしまう。
Daz Studio内部ではスキンモーフ(Dazでは何て名前で呼ばれてたっけ?忘れた)的な仕組みでこの問題を解決しているみたいだけど、DazToMaxはその仕組みまでは継承してないようで、こうなっちゃう。
そもそも膝関節は大腿骨顆部の周りを脛骨頭が回り込むサイクロイド的な運動軌跡なので、回転運動でこれを表現しようとするとこの問題が起こる。
以前使ってた自作のデッサンドールではこれを解決するのにパラメータワイヤリングによる角度制御をやってたのだけど、
幸いDazToMaxはポージングを行うためのCATボーンとモデルのスキニング変形を行うDaz側のボーンが分離されているので、その間にこうした仕掛けを一手間噛ませれば、より精度の高い膝変形が可能かもしれない(要研究)
(まぁ僕はDazのモデルはアタリ取りのポージング人形としてしか使ってないので、それほど精度がなくても良いのでひとまずこのまんま使ってるけど)
改善アイデア†
ちょっとだけ実験してみた。†
Shinのボーンを、足首のボーン中心に手動で逆回転させて、膝部分の上下肢のボーン間に隙間を取らせることによって潰れが改善できるか目視で確認してみた。
before
after
まぁ、多少はマシになる。
ただスキンモーフなどによる最適化された修正ではないので、何となくボリュームが保たれているというだけで、内側広筋の膝上部分の膨らみなど解剖学的な正確さは望めない。
こうした関節の自動制御を実装するにはあ~してこ~して……と頭の中で組み立てることは出来るけれど、たかがアタリ取りのポージング人形のために労力使って複雑な機構を埋め込んでまでやる価値あるかというと……う~ん……
実装してみた。†
3つのヘルパーを使用。
- 1番上のknee_helperは、CATの脛ボーンに位置と回転をAlignする。このknee_helperはCATの脛ボーンに子階層リンク。
- そしてこれを同位置コピーして(knee_helper1)、膝下あたりまで移動し、先のknee_helperの子階層にリンクする。
- knee_helperのRotationにOrientation Constraintを設定し、ターゲットとしてCATの膝ボーンとその親である太もものボーンを同ウエイトで指定する。
これで、knee_helperは膝の曲げ角度の半分だけ回転する状態になる。
よって、膝を回転させると、knee_helperの子供にしたknee_helper1が脛から前方にせり出してくるような格好になる。
(つまりKnee_helperとknee_helper1の間の隙間が、膝蓋骨のズレをシミュレートしているような仕組み*3)
- 続いて3番目のヘルパーオブジェクトknee_helper2を設置。このヘルパーはCATの足(Foot)ボーンに位置・角度をAlignしてから、その子階層にリンクする。
- このknee_helper2は、RotationにLookAt Constraintを指定し、ターゲットにknee_helper1ヘルパーを指定。またUpnodeはCATの脛ボーンを指定する。
これでknee_helper2は、常に足首から膝下のknee_helper1に向かって伸びるように設定される。
- Dazの膝ボーン(lShin)を、knee_helper2の子階層にリンクする。
たぶんこのままでも動作するが、念のためにlShinの子供になっているlFootもlShinとの階層は解除して、CATのFootボーン直下の子供になるようにリンクし直す。
これで完成。
この改善を行った左膝と、未対応の右膝で、状態を比較。
- 90度くらいまでだと、そんなに効果は感じないが・・・
- 135度まで深く膝を曲げると、右膝まわりは形状の潰れと、上下肢の重なり合いがかなり気になってくる。
- 正座に必要な150度を超える角度だと、右膝は下肢が上肢を突き抜けて完全に破綻してしまうが、左ひざは何とか見れる状態をキープ出来てる。
それなりに手間は掛かるし*4効果も限定的。ちゃんと形態をキープしようとするとやはりスキンモーフなどで補正しないと。
やるやらないは各ドールごとに必要に応じて判断すればイイんじゃね。
手の親指のボーン設定ミス†
これもおそらく作成者のミス。*5
DAZ側の親指ボーンは現実の人体に即して手首の根元から3階層で構成されているのに、CATの親指は2関節で済ませてしまっている。
なのでこのままでは、親指の関節動作がまともに行えないので修正する必要がある。
- まずは、DazToMaxを使って読み込んだ直後の状態で、CATのLayer ManagerをAnimation ModeからSetup Modeに切り替え、
後々の位置&角度合わせ用にCATの親指の第1、第2関節に位置と角度をAlignしたDummyを置いておく。
- CATの親指ボーン(第1、第2関節どちらでもOK)を選択し、Command Panel > Modifyタブ > Digit Setupで、Bonesの数を2から3へ変更。
- CAT親指第1関節を、Dazの親指第1関節にAlignし、続けてCAT親指第2・第3関節の位置と角度を、最初にAlignしておいたDummyにAlignして戻す。
- Dazの第2・第3関節のPosition, Rotationは、CATの第1・第2関節にそれぞれconstraintされているので、これを第2・第3関節に修正する。
また、DAZの第1関節のPosition, Rotationも、CATの第1関節にconstraintしておく。
- このままSetup Modeを抜けてDazToMaxにデフォで用意されているCATMotion Layer1に戻ると、親指のボーン位置がリセットされて親指がミョイ~ンと伸びてしまう。
なので Layer ManagerでSetup ModeからAnimation Modeに戻る前に、Add Layerで新しいAbsレイヤーを追加しておく。
新しいAnimation Layerが出来たら、CATMotion Layer1はもう不要なので削除してOK。
これで親指を母指球部位から動かして、本来の自由度に沿った形でポージングできるようになる。
- 最後にオマケ。DAZモデルの親指とCATボーンの親指は軸が若干ズレていて、そのままだと指を曲げた時に爪の面に対して垂直方向にCurlせず歪んでしまう。
CAT側のボーンを旋回させて合わせようとするとSkinを一旦切って入れ直したりと面倒なので、ちょっと横着だけど手っ取り早くDAZモデルの頂点をCATボーンに合うように捩じって対処した。
親指第一関節までの頂点を選択し、第二関節の頂点までSoft Selectionさせて、CATの親指第一関節ボーンのローカルX軸に沿って25度ほど回転させた。