[Unity]オブジェクトの回転を合わせる方法(ARマーカー等)

前回、基本的なオブジェクトの親子関係と、AR/VRでのサンプルについてブログを投稿しました。

Unityでのオブジェクトの親子関係は非常によく使うので、この話題を扱ったわかりやすいブログ記事など多いのですが、いざやってみるとなかなか混...
今回もUnityを使う上での基本的な内容である回転について理解したことを記載します。
回転には、差分で回転させる(例:X軸で-30度回転)場合や、ある方向を向かせる(LookAt,LookRotaion)など、非常に多くのやり方があります。
この記事では、前回の記事のサンプルと同じく、VuforiaなどでARマーカーを検出した際に、マーカーと同じ向き(回転)でオブジェクトを生成する方法を考えてみます。
下記のようにARマーカーが壁などに貼ってあるときに、マーカーの場所に猫の絵を生成したいとします。
rotate1
ここで、ARマーカーと絵のTransformの矢印の向きをご覧ください。青い線で囲ってある部分がそれぞれのTransform.forwardを示します。もしこの向きが一緒ならば、単純にtransform.rotationの値を同じにすれば、マーカーと猫の絵の回転は同じになります。
今回の場合、マーカーのTransform.forwardは上向きで、猫の絵は画面奥向き(Z軸方向)になっています。この場合、単純にrotationを合わせても同じ向きにはなりません。(親オブジェクトを作って同じ向きにし、子オブジェクトを回転させた状態にしておく、という方法もありますが、構造が複雑になるのとスクリプトでのアクセスがしにくくなるので、今回は直接子を回転させます)
まずは、マーカーと猫の絵の回転を合わせるための差分をScene上で確認します。InspectorでマーカーのRotationを(0,0,0)にした状態で、猫の絵のRotationの数値を動かし、Scene上でマーカーと回転が合うようにします。今回は猫の絵のRotationが(90,0,0)で合いました。これを「回転差分」としてメモしておきます。
rotate2
ではここからスクリプトを書きますが、注意点として、Inspectorで設定したRotationの値は、スクリプト上では「transform.localRotation」ではなく、「transform.localEulerAngles」になる、ということを覚えておいてください。localEulerAnglesを使うと、Inspectorで設定した値を元に試行錯誤ができるので、Quaternionを使うよりかなりわかりやすくなります。

//配置したいオブジェクト
public GameObject picture;
void OnMouseDown()	//お好きなイベントで
{
	//インスタンス化(Quaternion.identityで回転を初期化)
	var obj = Instantiate (picture,gameObject.transform.position,Quaternion.identity);
	//Sceneで求めた差分の回転
	Vector3 target_diff_angle = new Vector3(90f,0,0);
	//基準となるマーカー等のlocalEulerAngles
	Vector3 marker_angle = gameObject.transform.localEulerAngles;
	//先にマーカーの回転に合わせる
	obj.transform.Rotate(marker_angle);
	//次に向きの差分の回転を適用する
	obj.transform.Rotate(target_diff_angle);
}

スクリプトはマーカーにアタッチするか、VuforiaならDefaultTrackableEventHandler.cs内に追加します。(サンプルではマーカーにColliderをアタッチしてマウスクリックで動作するようにしていますが、スマホならTouch、HoloLensならAirTapなどに置き換えて考えてください)
やっていることは単純で、Scene上で求めた差分の回転のベクトルと、マーカーの回転を求めておき、マーカーの回転→差分の回転、の順でRotateを使って適用しています。
ポイントとして、Instantiateする際に、第二引数にQuaternion.identityを指定し、Rotationを(0,0,0)に初期化しています。これは、先程Scene上で猫の絵のRotationを(0,0,0)にしてから差分を求めた、という操作と同じ意味になります。
その状態でいったんマーカーの回転を適用してから、向きを合わせるために差分の回転を適用しています。
これを実行すると、下記のようにマーカーが正面以外のところを向いていても、猫の絵が同じ向きで配置されるのがわかります。
※下記はマーカーのRotationは(-90,-45,20)の状態
rotate3

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク