トップ 差分 一覧 ソース 検索 ヘルプ RSS ログイン

unity_script_physics_joint

2つのGameObjectをつなぐ(Joint)


Rigidbodyの物理属性が与えられたGameObject同士を結ぶ機能としてジョイント(Joint)があります。
これは、AddComponentでのPhysics内で

  • Fixed Joint
  • Hinge Joint
  • Spring Joint

の3つが用意されています。

他にCharacter Joint/Configurable Jointというのもありますが、2つのGameObject間の挙動よりも複雑なため、ここでは割愛。

Jointを使用するには、個々のGameObjectでRigidbodyの指定をしておく必要があります。

 ジョイントの種類

ジョイントの概念を図式化します。

ジョイントを割り当てた場合、その2形状同士での衝突判定は行われない?やり方があるのかもしれませんが、まだ未調査。

Fixed Joint

2つのGameObjectを不動として結び付けます。

Hinge Joint

2つのGameObjectを、条件にしたがって可動するように結び付けます。
Hingeの名のとおり、ドアのチョウツガイのような表現に向いています。
指定のローカル軸を基準として回転を加えることができます。Hingeでは、GameObject間の距離は変化しません。
パラメータとしては「Spring」「Motor」「Limits」があります。

Spring Joint

2つのGameObjectを、距離可変で結び付けます。
バネを仕込んだように動作します。
2形状間の距離を、指定の距離範囲内で伸縮させたような挙動をしますが、軸固定には1つのSpring Jointだけではできないような感じではありました。
AとBの2つのGameObjectをSpring Jointでつなぐ場合は、A/Bの2つ両方ともにSpring Jointをコンポーネントとして割り当てると、それっぽい挙動をするようです。

 割り当て方


ここでは「Capsule_j1」「Capsule_j2」「Capsule_j3」の3つのCapsule形状を配置して、Capsule Colliderをそれぞれ割り当てました。
「Capsule_j2」に「Fixed Joint」のコンポーネントを追加し、Connected Bodyに「Capsule_j1」を指定(Hierarchyからこの枠にドラッグして割り当てられます)。
「Capsule_j3」に「Fixed Joint」のコンポーネントを追加し、Connected Bodyに「Capsule_j2」を指定。

これで、Capsule_j1、Capsule_j2、Capsule_j3は数珠繋ぎになったことになります。
ただし、Fixed Bodyの場合は接合部は不動です。

 Hinge Joint (チョウツガイのような動き)


ドアのチョウツガイのような動きをさせる場合、標準で用意されているCubeを使用してもうまくいかず(Unity 4.3.4)。
試行錯誤してみると、

  • 開閉する箇所(回転軸)が原点位置にきている形状を使用
  • Hinge Jointの「Connected Body」はNoneにする(ワールド座標でHingeの軸を拘束)

とする必要がありました(間違ってるかもしれませんが、、、)。
以下、開閉するチョウツガイの手順になります。

ドア部分の形状を作成(Shade 3Dを使用)

下図のように、原点位置が板の端になるようにポリゴンメッシュを生成してfbx出力。


fbxをUnityにインポートし、シーンに配置

fbxをインポートしてシーンに配置します。
この際に、Positionを(0, 0, 0)にしたときに原点位置に板の端が来ることを確認。

シーン上の配置自身は、Positionが(0, 0, 0)である必要はありません。

上記画像の赤い板は、RigidBodyの指定をしていてConstraintsがPosition/RotationともにFreezeしている不動の形状。
白い板が、チョウツガイ的に動くGameObjectになります。RigidbodyとBox Colliderを割り当ててあります。

ドア部分にHinge Jointを割り当て

白い板のGameObjectのInspectorウィンドウで、「Add Component」より「Hinge Joint」を指定。
以下のようにパラメータ設定しました。


「Connected Body」はチョウツガイ表現の場合はNoneである必要がある?ここに、既存のRigid bodyの形状を指定すると、Limitedの回転制限が無効になってしまいました。
「Anchor」はHingeの回転の中心(ローカル座標値)。チョウツガイの挙動をさせる場合は(0, 0, 0)である必要がある?
「Axis」は回転軸になります(ローカル座標値)。Sceneビューでワイヤーフレーム表示させると、オレンジ色の矢印が見えます。
これが、チョウツガイの軸に沿うように指定します。
「Use Spring」をOnにすることで、チョウツガイが可動後に元に戻る力が働きます。
「Spring」はバネの強さ、「Damper」が大きい値になるほどバネによる戻る力はゆっくりになります。
「Use Limits」をOnにすることで、可動の角度を指定します。
「Min」は最小角度、「Max」は最大角度(度数で指定)。

この例では、チョウツガイの板を配置して、上から球を落として衝突させました。

球が板を押し下げて落下しています。その後、バネの力で板が元の位置に戻ります。
板に重力による自分自身を押し下げる力を与えたくない場合は、Rigid bodyの「Use Gravity」をOffにするとよいと思います。


最終更新時間:2014年05月26日 17時17分36秒