Teachers open the door but You must enter by yourself.

Open Media Lab.
オープンメディアラボ

インストール

  1. Steamをインストール
  2. SteamでSteamVRとWindows Mixed Reality for SteamVRをインストール
  3. Unityのプロジェクトは通常のStandaloneで作成。

HMD表示の確認

  1. Edit/Project Settings/Player/XR SettingsのVirtual Reality Supportedにチェックをつける。Virtual Reality SDKs の順番をOpenVR、Cculusの順にする。
  2. Hierarchy/Main CameraのPositionを(0,0,0)にする。
  3. 操作対象物としてHirerarchy/Create/3D Object/Cubeを生成し、HMDから前方50cm、下方50cmとなるようにPositionを(0, -0.5, 0.5)にする。また、大きさが一辺10cmの立方体となるようにScaleを(0.1, 0.1, 0.1)にする。
  4. ここで再生してみる。

HMDを被ったときにCubeが正面に来るように視点を変更する機能

  1. Hirerarchy/Create Emptyで空のGameObjectを生成し、名前をRecenterにする。
  2. Recenterが選ばれた状態でInspector/Add ComponentでNew Scriptを生成し、名前をRecenterとする。
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.XR;
    
    public class Recenter : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
    	//着座モード
            XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);
        }
    
        // Update is called once per frame
        void Update()
        {
            // Rキーで位置トラッキングをリセットする(Stationaryでしか動作しない)
            if (Input.GetKeyDown(KeyCode.R))
            {
                InputTracking.Recenter();
            }
        }
    }
    
  3. ここで再生してみる。

左コントローラの表示

  1. 左コントローラとしてHirerarchy/Create/3D Object/Cubeを生成し、名前をLeftHandとし、大きさが一辺10cmの立方体となるようにScaleを(0.1, 0.1, 0.1)にする。
  2. LeftHandが選ばれた状態でInspector/Add ComponentでNew Scriptを生成し、名前をLeftHandとする。
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.XR;
    
    public class LeftHand : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
            
        }
    
        // Update is called once per frame
        void Update()
        {
            //Update Controller Position and Rotation
            List<XRNodeState> nodes = new List<XRNodeState>();
            InputTracking.GetNodeStates(nodes);
            XRNodeState node = nodes[(int)XRNode.LeftHand];
            node.TryGetPosition(out Vector3 position);
            node.TryGetRotation(out Quaternion rotation);
            transform.localPosition = position;
            transform.localRotation = rotation;
         }
    }
    
  3. ここで再生してみる。

左コントローラによる物体移動

  1. LeftHandが選ばれた状態でInspector/Add ComponentでPhysics/Rigidbodyを生成し、UseGravityのチェックを外す。Inspector/BoxColliderのIsTriggerのチェックをつける。
  2. LeftHand.csのコードにOnTriggerStay関数を追加する
    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    using UnityEngine.XR;
    
    public class LeftHand : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
            
        }
    
        private GameObject pickedObject;
        private bool moving = false;
        private Vector3 dPosition;
        private Quaternion dRotation;
        // Update is called once per frame
        void Update()
        {
            //Update Controller Position and Rotation
            List<XRNodeState> nodes = new List<XRNodeState>();
            InputTracking.GetNodeStates(nodes);
            XRNodeState node = nodes[(int)XRNode.LeftHand];
            node.TryGetPosition(out Vector3 position);
            node.TryGetRotation(out Quaternion rotation);
            transform.localPosition = position;
            transform.localRotation = rotation;
            
            if (moving) //in moving
            {
                //Update pickedObject Position and Rotation
                pickedObject.transform.localPosition = transform.position + dPosition;
                pickedObject.transform.localRotation = transform.rotation * dRotation;
                if (Input.GetKeyUp("joystick button 14")) //releasing
                {
                    moving = false;
                    pickedObject.GetComponent<Renderer>().material.color = Color.white;
                }
            }
        }
    
        void OnTriggerStay(Collider other)
        {
            if (Input.GetKeyDown("joystick button 14")) //picking
            {
                pickedObject = other.gameObject;
                dPosition = pickedObject.transform.position - transform.position;
                dRotation = pickedObject.transform.rotation * Quaternion.Inverse(transform.rotation);
                //Moving switch on
                moving = true;
                pickedObject.GetComponent<Renderer>().material.color = Color.red;
            }
         }
    }
    

    Windows MR によるオブジェクト操作

    1. Edit/ProjectSettings/XR Plugin Managementでインストールボタンを押す。
    2. HMDがWindows MRの場合はWindows Mixed Reality を選択。viveの場合はOpenVR XR Pluginをダウンロードして、ダブルクリック、OpenVR Loaderが追加されるので、これを選択。
    3. GameObject/XR/Convert Main Camera to XR Rigを実行するとMainCameraがXRRig/Camera Offsetの下に移動する。
    4. Main Camera の Clipping Planes/Nearを0.1ぐらいに変更
    5. XRRig/Camera Offset/MainCameraのTargetEyeをBothに変更
    6. XRRigのPositionを(0,0.3,-0.3)などにする。
    7. Right Hand(空のオブジェクト)を生成し、子に右手のモデル(Cubeなど)を配置
    8. 右手のモデルにTracked Pose Driver,Rigidbody,Manipulate.cs(下記)をアタッチ、コライダーのIs Triggerにチェック。
    9. Tracked Pose Driverで、Device:Generic XR Controller Pose Source:Right Controller
    10. 操作対象物としてHirerarchy/Create/3D Object/Cubeを原点に生成。大きさが一辺10cmの立方体となるようにScaleを(0.1, 0.1, 0.1)にする。
    11. ここで再生してみる。

    Manipulate.cs

    
    using System.Collections;
    using System.Collections.Generic;
    using UnityEngine;
    
    public class Manipulate : MonoBehaviour
    {
        // Start is called before the first frame update
        void Start()
        {
            
        }
    
        private GameObject pickedObject;
        private bool moving = false;
        private Vector3 dPosition;
        private Quaternion dRotation;
        // Update is called once per frame
        void Update()
        {
            if (moving) //in moving
            {
                pickedObject.transform.position = transform.position + dPosition; //global
                pickedObject.transform.rotation = transform.rotation * dRotation; //global
                if (Input.GetKeyUp("joystick button 15")) //release
                {
                    moving = false;
                }
            }
        }
        void OnTriggerStay(Collider other)
        {
            //Debug.Log("collid\n");
            if (Input.GetKeyDown("joystick button 15")) //pick or moving 右手トリガーボタン15、左手14
            {
                Debug.Log("moving\n");
                pickedObject = other.gameObject;
                dPosition = pickedObject.transform.position - transform.position;
                dRotation = pickedObject.transform.rotation * Quaternion.Inverse(transform.rotation);
                //Moving switch on
                moving = true;
                //pickedObject.GetComponent().material.color = Color.red;
               
            }
        }
    }
    

    注意事項

    • コントローラーの位置がおかしくなったらSteamVR,Windows MR を再起動してみる。
    • 外部のモデルを取り込んだ時は、InspectorのStaticにチェックが入っている場合があり、チェックを外さないと動かない。