D日記

ゲーム開発者っぽい記事とか。生活の記事とか。生きていくって大変だよね。

MENU

【Maya.スキニング】スキニングした後に、ジョイントの回転や方向などを修正する

今回はスキニング後に、骨の移動・回転などを修正する方法を書きます。

認知度の高い方法

よく知られている方法としては
[ スキン > スキンされたジョイントの移動 ]
って言うのがありますが・・・
f:id:ponta565:20180708135632p:plain

これはその名の通り、ジョイントの移動しかできません
なので、スキニングした後に、ジョイントの方向付けなどができないんですよね。
できないですよねぇ??(強制同意要求)

ということで、どんな機能を使うかというと、これを使います!!!

[ スキン > スキンのバインド解除 ]
f:id:ponta565:20180708143800p:plain

では、具体的に手順を説明します。

具体的な修正手順

1.
まずは、バインドに使用しているボーンを選択セットに入れます。
f:id:ponta565:20180708162451p:plain


1-1.
バインドしているジョイントの選択セットを作成するMELをご用意しました。
便利なので、ぜひご利用ください(´・ω・`)



2.
次に、[ スキン > スキンのバインド解除 ] のオプションを開き、
[ ヒストリの維持 ] でデタッチします。
f:id:ponta565:20180708164234p:plain


すると「skinCluster」は残しつつ、バインドだけが解除されているではありませんか(・0・)
f:id:ponta565:20180708164446p:plain



3.
この状態で、骨の移動や回転などを行います。

ただ注意しなければいけないのが一点あります。

それは、ジョイントの回転を加えたあとに、[ トランスフォームのフリーズ ] を行えないということです。
f:id:ponta565:20180708165424p:plain

本来なら、[ トランスフォームのフリーズ ] を行うと、回転値はゼロになり、吸収した値が [ ジョイントの方向 ] に入るのですが、
skinCluster と ジョイント が接続状態であるせいかできないようです。
f:id:ponta565:20180708164918p:plain

なので、面倒くさいですが [ ジョイントの方向 ] に値を直接入力する方法で現状は対処します(笑)
Ctrl + LMBドラッグで値の変更頑張ってください!
f:id:ponta565:20180708170536g:plain


この辺は、そのうちツールで楽に調整できるようにしたいなぁ( ◠‿◠ )


4.
調整が終わったら、手順1で作成した「選択セットに含まれるジョイント」と「メッシュ」を選択して、再度バインドするなり。
f:id:ponta565:20180708175335p:plain


この時、[ バインドスキンオプション ] の最大インフルエンスが、
既存の「skinCluster」の最大インフルエンス数に上書きされますので、
そこだけ注意したほうが良いかもです(´ . .̫ . `)
f:id:ponta565:20180708174259p:plain


さぁ、するとどうでしょう!
骨の回転や位置を変えたにもかかわらず、スキニング情報はバインドのデタッチ前と同じ状態になっています!
f:id:ponta565:20180708180135g:plain


極端に骨がずれていてもこの通り!
f:id:ponta565:20180708180326g:plain

変わっった骨の入れ方ですね ^^;


バインドポーズもちゃんと更新されております( ◠‿◠ )
f:id:ponta565:20180708180552g:plain


手順としてはこれで終わりです。

【おまけ】ジョイントを一度削除してしまったらどうするか?

一度ジョイントを削除してしまうと、再度バインドする際に崩れるようです。

おそらく、ジョイント名で判定しているわけではなく、ノードの接続で関係性を保持しているからだと思われます。

ミラー作成されたジョイントは、あくまで「追加されたジョイント」として扱われてしまっているようです。

そして、元のジョイントが亡くなったことで行き場を失った頂点は、ゼロ地点へととりあえず避難しているのでしょう。(位置を保持している頂点はなんなんだろう?)

これは、右半身のジョイントを削除した後に、左半身のジョイントを [ ジョイントのミラー ] で作成し直し、再度バインドしたときの状況です。
完全に逝っちゃいました(´・ω・`)
f:id:ponta565:20180708183752p:plain

ここで泣いているわけにもいかないので、修正を試みます。


まずは、原点に逃げた頂点を全て選択します。
f:id:ponta565:20180708185337g:plain


そしてコンポーネントエディタ的なものを開き、全てHipなどにウェイトを割り当てます。
(MayaLTではコンポーネントエディタが無いので、VertexComponentTable というツールを利用させていただきました)
f:id:ponta565:20180708185453p:plain


そして最後に、[ スキン > スキンウェイトのミラー ] を実行
f:id:ponta565:20180708190015p:plain


これである程度は復活させることができました!!
太ももが崩れていますが、そこはミラー前に調整すれば治せるでしょう。
(骨盤まわりの凹みはもともと調整していませんw)
f:id:ponta565:20180708190316g:plain

【おまけ】DoraSkinWeightImpExp も似たようなことはできる

ウェイト情報を逃して、復元するという作業は DoraSkinWeightImpExp でも可能だと思います。

こちらは、ジョイント名ベースで復元を行うので、ノードの接続周りは気にしなくても良いんじゃないですかね(^^)

ただ最近気づいたんですけど、2万ポリゴン越えたあたりからウェイトのインポート時間がめちゃくちゃ遅いんですよ(笑)
終わらないので、Mayaを強制終了するってこともありました。

ちなみにその時のマシンスペックは下記でした。そこそこ強いと思うんですけど・・

CPU : Core i7 8700 12T
MEM : 16GB
SSD : 512GB
GPU : GTX1050Ti



数千ポリゴンなら10秒位で終わるので結構重宝しております!ありがとうございます!

www.deathponta.com

【おまけ】スキンのバインド解除オプションの説明

スキンのバインド解除オプション に関してもついでなので、Gifを使って説明します。


[ ヒストリの維持 ] にした場合は、
バインドを解除して元の変形されていないシェイプに戻します。
skincluster ノードは削除されません!
f:id:ponta565:20180708151903g:plain


[ ヒストリのベイク処理 ] にした場合は、
ジョイントで変形さえたメッシュ形状のままバインドが解除されます。
skinCluster ノードも削除されます。
f:id:ponta565:20180708151843g:plain





とここまで説明したんですけど、私も完全にMayaを理解している人じゃないので、間違いもあると思います。
その時はコメント欄に指摘していただけると助かります( T_T)\(^-^ )