!!!2つのGameObjectをつなぐ(Joint) Rigidbodyの物理属性が与えられたGameObject同士を結ぶ機能としてジョイント(Joint)があります。 これは、AddComponentでのPhysics内で *Fixed Joint *Hinge Joint *Spring Joint の3つが用意されています。 {{ref_image unity_physics_joint_00.png}} 他にCharacter Joint/Configurable Jointというのもありますが、2つのGameObject間の挙動よりも複雑なため、ここでは割愛。 Jointを使用するには、個々のGameObjectでRigidbodyの指定をしておく必要があります。 !!ジョイントの種類 ジョイントの概念を図式化します。 {{ref_image unity_joint_img.png}} ジョイントを割り当てた場合、その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」を指定。 {{ref_image unity_physics_joint_01.png}} これで、Capsule_j1、Capsule_j2、Capsule_j3は数珠繋ぎになったことになります。 ただし、Fixed Bodyの場合は接合部は不動です。 !!Hinge Joint (チョウツガイのような動き) ドアのチョウツガイのような動きをさせる場合、標準で用意されているCubeを使用してもうまくいかず(Unity 4.3.4)。 試行錯誤してみると、 *開閉する箇所(回転軸)が原点位置にきている形状を使用 *Hinge Jointの「Connected Body」はNoneにする(ワールド座標でHingeの軸を拘束) とする必要がありました(間違ってるかもしれませんが、、、)。 以下、開閉するチョウツガイの手順になります。 !ドア部分の形状を作成(Shade 3Dを使用) 下図のように、原点位置が板の端になるようにポリゴンメッシュを生成してfbx出力。 {{ref_image unity_rigidbody_hinge_01.png}} !fbxをUnityにインポートし、シーンに配置 fbxをインポートしてシーンに配置します。 この際に、Positionを(0, 0, 0)にしたときに原点位置に板の端が来ることを確認。 {{ref_image unity_rigidbody_hinge_02.png}} シーン上の配置自身は、Positionが(0, 0, 0)である必要はありません。 上記画像の赤い板は、RigidBodyの指定をしていてConstraintsがPosition/RotationともにFreezeしている不動の形状。 白い板が、チョウツガイ的に動くGameObjectになります。RigidbodyとBox Colliderを割り当ててあります。 !ドア部分にHinge Jointを割り当て 白い板のGameObjectのInspectorウィンドウで、「Add Component」より「Hinge Joint」を指定。 以下のようにパラメータ設定しました。 {{ref_image unity_rigidbody_hinge_03.png}} 「Connected Body」はチョウツガイ表現の場合はNoneである必要がある?ここに、既存のRigid bodyの形状を指定すると、Limitedの回転制限が無効になってしまいました。 「Anchor」はHingeの回転の中心(ローカル座標値)。チョウツガイの挙動をさせる場合は(0, 0, 0)である必要がある? 「Axis」は回転軸になります(ローカル座標値)。Sceneビューでワイヤーフレーム表示させると、オレンジ色の矢印が見えます。 これが、チョウツガイの軸に沿うように指定します。 「Use Spring」をOnにすることで、チョウツガイが可動後に元に戻る力が働きます。 「Spring」はバネの強さ、「Damper」が大きい値になるほどバネによる戻る力はゆっくりになります。 「Use Limits」をOnにすることで、可動の角度を指定します。 「Min」は最小角度、「Max」は最大角度(度数で指定)。 この例では、チョウツガイの板を配置して、上から球を落として衝突させました。 {{ref_image unity_rigidbody_hinge_04.png}} 球が板を押し下げて落下しています。その後、バネの力で板が元の位置に戻ります。 板に重力による自分自身を押し下げる力を与えたくない場合は、Rigid bodyの「Use Gravity」をOffにするとよいと思います。 ---- {{lastmodified}}