public Vector3 GetHMDPosition(VarjoPlugin.PoseType type) { VarjoPlugin.Matrix matrix; GetPose(type, out matrix); var unityView = VarjoMatrixUtils.WorldMatrixToUnity(matrix.value); return(unityView.GetColumn(3)); }
public Quaternion GetHMDOrientation(VarjoPlugin.PoseType type) { VarjoPlugin.Matrix matrix; GetPose(type, out matrix); var unityView = VarjoMatrixUtils.WorldMatrixToUnity(matrix.value); return(Quaternion.LookRotation(unityView.GetColumn(2), unityView.GetColumn(1))); }
public void UpdateFromManager() { if (!VarjoPlugin.SessionValid) { return; } if (varjoCamera != null && !blitCBInjected) { // Hook up blit to screen cameraBlitCB = new CommandBuffer(); cameraBlitCB.name = "Varjo Layer blit to screen"; if (flipY) { cameraBlitCB.Blit(GetRenderTextureForCamera(VarjoViewCamera.CAMERA_ID.CONTEXT_LEFT), BuiltinRenderTextureType.CameraTarget, new Vector2(contextDisplayFactor, contextDisplayFactor), new Vector2(0.0f, 1.0f - contextDisplayFactor)); } else { cameraBlitCB.Blit(GetRenderTextureForCamera(VarjoViewCamera.CAMERA_ID.CONTEXT_LEFT), BuiltinRenderTextureType.CameraTarget, new Vector2(contextDisplayFactor, -1.0f * contextDisplayFactor), new Vector2(0.0f, contextDisplayFactor)); } varjoCamera.AddCommandBuffer(CameraEvent.AfterImageEffects, cameraBlitCB); blitCBInjected = true; } if (!faceLocked) { VarjoPlugin.Matrix matrix; Profiler.BeginSample("Varjo.GetFramePose"); VarjoManager.Instance.GetPose(VarjoPlugin.PoseType.CENTER, out matrix); Profiler.EndSample(); var worldMatrix = VarjoMatrixUtils.WorldMatrixToUnity(matrix.value); HeadTransform.localPosition = worldMatrix.GetColumn(3); HeadTransform.localRotation = Quaternion.LookRotation(worldMatrix.GetColumn(2), worldMatrix.GetColumn(1)); } foreach (var cam in viewportCameras) { cam.UpdateFromLayer(); } }
public void UpdateFromLayer() { VerifyCamera(); VarjoPlugin.PoseType pose = (CameraId == CAMERA_ID.CONTEXT_LEFT || CameraId == CAMERA_ID.FOCUS_LEFT) ? VarjoPlugin.PoseType.LEFT_EYE : VarjoPlugin.PoseType.RIGHT_EYE; VarjoPlugin.Matrix centerPoseVRJ, eyePoseVRJ; VarjoManager.Instance.GetPose(VarjoPlugin.PoseType.CENTER, out centerPoseVRJ); VarjoManager.Instance.GetPose(pose, out eyePoseVRJ); var centerPose = VarjoMatrixUtils.WorldMatrixToUnity(centerPoseVRJ.value); var eyePose = VarjoMatrixUtils.WorldMatrixToUnity(eyePoseVRJ.value); var centerPoseInv = centerPose.inverse; var worldMatrix = centerPoseInv * eyePose; // TODO: for the first few frames we can receive invalid data which causes annoying debug log output. // Let's just do a quick and dirty validation and skip the buffer info if the data doesn't seem to be correct. for (int i = 0; i < 16; i++) { if (float.IsNaN(worldMatrix[i])) { Debug.Log("Received invalid data."); return; } } transform.localPosition = worldMatrix.GetColumn(3); transform.localRotation = Quaternion.LookRotation(worldMatrix.GetColumn(2), worldMatrix.GetColumn(1)); var viewInfo = VarjoManager.Instance.GetViewInfo((int)CameraId); viewInfo.projectionMatrix.CopyTo(m_SubmissionProjMatrix, 0); viewInfo.invViewMatrix.CopyTo(m_SubmissionViewMatrix, 0); // Plug the near and far clip values to the submission projection matrix as well, for depth reconstruction float near = cam.nearClipPlane; float far = cam.farClipPlane; m_SubmissionProjMatrix[2 * 4 + 2] = -far / (near - far) - 1; m_SubmissionProjMatrix[3 * 4 + 2] = -(far * near) / (near - far); cam.usePhysicalProperties = true; var projMat = VarjoMatrixUtils.ProjectionMatrixToUnity(viewInfo.projectionMatrix, near, far); float aspect = projMat.m11 / projMat.m00; cam.sensorSize = new Vector2(cam.sensorSize.x, cam.sensorSize.x / aspect); // Calculate FOV and shift float t = projMat.m11; const float Rad2Deg = 180.0f / (float)Math.PI; float fov = ((float)Math.Atan(1.0f / t)) * 2.0f * Rad2Deg; if (m_Owner.flipY) { projMat.m12 *= -1.0f; } float lensX = projMat.m02 / 2.0f; float lensY = projMat.m12 / 2.0f; cam.fieldOfView = fov; cam.lensShift = new Vector2(lensX, lensY); #if UNITY_2018_3_OR_NEWER cam.gateFit = Camera.GateFitMode.None; #else // Pre-2018.3, we couldn't get exact 1:1 match with the projection matrix by tweaking camera parameters, so override the matrix directly cam.projectionMatrix = projMat; #endif if (m_Owner.useOcclusionMesh && (m_OcclusionMesh != null)) { // Draw the occlusion mesh; move it to the camera near plane so that it won't get frustum culled. Matrix4x4 occMeshMtx = new Matrix4x4(); occMeshMtx.SetTRS(new Vector3(0.0f, 0.0f, cam.nearClipPlane), Quaternion.identity, Vector3.one); occMeshMtx = transform.localToWorldMatrix * occMeshMtx; Graphics.DrawMesh(m_OcclusionMesh, occMeshMtx, m_Owner.occlusionMaterial, 0, cam); } }