Exemple #1
0
        public void UpdatePosition()
        {
            //回転を生成
            Quaternion quaternion = Quaternion.CreateFromYawPitchRoll(Rotation.X, Rotation.Y, Rotation.Z);
            //座標系を変更(右手系と左手系の入れ替え)
            Vector3 position = Position;

            position.Z = -Position.Z;
            //HMD視点位置変換行列に書き込む。
            Matrix4x4 t = Matrix4x4.CreateTranslation(position);
            Matrix4x4 r = Matrix4x4.CreateFromQuaternion(quaternion);
            Matrix4x4 s = Matrix4x4.CreateScale(Scale);

            Matrix4x4 m = s * r * t;
            //鏡像反転
            Vector3 Mirroring = new Vector3(MirrorX ? -1 : 1, MirrorY ? -1 : 1, 1);

            //4x4行列を3x4行列に変換する。
            p.m0 = Mirroring.X * m.M11; p.m1 = Mirroring.Y * m.M21; p.m2 = Mirroring.Z * m.M31; p.m3 = m.M41;
            p.m4 = Mirroring.X * m.M12; p.m5 = Mirroring.Y * m.M22; p.m6 = Mirroring.Z * m.M32; p.m7 = m.M42;
            p.m8 = Mirroring.X * m.M13; p.m9 = Mirroring.Y * m.M23; p.m10 = Mirroring.Z * m.M33; p.m11 = m.M43;


            //回転行列を元に相対位置で表示
            if (DeviceTracking)
            {
                //deviceindexを処理(コントローラーなどはその時その時で変わるため)
                var idx = OpenVR.k_unTrackedDeviceIndex_Hmd;
                switch (DeviceIndex)
                {
                case TrackingDeviceSelect.LeftController:
                    idx = openvr.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
                    break;

                case TrackingDeviceSelect.RightController:
                    idx = openvr.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.RightHand);
                    break;

                default:
                    idx = (uint)DeviceIndex;
                    break;
                }

                //HMDからの相対的な位置にオーバーレイを表示する。
                overlay.SetOverlayTransformTrackedDeviceRelative(overlayHandle, idx, ref p);
            }
            else
            {
                //空間の絶対位置にオーバーレイを表示する
                if (!Seated)
                {
                    overlay.SetOverlayTransformAbsolute(overlayHandle, ETrackingUniverseOrigin.TrackingUniverseStanding, ref p);
                }
                else
                {
                    overlay.SetOverlayTransformAbsolute(overlayHandle, ETrackingUniverseOrigin.TrackingUniverseSeated, ref p);
                }
            }
        }
Exemple #2
0
        public static bool SetOverlayTransform(string key, ref Matrix posMatrix, uint?controllerId, float width)
        {
            Debug.Assert(m_cvrOverlay != null);
            ulong handle = OpenVR.k_ulOverlayHandleInvalid;
            var   oError = m_cvrOverlay.FindOverlay(key, ref handle);

            if (oError != EVROverlayError.None)
            {
                Debug.Fail("Overlay does not exist " + oError.ToString());
                return(false);
            }
            HmdMatrix34_t hmdMatrix = new HmdMatrix34_t();

            MatrixToHmdMatrix34(ref posMatrix, ref hmdMatrix);

            if (controllerId == null)
            {
                oError = m_cvrOverlay.SetOverlayTransformAbsolute(handle, ETrackingUniverseOrigin.TrackingUniverseStanding, ref hmdMatrix);
            }
            else
            {
                oError = m_cvrOverlay.SetOverlayTransformTrackedDeviceRelative(handle, (uint)controllerId, ref hmdMatrix);
            }
            if (oError != EVROverlayError.None)
            {
                Debug.Fail("Overlay set transform failed " + oError.ToString());
                return(false);
            }

            oError = m_cvrOverlay.SetOverlayWidthInMeters(handle, width);
            if (oError != EVROverlayError.None)
            {
                Debug.Fail("Overlay set width failed " + oError.ToString());
                return(false);
            }
            return(true);
        }
Exemple #3
0
        private static EVROverlayError ProcessOverlay2(CVROverlay overlay, ref ulong overlayHandle, ref bool overlayVisible, bool dashboardVisible)
        {
            var err = EVROverlayError.None;

            if (overlayHandle == 0)
            {
                err = overlay.FindOverlay("VRCX2", ref overlayHandle);
                if (err != EVROverlayError.None)
                {
                    if (err != EVROverlayError.UnknownOverlay)
                    {
                        return(err);
                    }
                    overlayVisible = false;
                    err            = overlay.CreateOverlay("VRCX2", "VRCX2", ref overlayHandle);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                    err = overlay.SetOverlayAlpha(overlayHandle, 0.9f);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                    err = overlay.SetOverlayWidthInMeters(overlayHandle, 1f);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                    err = overlay.SetOverlayInputMethod(overlayHandle, VROverlayInputMethod.None);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                    var m = Matrix.Scaling(1f);
                    m *= Matrix.Translation(0, -0.3f, -1.5f);
                    var hm34 = new HmdMatrix34_t
                    {
                        m0  = m.M11,
                        m1  = m.M21,
                        m2  = m.M31,
                        m3  = m.M41,
                        m4  = m.M12,
                        m5  = m.M22,
                        m6  = m.M32,
                        m7  = m.M42,
                        m8  = m.M13,
                        m9  = m.M23,
                        m10 = m.M33,
                        m11 = m.M43,
                    };
                    err = overlay.SetOverlayTransformTrackedDeviceRelative(overlayHandle, OpenVR.k_unTrackedDeviceIndex_Hmd, ref hm34);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                }
            }

            if (!dashboardVisible)
            {
                var texture = new Texture_t
                {
                    handle = m_Texture2.NativePointer
                };
                err = overlay.SetOverlayTexture(overlayHandle, ref texture);
                if (err != EVROverlayError.None)
                {
                    return(err);
                }
                if (!overlayVisible)
                {
                    err = overlay.ShowOverlay(overlayHandle);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                    overlayVisible = true;
                }
            }
            else if (overlayVisible)
            {
                err = overlay.HideOverlay(overlayHandle);
                if (err != EVROverlayError.None)
                {
                    return(err);
                }
                overlayVisible = false;
            }

            return(err);
        }
Exemple #4
0
        private static EVROverlayError ProcessOverlay1(CVROverlay overlay, ref ulong overlayHandle, ref bool overlayVisible, bool dashboardVisible, uint overlayIndex, DateTime nextOverlay)
        {
            var err = EVROverlayError.None;

            if (overlayHandle == 0)
            {
                err = overlay.FindOverlay("VRCX1", ref overlayHandle);
                if (err != EVROverlayError.None)
                {
                    if (err != EVROverlayError.UnknownOverlay)
                    {
                        return(err);
                    }
                    overlayVisible = false;
                    err            = overlay.CreateOverlay("VRCX1", "VRCX1", ref overlayHandle);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                    err = overlay.SetOverlayAlpha(overlayHandle, 0.9f);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                    err = overlay.SetOverlayWidthInMeters(overlayHandle, 1f);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                    err = overlay.SetOverlayInputMethod(overlayHandle, VROverlayInputMethod.None);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                }
            }

            if (overlayIndex != OpenVR.k_unTrackedDeviceIndexInvalid)
            {
                // http://www.opengl-tutorial.org/beginners-tutorials/tutorial-3-matrices
                // Scaling-Rotation-Translation
                var m = Matrix.Scaling(0.25f);
                m *= Matrix.RotationX(m_Rotation[0]);
                m *= Matrix.RotationY(m_Rotation[1]);
                m *= Matrix.RotationZ(m_Rotation[2]);
                m *= Matrix.Translation(m_Translation[0], m_Translation[1], m_Translation[2]);
                var hm34 = new HmdMatrix34_t
                {
                    m0  = m.M11,
                    m1  = m.M21,
                    m2  = m.M31,
                    m3  = m.M41,
                    m4  = m.M12,
                    m5  = m.M22,
                    m6  = m.M32,
                    m7  = m.M42,
                    m8  = m.M13,
                    m9  = m.M23,
                    m10 = m.M33,
                    m11 = m.M43,
                };
                err = overlay.SetOverlayTransformTrackedDeviceRelative(overlayHandle, overlayIndex, ref hm34);
                if (err != EVROverlayError.None)
                {
                    return(err);
                }
            }

            if (!dashboardVisible &&
                DateTime.UtcNow.CompareTo(nextOverlay) <= 0)
            {
                var texture = new Texture_t
                {
                    handle = m_Texture1.NativePointer
                };
                err = overlay.SetOverlayTexture(overlayHandle, ref texture);
                if (err != EVROverlayError.None)
                {
                    return(err);
                }
                if (!overlayVisible)
                {
                    err = overlay.ShowOverlay(overlayHandle);
                    if (err != EVROverlayError.None)
                    {
                        return(err);
                    }
                    overlayVisible = true;
                }
            }
            else if (overlayVisible)
            {
                err = overlay.HideOverlay(overlayHandle);
                if (err != EVROverlayError.None)
                {
                    return(err);
                }
                overlayVisible = false;
            }

            return(err);
        }
Exemple #5
0
    //位置情報を更新
    private void updatePosition()
    {
#pragma warning disable 0219
        string Tag = "[" + this.GetType().Name + ":" + System.Reflection.MethodBase.GetCurrentMethod(); //クラス名とメソッド名を自動取得
#pragma warning restore 0219

        //RenderTextureが生成されているかチェック
        if (!renderTexture.IsCreated())
        {
            Debug.Log(Tag + "RenderTextureがまだ生成されていない");
            return;
        }

        //回転を生成
        Quaternion quaternion = Quaternion.Euler(Rotation.x, Rotation.y, Rotation.z);
        //座標系を変更(右手系と左手系の入れ替え)
        Vector3 position = Position;
        position.z = -Position.z;
        //HMD視点位置変換行列に書き込む。
        Matrix4x4 m = Matrix4x4.TRS(position, quaternion, Scale);

        //鏡像反転
        Vector3 Mirroring = new Vector3(MirrorX ? -1 : 1, MirrorY ? -1 : 1, 1);

        //4x4行列を3x4行列に変換する。
        p.m0  = Mirroring.x * m.m00;
        p.m1  = Mirroring.y * m.m01;
        p.m2  = Mirroring.z * m.m02;
        p.m3  = m.m03;
        p.m4  = Mirroring.x * m.m10;
        p.m5  = Mirroring.y * m.m11;
        p.m6  = Mirroring.z * m.m12;
        p.m7  = m.m13;
        p.m8  = Mirroring.x * m.m20;
        p.m9  = Mirroring.y * m.m21;
        p.m10 = Mirroring.z * m.m22;
        p.m11 = m.m23;

        //回転行列を元に相対位置で表示
        if (DeviceTracking)
        {
            //deviceindexを処理(コントローラーなどはその時その時で変わるため)
            var idx = OpenVR.k_unTrackedDeviceIndex_Hmd;
            switch (DeviceIndex)
            {
            case TrackingDeviceSelect.LeftController:
                idx = openvr.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.LeftHand);
                break;

            case TrackingDeviceSelect.RightController:
                idx = openvr.GetTrackedDeviceIndexForControllerRole(ETrackedControllerRole.RightHand);
                break;

            default:
                idx = (uint)DeviceIndex;
                break;
            }
            //device情報に変化があったらInspectorに反映
            if (DeviceIndexOld != (int)idx)
            {
                Debug.Log(Tag + "Device Updated");
                UpdateDeviceInfo(idx);
                DeviceIndexOld = (int)idx;
            }

            //HMDからの相対的な位置にオーバーレイを表示する。
            overlay.SetOverlayTransformTrackedDeviceRelative(overlayHandle, idx, ref p);
        }
        else
        {
            //空間の絶対位置にオーバーレイを表示する
            if (!Seated)
            {
                overlay.SetOverlayTransformAbsolute(overlayHandle, ETrackingUniverseOrigin.TrackingUniverseStanding, ref p);
            }
            else
            {
                overlay.SetOverlayTransformAbsolute(overlayHandle, ETrackingUniverseOrigin.TrackingUniverseSeated, ref p);
            }
        }

        if (ResetSeatedCamera)
        {
            OpenVR.System.ResetSeatedZeroPose();
            ResetSeatedCamera = false;
        }

        //オーバーレイの大きさ設定(幅のみ。高さはテクスチャの比から自動計算される)
        overlay.SetOverlayWidthInMeters(overlayHandle, width);

        //オーバーレイの透明度を設定
        overlay.SetOverlayAlpha(overlayHandle, alpha);

        //マウスカーソルスケールを設定する(これにより表示領域のサイズも決定される)
        try
        {
            HmdVector2_t vecMouseScale = new HmdVector2_t
            {
                v0 = renderTexture.width,
                v1 = renderTexture.height
            };
            overlay.SetOverlayMouseScale(overlayHandle, ref vecMouseScale);
        }
        catch (UnassignedReferenceException e)
        {
            Debug.LogError(Tag + "RenderTextureがセットされていません " + e.ToString());
            ProcessError();
            return;
        }
    }
Exemple #6
0
        private bool StartupOVR()
        {
            EVRInitError error = EVRInitError.Driver_Failed;

            vr = OpenVR.Init(ref error, EVRApplicationType.VRApplication_Overlay);

            if (error != EVRInitError.None)
            {
                Debug.WriteLine("OpenVR Init Error: " + error.ToString());
                return(false);
            }

            overlay = OpenVR.Overlay;

            EVROverlayError overlayError = overlay.CreateOverlay("Jstf_ovr_cards", "OpenVR Cards System Overlay", ref overlayHandle);

            if (overlayError != EVROverlayError.None)
            {
                OpenVR.Shutdown();
                Debug.WriteLine("OpenVR Overlay Error: " + overlayError.ToString());
                return(false);
            }

            /*overlayError = overlay.SetOverlayFromFile(overlayHandle, AssetsPath + "overlay.png");
             * if (overlayError != EVROverlayError.None)
             * {
             *      CleanupOVR();
             *      Debug.WriteLine("OpenVR Overlay Error: " + overlayError.ToString());
             *      return false;
             * }*/

            overlayError = overlay.SetOverlayInputMethod(overlayHandle, VROverlayInputMethod.Mouse);
            if (overlayError != EVROverlayError.None)
            {
                CleanupOVR();
                Debug.WriteLine("OpenVR Overlay Error: " + overlayError.ToString());
                return(false);
            }

            overlayTexture = new Texture_t
            {
                eType       = ETextureType.OpenGL,
                eColorSpace = EColorSpace.Auto,
                handle      = (IntPtr)textureId
            };

            overlayError = overlay.SetOverlayTexture(overlayHandle, ref overlayTexture);
            if (overlayError != EVROverlayError.None)
            {
                CleanupOVR();
                Debug.WriteLine("OpenVR Overlay Error: " + overlayError.ToString());
                return(false);
            }

            HmdId = OpenVR.k_unTrackedDeviceIndex_Hmd;

            for (uint i = HmdId + 1; i < OpenVR.k_unMaxTrackedDeviceCount; i++)
            {
                if (vr.IsTrackedDeviceConnected(i))
                {
                    ETrackedDeviceClass cls = vr.GetTrackedDeviceClass(i);
                    if (cls == ETrackedDeviceClass.Controller)
                    {
                        ETrackedControllerRole rl = vr.GetControllerRoleForTrackedDeviceIndex(i);
                        if (rl == ETrackedControllerRole.LeftHand)
                        {
                            LeftControllerId = i;
                            Debug.WriteLine("Found Left Controller");
                        }
                        else if (rl == ETrackedControllerRole.RightHand)
                        {
                            RightControllerId = i;
                            Debug.WriteLine("Found Right Controller");
                        }
                    }
                }
            }

            mat = new HmdMatrix34_t
            {
                m0  = 1,
                m1  = 0,
                m2  = 0,
                m3  = 0f,
                m4  = 0,
                m5  = 1,
                m6  = 0,
                m7  = 0.1f,
                m8  = 0,
                m9  = 0,
                m10 = 1,
                m11 = 0f
            };



            overlayError = overlay.SetOverlayTransformTrackedDeviceRelative(overlayHandle, RightControllerId, ref mat);
            if (overlayError != EVROverlayError.None)
            {
                Debug.WriteLine("Cannot bind overlay to Tracked device.");
                Debug.WriteLine("Error: " + overlayError.ToString());
                CleanupOVR();
                return(false);
            }
            overlayError = overlay.SetOverlayWidthInMeters(overlayHandle, 0.2f);
            if (overlayError != EVROverlayError.None)
            {
                Debug.WriteLine("Cannot set overlay size.");
                Debug.WriteLine("Error: " + overlayError.ToString());
                CleanupOVR();
                return(false);
            }

            overlayError = overlay.SetOverlayAlpha(overlayHandle, 1);
            if (overlayError != EVROverlayError.None)
            {
                Debug.WriteLine("Cannot set overlay alpha.");
                Debug.WriteLine("Error: " + overlayError.ToString());
                CleanupOVR();
                return(false);
            }

            overlayError = overlay.SetOverlayColor(overlayHandle, 1, 1, 1);
            if (overlayError != EVROverlayError.None)
            {
                Debug.WriteLine("Cannot set overlay color.");
                Debug.WriteLine("Error: " + overlayError.ToString());
                CleanupOVR();
                return(false);
            }
#if DEBUG
            Debug.WriteLine("OpenVR Startup Complete");
#endif
            return(true);
        }
    private void Update()
    {
#pragma warning disable 0219
        string Tag = "[" + this.GetType().Name + ":" + System.Reflection.MethodBase.GetCurrentMethod(); //クラス名とメソッド名を自動取得
#pragma warning restore 0219

        //エラーが発生した場合や、ハンドルが無効な場合は実行しない
        if (IsError())
        {
            return;
        }


        //イベントを処理する(終了された時true)
        if (ProcessEvent())
        {
            Debug.Log(Tag + "VRシステムが終了されました");
            ApplicationQuit();
        }

        //サイドバイサイド3D
        overlay.SetOverlayFlag(overlayHandle, VROverlayFlags.SideBySide_Parallel, true);
        overlay.ShowOverlay(overlayHandle);


        //オーバーレイが表示されている時
        if (overlay.IsOverlayVisible(overlayHandle))
        {
            if (overlay.IsOverlayVisible(overlayHandle))
            {
                //widthをセット インスペクタからいじれる
                overlay.SetOverlayWidthInMeters(overlayHandle, width);

                //HMD視点位置変換行列に書き込む。
                //ここでは回転なし、平行移動ありのHUD的な状態にしている。
                var wx = -0f;
                var wy = -0f;
                var wz = -overlayScreenDepth;

                p.m0 = 1; p.m1 = 0; p.m2 = 0; p.m3 = wx;
                p.m4 = 0; p.m5 = 1; p.m6 = 0; p.m7 = wy;
                p.m8 = 0; p.m9 = 0; p.m10 = 1; p.m11 = wz;

                //回転行列を元に、HMDからの相対的な位置にオーバーレイを表示する。
                //代わりにSetOverlayTransformAbsoluteを使用すると、ルーム空間に固定することができる
                uint indexunTrackedDevice = 0;//0=HMD(他にControllerやTrackerにすることもできる)
                overlay.SetOverlayTransformTrackedDeviceRelative(overlayHandle, indexunTrackedDevice, ref p);

                //RenderTextureが生成されているかチェック
                if (!renderTexture.IsCreated())
                {
                    Debug.Log(Tag + "RenderTextureがまだ生成されていない");
                    return;
                }

                //RenderTextureからネイティブテクスチャのハンドルを取得
                try
                {
                    overlayTexture.handle = renderTexture.GetNativeTexturePtr();
                }
                catch (UnassignedReferenceException e)
                {
                    Debug.LogError(Tag + "RenderTextureがセットされていません");
                    ApplicationQuit();
                    return;
                }

                //オーバーレイにテクスチャを設定
                var overlayError = EVROverlayError.None;
                overlayError = overlay.SetOverlayTexture(overlayHandle, ref overlayTexture);
                if (overlayError != EVROverlayError.None)
                {
                    Debug.LogError(Tag + "Overlayにテクスチャをセットできませんでした. " + overlayError.ToString());
                    ApplicationQuit();
                    return;
                }
            }
        }
    }
Exemple #8
0
    void Update()
    {
        //初期化失敗するなどoverlayが無効な場合は実行しない
        if (overlay == null)
        {
            return;
        }

        //オーバーレイを表示する
        overlay.ShowOverlay(overlayHandle);

        //オーバーレイを非表示にする
        //overlay.HideOverlay(overlayHandle);

        //オーバーレイが表示されている時
        if (overlay.IsOverlayVisible(overlayHandle))
        {
            //HMD視点位置変換行列に書き込む。
            //ここでは回転なし、平行移動ありのHUD的な状態にしている。
            var wx = -0f;
            var wy = -0f;
            var wz = -10f;

            pose.m0 = 1; pose.m1 = 0; pose.m2 = 0; pose.m3 = wx;
            pose.m4 = 0; pose.m5 = textureYflip; pose.m6 = 0; pose.m7 = wy;
            pose.m8 = 0; pose.m9 = 0; pose.m10 = 1; pose.m11 = wz;

            //回転行列を元に、HMDからの相対的な位置にオーバーレイを表示する。
            //代わりにSetOverlayTransformAbsoluteを使用すると、ルーム空間に固定することができる
            uint indexunTrackedDevice = 0;            //0=HMD(他にControllerやTrackerにすることもできる)
            overlay.SetOverlayTransformTrackedDeviceRelative(overlayHandle, indexunTrackedDevice, ref pose);

            //RenderTextureが生成されているかチェック
            if (!renderTexture.IsCreated())
            {
                Debug.Log(Tag + "RenderTextureがまだ生成されていない");
                return;
            }

            //RenderTextureからネイティブテクスチャのハンドルを取得
            try
            {
                overlayTexture.handle = renderTexture.GetNativeTexturePtr();
            }
            catch (UnassignedReferenceException e)
            {
                Debug.LogError(Tag + "RenderTextureがセットされていません");
                ApplicationQuit();
                return;
            }

            //オーバーレイにテクスチャを設定
            var overlayError = EVROverlayError.None;
            overlayError = overlay.SetOverlayTexture(overlayHandle, ref overlayTexture);
            if (overlayError != EVROverlayError.None)
            {
                Debug.LogError(Tag + "Overlayにテクスチャをセットできませんでした. " + overlayError.ToString());
                ApplicationQuit();
                return;
            }
        }
    }