public bool GetProjectionMatrix(ref EyeProjectMatrixData outEyesProjectionMatrix, float znear, float zfar) { NativeFov4f fov = new NativeFov4f(); NativeResult result_left = NativeApi.NRHMDGetEyeFov(m_HmdHandle, (int)NativeEye.LEFT, ref fov); outEyesProjectionMatrix.LEyeMatrix = ConversionUtility.GetProjectionMatrixFromFov(fov, znear, zfar).ToUnityMat4f(); NativeResult result_right = NativeApi.NRHMDGetEyeFov(m_HmdHandle, (int)NativeEye.RIGHT, ref fov); outEyesProjectionMatrix.REyeMatrix = ConversionUtility.GetProjectionMatrixFromFov(fov, znear, zfar).ToUnityMat4f(); NativeResult result_RGB = NativeApi.NRHMDGetEyeFov(m_HmdHandle, (int)NativeEye.RGB, ref fov); outEyesProjectionMatrix.RGBEyeMatrix = ConversionUtility.GetProjectionMatrixFromFov(fov, znear, zfar).ToUnityMat4f(); return(result_left == NativeResult.Success && result_right == NativeResult.Success && result_RGB == NativeResult.Success); }
public static NativeMat4f GetProjectionMatrixFromFov(NativeFov4f fov, float z_near, float z_far) { NativeMat4f pm = NativeMat4f.identity; float l = -fov.left_tan; float r = fov.right_tan; float t = fov.top_tan; float b = -fov.bottom_tan; pm.column0.X = 2f / (r - l); pm.column1.Y = 2f / (t - b); pm.column2.X = (r + l) / (r - l); pm.column2.Y = (t + b) / (t - b); pm.column2.Z = (z_near + z_far) / (z_near - z_far); pm.column2.W = -1f; pm.column3.Z = (2 * z_near * z_far) / (z_near - z_far); pm.column3.W = 0f; return(pm); }
public static extern NativeResult NRHMDGetEyeFov(UInt64 hmd_handle, int eye, ref NativeFov4f out_eye_fov);