まえがき
Godot楽しくて良いです。
バカゲー作りたいので、ラグドールシステムの習得に挑戦しました。
日本語の情報は公式ドキュメントぐらい、英語でもラグドールシステムについて解説するページはほぼ見当たりませんでした。
結局、ドキュメントを読みながら手探りで動かせましたが、めちゃくちゃ時間掛かりました、分かったらBlenderで物理設定するより簡単な気がします。
環境
Godot 4.3
ラグドールシステム
物理スケルトンの作成
ラグドールシステムで使うキャラクターをインポートします。
モデルに関して
ボーンは筆者の動いて欲しいなと思う部分に絞り最少構成で作成しました。
後述しますが、物理スケルトンを作成する際に、末端ボーン(ここではルートから3階層目)のheadなどのボーンに対して物理スケルトンが自動で作成されませんでしたが、原因はいまいち分かっていません。
インポートして、シーンを作成したら、スケルトン3Dを選択します。
ツールバーにスケルトン3Dのツールが表示されるので、選択して物理スケルトンを作成します。
これで、動かすのに必要な設定は9割終わったので、あとはスクリプトを先ほど作成した物理スケルトンに追加します。
GDScriptはfunc _ready()に1行追加するだけです。
func _ready() -> void:
physical_bones_start_simulation()
シーンに配置して動かしてみる
メインシーンにグラウンドやカメラなど設置してプロジェクトを実行してみます。
エラーなどなく、ひとまず物理処理が始まっていれば問題ありませんが、物理ボーンとして設定されていない箇所や、ボーン自体の挙動も人体っぽくありません。
物理ボーンの追加と設定
追加
まず筆者のモデル構成では、ボーン階層の末端部の物理ボーンが自動で作成されませんでした。そもそも、ビューポート上にすら表示されていません。
ここでは大きな問題ではありませんでしたが、どこで設定できるんでしょうか?
今のところ、理由については調べてもいないのでスルーして物理ボーンを追加して行きます。
キャラクターのシーンでPhysicalBoneSimulator3Dノードの子にPhysicalBone3Dを追加します。
PhysicalBone3Dのインスペクターから、ボーン名を設定します。
PhysicalBone3Dにコリジョンを設定します。
コリジョンのインスペクターでシェイプを設定します。
自動で追加された時と違って、シェイプの形状がキャラクターのモデルに合っていないので、変更します。
シェイプの形状はキャラクターの形状より少し小さめに作成するのが、挙動的には良いかなと思います。
任意のボーンを追加していきます。シェイプの設定など面倒ですが他に方法が分からなかったので頑張ります。
左右対称に存在するボーンは片側を設定した後に、トランスフォームの値をコピーして貼り付けるのが楽でした。
設定
物理ボーンが追加出来たら、物理ボーンのインスペクターにジョイントの設定があるので6DOFJointに変更します。
他のジョイントも試してみましたが、6DOFJointのジョイントコンストレイントのデフォルト設定がそのまま人体の挙動にマッチしていたので選びました。
これを物理ボーン全てに設定して行きます。面倒くさい…
一応、ドキュメントにはスクリプトでジョイントタイプを設定するメソッドがありましたが、勉強不足で使い方が分からなかったので…
ここまでの設定を終えてプロジェクトを実行すると筆者の想定していたような挙動をしてくれました。
筆者は、この記事を作成する前のプロジェクトで設定した挙動がより好みでした。
このように紹介した設定項目を少し弄るだけでも挙動が大きく変わるのでいろいろ弄って遊んでみて下さい。
あとがき
ラグドールシステムもとい物理演算は筆者の作りたいゲームには欠かせないので、引き続き習得を目指して行きます。
コメント