kazumalab tech log

流行りとリラックマと嵐が大好きです。技術的ログ。

UnityにおいてHTC Viveの基本的なまとめ

Kazuma.です。

先日、VRハッカソンに参加してきました。
そこで初めてViveの開発して記事が少なかったので書き留めて置きます。

f:id:kazumalab:20160621004104p:plain

導入

Asset StoreでSteamVRというアセットがあるのでそれをダウンロード&importします。

f:id:kazumalab:20160621002115p:plain

Asset Store

こんな画面が出てくると思うので実機以外でもAccept Allを押します。

f:id:kazumalab:20160621002905p:plain

HTC Viveが接続されていてOnになっている場合はUnityの再生をすれば直でデバッグできます。

Controller

Viveには標準でControllerが2つついています。
はじめはアセットのサンプルシーンを使うといいと思います。

f:id:kazumalab:20160621004201p:plain

Main Cameraの子としてControllerのRightとLeftがあり、再生した時にControllerをOnにすると空間内に現れます。
ありがたいですね。

ものを持つ

今回ものを持つというのをControllerにColliderをつけ、isTriggerにチェックを入れておき、
その後スクリプトでOnTriggerStayを呼び、Controllerの子オブジェクトにするという方法を採用しました。
ものを放すときは子オブジェクトを解除します。

その時に問題になったことなどを書いておきます。

つかむ際にRigidbodyのisKinematicをtrueにする

これをしないとものを上に持ち上げたりすることはできません。

  col.GetComponent<Rigidbody> ().isKinematic = true;

こんな感じですね。これをOnTriggerStay内でものにヒットしたときにしてあげます。

ViveのControllerのボタンを押す

今回ものを持つ動作としてコントローラーのトリガーを引くとものを持つことにします。

入力apiはアセットで提供されているのでそれを使います。

 if(device.GetPressDown (SteamVR_Controller.ButtonMask.Trigger)){
      // つかむときの処理
}

持ち替える動作をする場合

Viveでは右手に持っているものを左手に持ち替えたいときがあります。
今の状態だと受け渡しができませんので、もう片方のControllerの情報をもっておかないといけません。

これが今回使用したコードの一部です。
自分の持っているものをgrabObjに格納してisGrabをtrueにします。
相手のgrabObjと自分が今持とうとしているものがおなじであれば、相手のisGrabをfalseにして相手は何も持っていない状態にします。

void OnTriggerStay(Collider other) {
		if (device.GetPressDown (SteamVR_Controller.ButtonMask.Trigger) && !isGrab && other.tag == "GrabItem") {
			if (otherHand.grabObj == other.transform) {
				otherHand.isGrab = false;
			}

			isGrab = true;
			grabObj = other.transform;

			//rigidbody呼び出して重力を消す
			other.GetComponent<Rigidbody> ().isKinematic = true;
			//otherRig.useGravity = false;
			//触っている相手(other)を自分の親にする。
			other.transform.SetParent (gameObject.transform);
          }
	}

これで受け渡しができました。
もっと簡潔でいい方法があるかも知れませんが、今回は方法がわからなかったため、これにしました。

スケールをあわせる

Unityで作る場合はViveのスケールが 4m × 4mであれば標準のキューブのスケールを4にすると同じになります。
このスケールをあわせるのが結構難しいところでもあります。

最後に

まだ自分自身Viveを持っていないので詳細の開発はできていませんので今回の記事は参考にならないかも知れません。
もしいい情報があれば教えていただければ幸いです。