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); } } }
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); }
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); }
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); }
//位置情報を更新 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; } }
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; } } } }
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; } } }