public ReflectorOptics(Vector3 pupilPosition, EllipsoidTransform ellipse, Transform Screen, Vector4 projectionParameters, Pose?headsetOrigin = null, Quaternion?optionalPupilRotation = null, bool updateEllipsoid = true) { eyePosition = pupilPosition; bool didEllipsoidActuallyUpdate = false; if (updateEllipsoid) { didEllipsoidActuallyUpdate = ellipse.UpdateEllipsoid(); } sphereToWorldSpace = ellipse.sphereToWorldSpace; ellipseMajorAxis = ellipse.MajorAxis; ellipseMinorAxis = ellipse.MinorAxis; screenForward = Screen.forward; screenPosition = Screen.position; worldToScreenSpace = Screen.worldToLocalMatrix; cameraProjection = projectionParameters; eyeRotation = Quaternion.identity; if (optionalPupilRotation.HasValue) { var pupilRotation = optionalPupilRotation.Value; if (optionalPupilRotation == default(Quaternion)) { optionalPupilRotation = Quaternion.identity; } eyeRotation = pupilRotation; } if (headsetOrigin.HasValue) { // If debugging this, helps to draw matrices with: // var drawer = HyperMegaStuff.HyperMegaLines.drawer; // (new Geometry.Sphere(radius)).DrawLines( // drawer.DrawLine, // overrideMatrix: aLocalToWorldMatrix); var headsetWorldToLocal = headsetOrigin.Value.inverse.matrix; eyePosition = headsetWorldToLocal.MultiplyPoint3x4(eyePosition); eyeRotation = OpticalCalibrationManager.LossyMatrixMultQuaternion( headsetWorldToLocal, eyeRotation ); screenForward = headsetWorldToLocal.MultiplyVector(Screen.forward) .normalized; screenPosition = headsetWorldToLocal.MultiplyPoint3x4(Screen.position); worldToScreenSpace = (headsetWorldToLocal * Screen.localToWorldMatrix) .inverse; if (didEllipsoidActuallyUpdate) { sphereToWorldSpace = headsetWorldToLocal * sphereToWorldSpace; } } }
public void RefreshIPD() { if (!isConfigured) { return; } Vector3 lPos = leftEyeIPDTransform.localPosition; Vector3 rPos = rightEyeIPDTransform.localPosition; lPos.x = -ipd / 2f; rPos.x = ipd / 2f; lPos.y = heightOffset; rPos.y = heightOffset; lPos.z = depthOffset; rPos.z = depthOffset; leftEyeIPDTransform.localPosition = lPos; rightEyeIPDTransform.localPosition = rPos; leapTransform.localEulerAngles = new Vector3(pitchOffset, yawOffset, 0f); //if (Application.isPlaying) { // leftScreenTransform.localPosition = startingScreenLeft + (leftScreenTransform.localRotation * Vector3.forward) * screenForwardOffset; // rightScreenTransform.localPosition = startingScreenRight + (rightScreenTransform.localRotation * Vector3.forward) * screenForwardOffset; //} OpticalCalibrationManager manager = GetComponent <OpticalCalibrationManager>(); if (manager != null) { manager.currentCalibration.leftEye.eyePosition = lPos; manager.currentCalibration.rightEye.eyePosition = rPos; manager.UpdateCalibrationFromObjects(); } leftEyeARRaytracer.ScheduleCreateDistortionMesh(); rightEyeARRaytracer.ScheduleCreateDistortionMesh(); }