示例#1
0
        private void UpdateReflectionCamera(Camera realCamera)
        {
            if (_reflectionCamera == null)
            {
                _reflectionCamera = InitializeReflectionCamera();
            }

            Vector3 pos    = Vector3.zero;
            Vector3 normal = Vector3.up;

            if (reflectionTarget != null)
            {
                pos    = reflectionTarget.transform.position + Vector3.up * reflectionPlaneOffset;
                normal = reflectionTarget.transform.up;
            }

            UpdateCamera(realCamera, _reflectionCamera);
            _reflectionCamera.gameObject.hideFlags = (hideReflectionCamera) ? HideFlags.HideAndDontSave : HideFlags.DontSave;
#if UNITY_EDITOR
            EditorApplication.DirtyHierarchyWindowSorting();
#endif

            var d = -Vector3.Dot(normal, pos);
            var reflectionPlane = new Vector4(normal.x, normal.y, normal.z, d);

            var reflection = Matrix4x4.identity;
            reflection *= Matrix4x4.Scale(new Vector3(1, -1, 1));

            PlanarReflections.CalculateReflectionMatrix(ref reflection, reflectionPlane);
            var oldPosition = realCamera.transform.position - new Vector3(0, pos.y * 2, 0);
            var newPosition = PlanarReflections.ReflectPosition(oldPosition);
            _reflectionCamera.transform.forward   = Vector3.Scale(realCamera.transform.forward, new Vector3(1, -1, 1));
            _reflectionCamera.worldToCameraMatrix = realCamera.worldToCameraMatrix * reflection;

            var clipPlane  = CameraSpacePlane(_reflectionCamera, pos - Vector3.up * 0.1f, normal, 1.0f);
            var projection = realCamera.CalculateObliqueMatrix(clipPlane);
            _reflectionCamera.projectionMatrix   = projection;
            _reflectionCamera.cullingMask        = reflectionLayer;
            _reflectionCamera.transform.position = newPosition;
        }