技術

Bulletで人体を歩かせる その2

前回の動画のものは、キャラの位置と進行速度を決定するために衝突判定を無くしたKinematicオブジェクトひとつを胴体に括りつける感じで使っていました。
これはかなり強引な方法で、安定性は増すのですが、物理的な自由度は減ります。
例えば飛んできた鉄球に当たったとき人体の各パーツはきちんと衝突反応しますが、人体そのものは飛んでいきません。
(btGeneric6DofConstraintでy軸のみ自由度を持たせてたので厳密にはy軸方向へのみある程度飛ぶはずです。)

ということで今回は物理的な自由度を増すためにKinematicオブジェクトを使わないパターンで作ってみました。

段差で転びやすいなど安定性は落ちましたね。
あと真っ直ぐ歩かないですね。
一応進行方向を向くような力は与えてるんですが強制的なものじゃないのでフラフラします。
でもそのおかげで、例えば右肩に鉄球が当たったときにはある程度リアルに回転するハズです。

ラグドール化する条件についても、前回は「最後の地面に接触したらラグドール化する」というかなり大雑把なものでしたが、今回は「胴体がある程度傾いてバランスが取れなくなったらラグドール化する」というものに変わってます。
おかげで途中で倒れたり、逆に最後の地面に接触しても姿勢を崩してなければラグドール化しない、といった動きを見せてます。

足場のないところに落下したときに途中で落下が止まってるように見えるのは、キャラの移動範囲を制限するために2000x2000x2000ぐらいの範囲のbtGeneric6DofConstraintを適用してるからです。
Constraint無しでも同じように歩くことを確認してます。

現時点では脚の振り幅というか角度は胴体ローカルで固定になってるんですが、胴体の傾きに応じてそれを動的にすると多少安定性と自然さが増すんじゃないかなと思います。
例えば前のめりになってるときは脚をより前に出そうとするあれを再現したいです。
そうすれば動画のなかで頻発してる膝カックンの頻度が下がるはずです。

コメントを残す

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



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

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