Blenderでラグドール
しばらくやらないと忘れてしまうので、備忘録として残しておきます。
まずはモデリング&リギング。モデルがチャチいのは、見て見ぬ振りしてくださいw
リギングは、親子関係をつけずにフラット階層で。そうしないと、正確な物理演算結果が得られません。
続いてボーンやメッシュに合わせて、ヒットボックスを配置。最終的に、ボーンをこのヒットボックスの動きに連動させます。
各ヒットボックスは、剛体コンストレイントで接続。
各接続には、然るべきリミットを設定する。
とりあえず、ヒットボックスの挙動をチェック。
問題なければ次へ。
各ボーンにChild ofコンストレイントを設定し、ヒットボックスの一致する部位を指定。
これでラグドールの完成。
ちょっと遊んでみたり。
以下は余談です。
ラグドールは、アニメーションの途中から発動してナンボ。例えば歩いている途中で何かに躓いて転ぶとか、ダメージを受けて倒れるとか。それらを再現するには、どうしたらいいんだろう?
ボーンにアニメーションを設定し、ラグドール発動時にヒットボックスのダイナミクスをオンにする? しかしボーンの階層はフラットなので、アニメーションの設定は困難を極める。
そもそもこの場合のボーンは、キャラクタのアニメーションのためのものではなく、ヒットボックスの物理シミュレーション結果をメッシュに伝達させるためのもの。なので、キャラをアニメーションするには別の方法を使用する必要がある。
ならば、ヒットボックスをアニメーションさせれば良いのでは? ヒットボックスなら、剛体コンストレイントで連鎖しているので比較的楽に動かせます。しかしIKやボーンコンストレイントなしでは、アニメーションに限界がある。
そこで、いくつか試行錯誤してみました。
■ ダブルアーマチュア
まずは、ヒットボックスにアーマチュアを仕込んでみる。つまり、メッシュ側とヒットボックス側のダブルアーマチュアというわけです。
これならヒットボックスはアーマチュアの子なので、ラグドール化の妨げにはならないはず。
ところが両腕を下げて試してみると、
ボーンの回転により座標軸が変わってしまい、腕だけあらぬ方向へ飛んでいってしまいましたw
■ オブジェクトコンストレイント
ならばアーマチュアを独立させ、オブジェクトコンストレイントでアニメーションさせようではないか。
と思ったら、ヒットボックスの中心点で回転。まあ、そりゃそうか……。
しかもオブジェクトコンストレイントによって回転させた回転角度がデフォとなり、リミットで設定した角度がそこを基準としてしまうという。結果、各パーツがあらぬ方向を向いてしまう結果に。
■ ボーンからヒットボックスへ
まだ試してはいませんが、アニメーションさせたボーンの情報をヒットボックスへコピーすればどうだろう? そして然るべきタイミングでヒットボックスのダイナミクスをオンに。
ただ心配なのは、「ボーンの動きをヒットボックスでちゃんと再現できるか」ということ。ピボットポイントの設定とかシビアそうだし、ボーンコンストレイントの影響を含めてコピーできるのかも疑問。
またこの方法も、各ボーンの回転角度がデフォとなってしまう可能性がある。
■ 思い切って分担
こうなったらアニメーション用のキャラとラグドール用のキャラを分けて、ラグドール発動時に切り替えるとかw
結局、アニメーションの途中からラグドール化させる方法はわからずじまい。ググってもゲームエンジンにおける解説は見つかるものの、それ以外は最初からラグドール化しているものばかりなんですよねえ。現時点の僕には、これが限界のようです……。
まずはモデリング&リギング。モデルがチャチいのは、見て見ぬ振りしてくださいw
リギングは、親子関係をつけずにフラット階層で。そうしないと、正確な物理演算結果が得られません。
続いてボーンやメッシュに合わせて、ヒットボックスを配置。最終的に、ボーンをこのヒットボックスの動きに連動させます。
各接続には、然るべきリミットを設定する。
各ボーンにChild ofコンストレイントを設定し、ヒットボックスの一致する部位を指定。
以下は余談です。
ラグドールは、アニメーションの途中から発動してナンボ。例えば歩いている途中で何かに躓いて転ぶとか、ダメージを受けて倒れるとか。それらを再現するには、どうしたらいいんだろう?
そもそもこの場合のボーンは、キャラクタのアニメーションのためのものではなく、ヒットボックスの物理シミュレーション結果をメッシュに伝達させるためのもの。なので、キャラをアニメーションするには別の方法を使用する必要がある。
ならば、ヒットボックスをアニメーションさせれば良いのでは? ヒットボックスなら、剛体コンストレイントで連鎖しているので比較的楽に動かせます。しかしIKやボーンコンストレイントなしでは、アニメーションに限界がある。
そこで、いくつか試行錯誤してみました。
■ ダブルアーマチュア
まずは、ヒットボックスにアーマチュアを仕込んでみる。つまり、メッシュ側とヒットボックス側のダブルアーマチュアというわけです。
これならヒットボックスはアーマチュアの子なので、ラグドール化の妨げにはならないはず。
ところが両腕を下げて試してみると、
■ オブジェクトコンストレイント
ならばアーマチュアを独立させ、オブジェクトコンストレイントでアニメーションさせようではないか。
と思ったら、ヒットボックスの中心点で回転。まあ、そりゃそうか……。
■ ボーンからヒットボックスへ
まだ試してはいませんが、アニメーションさせたボーンの情報をヒットボックスへコピーすればどうだろう? そして然るべきタイミングでヒットボックスのダイナミクスをオンに。
ただ心配なのは、「ボーンの動きをヒットボックスでちゃんと再現できるか」ということ。ピボットポイントの設定とかシビアそうだし、ボーンコンストレイントの影響を含めてコピーできるのかも疑問。
またこの方法も、各ボーンの回転角度がデフォとなってしまう可能性がある。
■ 思い切って分担
こうなったらアニメーション用のキャラとラグドール用のキャラを分けて、ラグドール発動時に切り替えるとかw
結局、アニメーションの途中からラグドール化させる方法はわからずじまい。ググってもゲームエンジンにおける解説は見つかるものの、それ以外は最初からラグドール化しているものばかりなんですよねえ。現時点の僕には、これが限界のようです……。