HTC VIVE開発ノート(一)SteamVRプラグインを用いた基本的なインタラクション

2791 ワード

1、取手の引用:現在、左右の取手を区別していない
 private SteamVR_TrackedObject trackedobj;
 private SteamVR_Controller.Device device;
 trackedobj = GetComponent();
 device = SteamVR_Controller.Input((int)trackedobj.index);

あとはこのindexを判断することでどのハンドルなのか判断できるでしょう.SteamVRでは追跡可能な全ての機器をこのTrackedObjectクラスに保存し、GetComponentメソッドで現在追跡されている物体を取得し、ハンドルへの入力を取得することができる(Updateメソッドで行うことで、常に更新することができる.そうでなければStartメソッドで取得した入力であれば、最初に保存したdeviceだけが物体と対話できる).その後の操作はすべてこのデバイスに基づいて行われました.
2、touch padの座標を取得する
device.GetAxis().x
device.GetAxis().y

3、Triggerが押されていないか、または緩められていないかを監視する
 if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
GetPressDownメソッドは、ブール値を返します.
ButtonMaskここでもキーボードのような判断を行い、ハンドル上の異なるボタンの名前に変更して、対応する判断や処理を行うことができます.
4、ハンドルでCubeを掴み、緩める流れ
まず、ハンドルとつかむ物体にColliderを追加します.ハンドルのColliderのisTriggerをチェックすると、実はハンドルは衝突体ではなく、虚のようなもので、トリガイベントを監視する物体としてしか感じられません.
とても愚かな問題に出会って、どのようにColliderの大きさを調整して、Sceneの下でハンドルの模型が見えないため、私はこのようにして、playを始めて、それからハンドルを見てからゲームを一時停止して、Sceneモードに戻って、ハンドルの大きさによってColliderを調整して、パラメータを記録します.そしてゲームをやめて、パラメータを変更しました.みそにする.
次に、使用した関数を見てみましょう.
 private void OnTriggerEnter(Collider other)

衝突体otherが現在のTriggerに入ると,このEnterメソッドが呼び出される.ここではこのcolliderのtransform.gameObjectを保存します.
interactBox = other.transform.gameObject;

TODO:Collider.transform.gameObjectとCollider.gameObjectの違いを明らかにします.なぜother.gameObjectを直接保存できないのですか.
 衝突体がTriggerを離れると(OnTriggerExit)、interatBoxをクリアします.
把持操作を行い、把持した物体をハンドルの下に縛り、ハンドルの変化に伴って変化させる.このcolliderノードを親ノード(ハンドル)の下に縛ることです.
 //  trigger     
        if (device.GetPressDown(SteamVR_Controller.ButtonMask.Trigger))
        {
            Debug.Log("Trigger down");
            if (interactBox != null)
            {
                interactBox.transform.parent = transform;
                Rigidbody rig = interactBox.GetComponent();
                rig.useGravity = false;
                rig.isKinematic = true;
            }
        }

        //  trigger     
        if (device.GetPressUp(SteamVR_Controller.ButtonMask.Trigger))
        {
            Debug.Log("Trigger up");
            interactBox.transform.parent = null;
            Rigidbody rig = interactBox.GetComponent();
            rig.useGravity = true;
            rig.isKinematic = false;
        }
Unity初心者なので、最初はよく分かりませんでしたが、ここのtransformはなぜハンドルのtransformなのか.このスクリプトはハンドルの下に縛られているので、クラスに相当するでしょう.transformはその中のメンバーの一人なので、直接アクセスできます.
に合格
interactBox.transform.parent = transform;
は、衝突した物体の変換行列を親ノードの変換行列の下に縛る.次に、リジッドボディのパラメータを変更します.
今日の勉強を通して、UnityとHtc viveの開発に少し慣れました.