strange items(楽天)


shade10.5〜15用スクリプト(WINDOWS&MAC用)一覧はこちらです。


bannerst.jpg
リンク用のバナーです。
リンクはご自由にどうぞ。

2016年11月12日

shade用スクリプトその95(ウェイト値のミラーコピー)

ウェイト値のミラーコピー.txt

このスクリプトが機能するのは、shade13以上となります。
(私の環境では、13、14、15で動作テストしました。)

対象は、ポリゴンメッシュのみとなります。その他の形状のスキンには使えません。
スキンのタイプは「頂点ブレンド」で使えます。「クラシック」では使えません。

<使用上の注意点>
・ポリゴンメッシュの上位パートにマトリクス変換がかかっている場合は、マトリクス変換がかかっていないパートに移動してからスクリプトを実行してください。

・ボーンやジョイントの名前は、かなずそれぞれ固有の名前にして、同じ名前が存在しないようにしてください。ポリゴンメッシュにバインドされているジョイントの中に同名のジョイントがあると、このスクリプトは正常に機能しません。

・また、ボーンやジョイントの名前には、先頭か末尾に半角の「L」か「R」あるいは半角の「l」か「r」、あるいは「右」か「左」というのをつけて、左用と右用の対となるボーンの名前は先頭か末尾以外は同じ名前にしてください。

例1)
「肩ボーン01右」と「肩ボーン01左」(この二つは位置的にも左右対称位置にある事)
あるいは「右肩ボーン01」と「左肩ボーン01」

例2)
「ひじボーンR」と「ひじボーンL」(この二つは位置的にも左右対称位置にある事)

例3)
「|llegbone002」と「|rlegbone002」(この二つは位置的にも左右対称位置にある事)


みたいな感じです。
また、「L」「R」でなく、「left」と「right」か、あるいは「LEFT」と「RIGHT」、あるいは「Left」と「Right」をジョイント名につける場合は、末尾ではなく先頭につけてください。


名前を元に対のボーンを探す場合は、このような命名規則を守っておく必要があります。
対ではなく中心軸上に一つしかないボーン(腰ボーンや首ボーンなど)は、先頭や末尾にLRやlr、右左の文字などは無くても大丈夫です。

なお、shadeの場合、ジョイント名の一番最初に「|」をつけるとポーズのインポートとエクスポートができますが、「|」は先頭につけていても大丈夫です。



<このスクリプトの目的>
キャラクターモデリングなどでは、X座標値0を対称点(Y軸を線対称軸)として、左右線対称な造形のモデルを作り、ボーンなどのジョイントも同じく線対称な構造で作り、スキンのバインドを行うという事が多いと思います。
バインド後は手動でウェイトペイントやスキンウインドウでの数値入力でウェイト値の調整をする事になるのですが、左右対称になるようウェイトを調整するのは現状のshadeでは面倒です。
例えば、バインド後に左ひじでウェイトペイントツールで調整をした後、右ひじでまったく同じような感じになるようウェイトペイントするというのはかなり難しい。

それをスクリプトでミラーコピーして瞬時にやってしまおうと考えて作ったのが、今回のスクリプトとなります。

プログラム的には、「選択している頂点(右側)の対となる位置にある頂点を調べた後、右側の頂点にバインドされているボーンとちょうど反対位置にあるボーンを検索してからウェイト値を左側の頂点にミラーコピーする」みたいになっています。
キャラクターの片側でウェイト調整ができたら、もう片方はスクリプトで良い感じに一瞬でミラーコピーしてくれる便利スクリプトというわけです。
キャラクターのスキンのウェイト調整で威力を発揮するでしょう。


このスクリプトが動作するためには、「X座標が0より大きい頂点だけを一個以上選択しておく」必要があります。
正面図や上面図で見て、X座標値が0以上である頂点をドラッグ選択などで複数選択しておきます。その選択している頂点部分だけ、反対側の頂点にウェイト情報がミラーコピーされます。


また。頂点数が多いモデルなどは、スクリプトの処理にかなり時間がかかってしまうため、選択する頂点の数はあまり増やさないようにしてからスクリプトを実行してください。
例えば、左ひじあたりのウェイト調整をした場合は、左ひじあたりの頂点だけを選択してスクリプトを実行して右ひじにウェイト情報などをミラーコピーする、という風に。


具体的な実行の手順としては、ポリゴンメッシュを一つだけブラウザで選択し、頂点編集モードに入って、上記の決まり事を守った上で右側の頂点を選択してからこのスクリプトを実行すると、ウェイトがミラーコピーされます。


なお、スクリプト実行時は、元のウェイト値を持ったポリゴンメッシュは兄階層(ブラウザで一つ上)に自動で複製し、レンダリングOFF・非表示にして一応バックアップを残しておくようにしています。
スクリプトを実行する度に、形状(とウェイト情報)のバックアップが増えていく事になります。

スクリプト実行後の「ミラーコピーしました」の表示で「キャンセル」を押してもウェイト情報は元に戻りませんので、ウェイト情報を元に戻したい場合はそのバックアップが取られた形状を使ってください。

ウェイトミラーコピー001.jpg
これは、Y軸を対象軸として線対称で作った形状に、同じく線対称で作ったボーンを入れてからバインドした物です。
オートバインドではこんな風にウェイト調整されました。
この画像では右端近くのボーンを選択した状態でウェイト表示しています。

ウェイトミラーコピー002.jpg
対称位置にある頂点も、オートバインドでは近くにあるボーンに線対称的な感じでウェイト調整されています。

ウェイトミラーコピー003.jpg
右側の頂点のウェイトを、ウェイトペイントツールで適当に変更してみました。
これと同じような感じで、先ほどの左側の方で右側と同じ感じのウェイトにしようとすると、手動でやるのは死ぬほど面倒くさい事になりますが、

ウェイトミラーコピー004.jpg

右側でウェイトペイントで変化させた周辺の頂点を選択してから、この「ウェイト値のミラーコピー」スクリプトを実行すると、

ウェイトミラーコピー005.jpg
バインドされているジョイント情報はそのままに、ウェイト値だけ左側の頂点にミラーコピーでき、左右対称な感じのウェイトにできるわけです。


うまくミラーコピーできたかどうかは、必ずスクリプト実行後に、ウェイトペインティングツールなどできちんと確認してください。


スクリプトのプログラム上、X座標がちょうど0の位置にある頂点のウェイトはミラーコピーされません。
shadeの場合、中心軸にあると思っていた頂点が実はX座標が微妙に右か左にずれてしまっている、という事がわりとあるので、その場合は中心軸のすごい近くにある頂点はスクリプト実行時には絶対に選択しないようにしてください。
「このスクリプトを実行する場合は、中心軸上にあると思われる頂点は選択しない」と覚えておけばいいです。

shadeのバインドボタンでは、左右対称でモデルを作り、ボーンも左右対称で組んだのに、バインドボタンを押すと、ボーンの構成によっては頂点のX座標が0の位置にある頂点が片側のボーンに少しウェイトがかかる状態でバインドされてしまう事があります。
その状態でウェイトペイントツールで中心近くの頂点や中心近くのボーンのウェイトカラーを見ると、ウェイトカラー自体片方に偏った感じになっていますが、中心軸上の頂点のウェイトが偏っているだけで、それ以外の部分はスクリプトを使えばきちんとミラーコピーされていると思います。


なお、実行時にダイアログボックスで「対のボーンは」のセレクターが表示され、「名前で探す」か「位置で探す」のどちらかを選択する事になりますが、ボーンの命名規則を前述の通りにしている場合は「名前で探す」を選択し、命名規則を守っていない場合は「位置で探す」にするといいでしょう。
(「位置で探す」の場合も、各ジョイントの名前はそれぞれ重複しない固有の名前にしておく必要があります)
「位置で探す」の場合、プログラムで対となるジョイントリストを作成するのですが、ジョイントがきちんと三次元的に対称的な位置にないと、正確に対となるジョイントを検索できない場合がありますので、やはりジョイントの名前をきちんと設定してから「名前で探す」を選択した方がいいです。

対となるジョイントは、「そのポリゴンメッシュにバインドされているジョイント」の中から検索されます。
バインドされていないジョイントは検索対象外となりますので注意してください。

また、スクリプト実行時には、必ずポーズをリセットして、モデルの頂点構成が左右対称となっているようにしてください。ポーズをつけた状態ではミラーコピーに失敗します。


スクリプト実行時のダイアログで「ボーンリストの出力」のチェックボックスをONにすると、対となるジョイントリストがメッセージ欄で確認できます。
スクリプトできちんと対となるジョイントの検索が成功できているかどうかを確認できるでしょう。

このスクリプトはスキンタイプが「頂点ブレンド」ならば、ボーンジョイントだけでなくボールジョイントとかその他のジョイントでもミラーコピーできると思います。


おまけスクリプト

バインドチェッカー.txt

こっちのスクリプトは、バインド情報がきちんとミラーコピーできているかどうかを頂点ごとに確認するための物です。

使い方は、ポリゴンメッシュを一つ選択し、頂点編集モードで頂点を一つだけ選択状態でこのバインドチェッカースクリプトを実行すると、メッセージウインドウにその頂点にバインドされているジョイント名のリストと各ウェイト値が表示されます。
頂点は一つだけ選択してスクリプトを実行してください。

その頂点とは対称位置にあるだろう頂点を一つ選択しなおして、またこのスクリプトを実行すると、同じようにバインド情報が追加して表示されるので、元の頂点のバインド情報が対称位置にある頂点のバインド情報にきちんとミラーコピーされているかどうかが確認できるでしょう。

ウェイトミラーコピー006.jpg

posted by stxsi at 12:30| shadeスクリプト | このブログの読者になる | 更新情報をチェックする