物理シミュレーションのループ処理

0


    服とか髪とかの重力系のシミュレーションをして動かしたとき、
    例えば走る場合など一つの短い動きを作って走りをループさせるにはボーンのアニメのキーフレームを
    コピー&ペーストすれば簡単ですが、物理シミュレーションなどで一連の動きだけの部分をループさせようとすると
    始点と終点でポリゴンの位置などが違って途切れ目が分かってしまいます。


    3dsmaxで言うと布地モディファイアでシミュレーションをしてループさせるのは
    シミュレーションをベイクしてキーフレームで始点のキーを終点にコピーで持ってきて終点前のキーを間引く
    感じで補間させれば出来ます。
    しかし布地のモディファイアの設定などは元に戻せなくなってしまい、やり直しが効かず、
    ベイクする処理もけっこう時間がかかったりします。


    そこで解決方法はモーファーで最初のオブジェクトの状態、例えば服や髪の状態をモーフターゲットとして
    登録して、シミュレーションの終わりでそのモーフになるようモーフ値100でキーを打って
    5フレーム前くらいはモーフ値0にすれば物理シミュレーションの修正もすぐ効くループ処理が完成です。


    しかし…、ループが基本のゲームとかのプロジェクトの制作で、
    ループ処理をたくさん作るときにモーフに登録するステップの手間もかかるし、
    髪の毛を房ごと分けて布地でやるとかの場合で布地モディファイアがたくさんあって全部にループ処理をする場合、
    モーフをインスタンスモディファイアにしてやろうとしてもモーフの個別登録が出来なかったりします。
    (房ごとオブジェクト分けてしまうのは、分けることで布地シミュのぶつかり干渉でシミュが止まってしまうのを防ぐのと
    分けるほうがシミュが早くていい感じのバラけで動いてくれる、ってのが理由です)


    布地のループ処理のためのモーフ登録は、Morph-o-matic(以下MOM)というプラグインが便利です。
    「現在の状態をキャプチャ」ですぐに現時刻0フレーム目などの形状のモーフを登録出来るのでよく使ってます。


    そしてMOMを髪の房に全部にまとめて選択して一括適用して、まとめて選択状態で
    「現在の状態をキャプチャ」しようとしても設定が個別なためパラメーター入力が表示されません。
    ちなみにMOMをインスタンスにしておけば出来るかというと、
    選択してるオブジェクトの「現在の状態をキャプチャ」しか出来ません。


    そこで選択しているオブジェクトに個別に「現在の状態をキャプチャ」するmaxscriptを作りました。


    --MOMadd
    --選択中の現在時間のオブジェクト状態をキャプチャしたモーフターゲットを追加
    if selection.count > 0 then(
    MySel=selection as array  
    for i=1 to MySel.count do  
    (
    select MySel[i]
    new_obj = instance MySel[i]
    maxOps.CollapseNode new_obj on
    MOM_MC_InsertTarget $.morphomatic[1] 2 new_obj
    delete new_obj
    deselect MySel[i]
    )
    ) else (messagebox "Select somthing")

     

     

    MOMのチュートリアルでMOM_MC_GetCurrentTarget $.morphomatic[1]を使って現在の状態をキャプチャ出来るっぽいですが、
    上手くいかなかったりmaxが落ちたりするのでオブジェクト自体をinstanceさせて登録する方法で代用してます。


    またまとめてオブジェクトを選択して
    これら現在の状態キャプチャしたターゲットをまとめて削除するスクリプトは以下です。

     

    --MOMdel
    --captchaしたモーフターゲットを削除
    if selection.count > 0 then(
    MySel=selection as array  
    for i=1 to MySel.count do  
    (
    select MySel[i]
    MOM_MC_RemoveTarget MySel[i].morphomatic[1] 2
    )
    ) else (messagebox "Select somthing")

     


    まとめて選択したオブジェクトのMOMのモーフの値を一括で0にするスクリプトは以下。


    --MOM0
    --値を0に設定
    if selection.count > 0 then(
    MySel=selection as array  
    for i=1 to MySel.count do  
    (
    MySel[i].morphomatic[1][2].value = 0
    )
    ) else (messagebox "Select somthing")

     


    まとめて選択したオブジェクトのMOMのモーフの値を一括で100にするスクリプトは以下。

     


    --MOM100
    --値を100に設定
    if selection.count > 0 then(
    MySel=selection as array  
    for i=1 to MySel.count do  
    (
    MySel[i].morphomatic[1][2].value = 100
    )
    ) else (messagebox "Select somthing")

     

     

    上記のスクリプトたちをボタン化してしまえばストレスフリーで作業出来ると思います。
    モーフ値は自由に書き換えたりスピナーとかで調整適用出来るように書き換えたりすると便利かもしれません。


    MOMのモディファイア自体のONOFFなどの操作は、
    zorbというフリーのmaxscriptでMOMの電球をまとめてON・OFF、MOMモディファイアの一括削除が出来るので
    そちらを使ってみてください。プラグイン系のモディファイアでもリストに表示される便利なスクリプトです。

     


    今回の記述ではMOMはモディファイアリストの一番上にある必要があります。
    MOMの上からFFDなどでさらに変形修正などを加える場合は注意が必要です。
    各場面Zorbで対応してください。


    使用にあたっては自己責任でお願いします。

     

     


    コメント
    コメントする








       
    この記事のトラックバックURL
    トラックバック

    calendar

    S M T W T F S
       1234
    567891011
    12131415161718
    19202122232425
    2627282930  
    << November 2017 >>

    selected entries

    categories

    archives

    recent comment

    links

    profile

    search this site.

    others

    mobile

    qrcode

    powered

    無料ブログ作成サービス JUGEM