internal static void ApplyMirroredReferenceTransform( ref ProbeSettings settings, // In Parameter ref ProbeCapturePositionSettings probePosition, // In parameter ref CameraSettings cameraSettings, // InOut parameter ref CameraPositionSettings cameraPosition // InOut parameter ) { // Calculate mirror position and forward world space var proxyMatrix = Matrix4x4.TRS(probePosition.proxyPosition, probePosition.proxyRotation, Vector3.one); var mirrorPosition = proxyMatrix.MultiplyPoint(settings.proxySettings.mirrorPositionProxySpace); var mirrorForward = proxyMatrix.MultiplyVector(settings.proxySettings.mirrorRotationProxySpace * Vector3.forward); var reflectionMatrix = GeometryUtils.CalculateReflectionMatrix(mirrorPosition, mirrorForward); // If the camera is on the reflection plane, we offset it by 0.1 mm to avoid a degenerate case. if (Vector3.Dot(mirrorForward, probePosition.referencePosition - mirrorPosition) < 1e-4f) { probePosition.referencePosition += 1e-4f * mirrorForward; } var worldToCameraRHS = GeometryUtils.CalculateWorldToCameraMatrixRHS( probePosition.referencePosition, // TODO: The capture camera should look at a better direction to only capture texels that // will actually be sampled. // The position it should look at is the center of the visible influence volume of the probe. // (visible influence volume: the intersection of the frustum with the probe's influence volume). // But this is not trivial to get. // So currently, only look in the mirrored direction of the reference. This will capture // more pixels than we want with a lesser resolution, but still work for most cases. // Note: looking at the center of the influence volume don't work in all cases (see case 1157921) probePosition.referenceRotation ); cameraPosition.worldToCameraMatrix = worldToCameraRHS * reflectionMatrix; // We must invert the culling because we performed a plane reflection cameraSettings.invertFaceCulling = true; // Calculate capture position and rotation cameraPosition.position = reflectionMatrix.MultiplyPoint(probePosition.referencePosition); var forward = reflectionMatrix.MultiplyVector(probePosition.referenceRotation * Vector3.forward); var up = reflectionMatrix.MultiplyVector(probePosition.referenceRotation * Vector3.up); cameraPosition.rotation = Quaternion.LookRotation(forward, up); }
/// <summary>Compute the worldToCameraMatrix to use during rendering.</summary> /// <returns>The worldToCameraMatrix.</returns> public Matrix4x4 ComputeWorldToCameraMatrix() { return(GeometryUtils.CalculateWorldToCameraMatrixRHS(position, rotation)); }