NULLNULL ROOM

ぬるぽ

Unity : Hinge JointのAnchorとAxis設定

Hinge Jointは回転可能な軸が1つだけある結合で、
その名前の通り蝶番のような動きをさせたい場合に使うらしいが、
その設定の中でAnchorとAxisの設定がピンと来なかったのでメモしておく。

いろんなサイトを見てみると、それぞれの説明はこんな感じで書かれていることが多い。
Anchor : ボディが揺れる中心となる軸の位置。
Axis : ボディが揺れる中心となる軸の方向。

なるほど、分からん。と言う感じだが、一回分かるとこの説明でも分かる。
図を使って考えていこう。

f:id:NULLNULL:20141002230032j:plain
今2つのカプセルがHingeJointで繋がっていて、
上のカプセルが親オブジェクトで、下のオブジェクトにヒンジが設定されている。

更に、今は下のカプセルを上のカプセルと下のカプセルの
間のくびれた部分でX軸方向に回転させたいので、
こんなコードを書いてある。

using UnityEngine;
using System.Collections;

public class RotateController : MonoBehaviour {
	private Rect TextZone1 = new Rect(0,0,100,50);
	private Rect TextZone2 = new Rect(0,10,100,50);
	private Rect TextZone3 = new Rect(0,20,100,50);
	
	private GameObject G_bottom;
	private string s,s2,s3;


	// Use this for initialization
	void Start () {
		G_bottom = GameObject.Find ("Capsule_bottom");
	}
	
	// Update is called once per frame
	void Update () {
		G_bottom.transform.Rotate(1,0,0);
		s = G_bottom.transform.localEulerAngles.x.ToString ();
		s2 = G_bottom.transform.localEulerAngles.y.ToString ();
		s3 = G_bottom.transform.localEulerAngles.z.ToString ();
	}

	void OnGUI()
	{
		GUI.Label(TextZone1,"x="+s);
		GUI.Label(TextZone2,"y="+s2);
		GUI.Label(TextZone3,"z="+s3);
	}
}

あとはHingeJointのAnchorとAxisを適切に設定すれば目的の回転ができるんだが、
果たしてどう設定したら目的の回転ができるでしょうか?と言うのが今回の問題である。
画像で目的の回転を確認するとこんな感じだ。
f:id:NULLNULL:20141002232526j:plain
要するに下側のカプセルを黄色の軸を中心に、青色の軌道で回したい訳だ。

この場合AnchorとAxisの設定はどうすれば良いかと言うと、
(今回の例では)こうなる。
f:id:NULLNULL:20141003000732j:plain
まずAnchorの設定から考えていく。
Anchorは回転させたい物体の回転の中心を設定する部分であるので、
回転させたい物体の回転中心の座標(つまり黄色い軸の座標)を入れる。
因みにこの座標はHingeJointを設定してあるオブジェクト
から見た時の座標になるので注意が必要。
今回は回転中心(黄色い軸)は下側のカプセルの中心から
Y軸方向に+1した位置にあるので
Anchorの値はX=0,Y=1,Z=0になる。

次にAxisについて考える。
Axisは物体を回転させる軸を設定する部分である。
軸の"座標"ではなく、"軸"なので注意しないといけない。
今回はX軸を中心に回転させたいので、
Axisの値はX=1,Y=0,Z=0になる。
因みにこの値もHingeJointを設定してあるオブジェクト
のX軸、Y軸の値である(つまりローカル座標での軸)
ので注意しないといけない。

今回のプロジェクトファイルはこちら↓
http://dry-room.net/files/HingeTest.zip