Simplestar Game

How do I create a 3D game ?
http://simplestar.syuriken.jp/
since 17/01/2009
  • BACK
  • HOME
  • NEXT
  • |

:::::::::::040話 関節構造 制約と拘束:::::::::::

なんでもかんでも落下させるだけでは、そろそろ飽きてきたころ
今回はいろいろな関節構造で、物体の動きに制約を与えます。

今回は振り子をイメージしてイラストを描いてみました。
はい、すみません。本題に戻ります。

たとえば、振り子運動や、蝶番(ちょうつがい)での開閉です。
bullet で表すすべての関節構造についてデモが用意されています。
では、早速そのデモ ConstraintDemo のコードを確認してみましょう。

こちらのコードを実行した結果は次の通りです。

では、一つ一つの関節構造に着目して、具体的な実装方法を確認していきましょう。

btPoint2PointConstraint

点球結合です。
イメージは次の通り。

基本的な使い方は、それぞれの剛体の結合部の座標(ローカル座標)を指定して
Constraint を作成して、World へ登録するだけです。
固定した剛体の下部にもう一つの剛体をぶら下げるように書いてみました。

実行結果がこちら↓

コメントアウトしていますが、setBreakingImpulseThreshold 関数で一定値の力が加わると
点結合が破壊されるように設定できます。単位は [N] ニュートン です。

btHingeConstraint

蝶番(ちょうつがい)またはヒンジです。
みんなも知っているドアと壁の付け根についている工具です。
イメージはこんな感じ↓

使い方は簡単、ドア部の剛体と軸の位置と軸の方向を指定して Constraint を作成し
World へ登録するだけです。以下のデモコードでは、動きの制限角度も指定しています。

実行結果は次の通りです。

物体同士のヒンジ結合をみてみましょうか。
コードはこんな感じ↓になります。

実行結果は次の通り。

指の関節や、ヒザの関節に向いている制約ですね。
さらに、ヒンジの回転軸に沿ってトルクをかける機能も存在します。
リアルタイムロボットシミュレーションを考えたときに、需要がありそうですね。
ここに使用例を載せておこうと思います。

enableAngularMotor 関数で目標回転速度ど出力トルクの値を指定できます。
コードはこんな感じ↓になります。

実行結果は次の通り。

一般的なヒンジの利用はこんな感じで十分なんじゃないでしょうか?
実は、もう少し高度なヒンジ結合というものがあります。
その名も、二軸ヒンジです。

btHinge2Constraint

たとえば、車のタイヤのサスペンションとステアリング角度とタイヤ軸の回転です。
2軸の回転が組み合わさった特殊なヒンジ結合として、Constraint が用意されています。

実行結果は次に示す通りです。

コードには書かれていませんが、サスペンションの可動範囲を決定するには
setLinearUpperLimit, setLinearLowerLimit 関数で指定します。
両方に原点を指定すると、サスペンションが働かない状態を表現できます。

btGeneric6DofConstraint

直訳なら一般的な6自由度拘束。
スライダーやヒンジ、回転軸、点結合を表現できます。
さっそく使い方を見てみましょう。

実行結果は次の通りです。

スライダーする軸に沿って回転する機構が確認できます。
注目すべきは、どのようにして制約を与えているかですが
setLinearLowerLimit, setLinearUpperLimit で btVector3 を与えている点にご注目ください。
3要素それぞれは X, Y, Z 軸の最小値、最大値を指定しています。(これで3軸のスライド可動範囲が決まります。)
次に、setAngularLowerLimit, setAngularUpperLimit で btVector3 を与えている点にご注目ください。
3要素それぞれは X, Y, Z 軸の最小値、最大値を指定しています。(これで3軸の回転角度範囲が決まります。)
ドキュメントを読んでいる方はお気づきの通り、リミット指定には次のルールが適用されます。
参考にしてください。

For each axis:
Lowerlimit == Upperlimit → axis is locked.
Lowerlimit > Upperlimit → axis is free
Lowerlimit < Upperlimit → axis it limited in that range

ここまで軸に沿った6自由度拘束を示しましたが、次に示すものは空間として動きが制約されるものです。
現実でこうした機構を作るのは難しいですが、仮想空間ならではの表現と言えるでしょう。
作成コードがこちら↓

実行結果は次の通りです。

回転軸の可動範囲の表現がパラシュートみたいで面白いですね。

btConeTwistConstraint

ドキュメントには、ラグドール(人体模型)の関節、特に肩などの
点結合関節に制約を与える場合に使える表現とありました。
とりあえず、実装コードを確認してみましょう。

実行結果は次の通りです。

この Constraint ですが、実におもしろいですね!
点結合に制約を与えるのはもちろんのこと、ハードリミット、ソフトリミットという
緩衝領域というものを指定できるようになっています。

setLimit 関数の最初の2つの引数で、X,Z軸方向のコーンの広がり幅を指定して
第3引数でツイスト回転角度の範囲を指定します。
第4引数には、制限範囲に対する実際に動ける可動範囲の比率を指定します。
1.0fなら制限範囲内は完全に自由に動けますが、0.2fとかにすると
関節がまるでかたくなったような表現ができます。

鎖の表現とか、応用範囲、利点はたくさんありそうです。
今後、いろいろと試していきたいですね。

点結合に角度の制約を与えるには、このほかにも方法があります。
6自由度拘束を使う方法です。
これは詳細を説明しなくても、ここまでの紹介でわかる範囲なので説明を省きます。

実行結果は次の通りです。

スプリング(バネ)

6自由度拘束を利用して実装します。

enableSpring 関数にご注目、そのほかは特に目新しくないです。

実行結果がこちら↓

スライダーのスプリング表現と、回転のスプリング(ゼンマイ)の表現が確認できます。
面白いですね!

スライダー

最後の機構は実は既出です。6自由度拘束によってスライダーを表現します。
ちょっと違うところと言えば、モーターで動かすあたりでしょうか。

実行結果がこちら↓です。

油圧やエレベーターなどを想像させる機構ですね。
使いどころが多そうです。

まとめ

今回は Constraint Demo を読み上げただけなので、特に難しいところはなかったと思います。
わたしが解説しなくとも、読めばわかることですからね。

次回はソフトボディについて、見ていきたいと思います。
一体どうやって実現するのでしょうね。では次回をお楽しみに!!

2011/09/11 初記。
2011/09/11 最終更新。

:::::::::::040話 関節構造 制約と拘束:::::::::::

  • BACK
  • HOME
  • NEXT
ホームページ制作 フリー素材 無料WEB素材
Copyright (C) Simplestar All Rights Reserved.