技術

bulletでラグドールを自立させるテスト

物理演算を利用したゲームは近年かなり増えましたが、人体のような複雑なものについては、例えば生きてる間はあらかじめ用意されたモーションに従って大胆に簡略化された物理に沿って動き、死んだ瞬間にラグドール化しある程度詳細な物理を適用するという方法がよく採られています。
(以降、前者をゲーム物理、後者をリアル物理と呼ぶことにします。)

私たちは単に立ち続けるなんて事は無意識にこなせますが、その無意識による反応・判断をアルゴリズム化してリアル物理中で再現するのはとても難しいです。
ゲーム内のキャラクターは単に立ち続けるだけじゃなく、走ったりジャンプしたりしゃがんだり様々な動作をするわけで、単に立ち続けさせるだけでも大変なのに、様々な動作をリアル物理の中で自然に行わせるアルゴリズムを実装するのは現時点では現実的ではないでしょう。
それをやろうとすると多分、ゲーム開発というよりロボット開発のノウハウが必要になってくるんじゃないかなと思います。

だから、開発のしやすさ、ユーザーに対する操作性、リアル物理による見た目の効果、それぞれのバランスをとるためには、多少不自然でも前述したようにあるトリガーによってゲーム物理とリアル物理を切り替えるってやり方が手っ取り早いんでしょう。

でもやはり究極的には生きてるキャラ(というかゲームの中の全て)にもリアル物理を適用したいですよね。
うまく制御できればそのほうがゲームの幅が広がりますから。

例えば対戦格闘ゲームで、「相手の浮いた脚に攻撃をヒットさせると相手がバランスを崩しダウンする」という事が、リアル物理の中では特に意図して実装しなくても実現可能なわけです。
まぁこのくらいならあらかじめ「そういう機能」を実装する事によってゲーム物理でも似たようなものを実現することは十分可能ではありますが、さらにそこから発展して「攻撃が弱かったから」「攻撃がうまく当たりきれなかったから」「相手の残った脚がうまい位置にあったから」結果的にダウンしなかったなんて事も、リアル物理の中では特に意図して実装しなくても起こりうるわけです。

ありえない事ですが完璧なリアル物理エンジンがあれば、現実世界で起こりうる事は全て起こりえます。
起こりうることは無限にあるわけですから、それらを特別な場合として全てあらかじめゲーム物理の中で実装するのは不可能です。
こういう点にリアル物理の優位性があります。
(もちろん、破綻の無いリアル物理を適用したとして、かならずしもゲームが面白くなるわけじゃないですけどね。)

あとは、個人でゲーム開発してるとキャラクターのモーションデータを用意するのが大変だから、物理エンジンで自動的にそれっぽく動いてくれたらいいなぁってのがあります。
(個人的にはこっちのほうが主眼かな)

しかしリアル物理の中でキャラを自律的に動かす(リアル物理の中ではプレイヤーの入力待ちの間でも、状態を維持するために自律的に各関節によるトルクを細かく制御し続けたりしなければいけません)、特に実際の人間と同じように動かすのはとてつもなく難しいわけです。

で、多少自然さを犠牲にしてでも出来るだけ簡単な仕組みでキャラをリアル物理の中で自立させるにはどうしたらいいか、色々実験しながら考えてたんですが、自分の中では”足の接地点から胴体の「あるべき場所」を計算し、そこに近づくような神の力を胴体に加えるという方法”が一番よさそうだったたので実装してみました。


(bullet 2.79使用。iOSシミュレータによる実行結果を録画。)

が、見ての通り失敗ですね(;´Д`)
パラメータの調整程度でもう少しおとなしくできそうではありますが…

途中手を振り回してバランスをとったり、手を地面について完全なダウンを防いだりしてるように見えなくもない部分もありますが、普通ならその体勢から立ち上がるのは無理だろってツッコミたくなるような部分も多々ありますね。

例の相撲ゲームの方がまだよっぽどリアルというか人間臭い動きをしますね。

人体のモデルデータは以下で配布されてるものを利用しました。感謝!
http://cg.xyamu.net/Blender/entry188.html

コメントを残す

メールアドレスが公開されることはありません。



※画像をクリックして別の画像を表示

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください