示例#1
0
        /*________*/
        /*|   A  |*/
        /*|  /\  |*/
        /*| /  \ |*/
        /*|C----B|*/
        /*|______|*/


        // There is no use for current algorithm because orthogonal projection should be cubic
        public void Update()
        {
            float ShadowFarPlane  = 300.0f;
            float ShadowNearPlane = 30.0f;
            float FoV             = EngineStatics.FoV;
            float halfFoV         = FoV * 0.5f;
            float AspectRatio     = EngineStatics.SCREEN_ASPECT_RATIO;

            Vector3 camWorldPosition = m_camera.GetEyeVector();
            Vector3 camForward       = m_camera.GetEyeSpaceForwardVector();
            Vector3 camRight         = m_camera.GetEyeSpaceRightVector();

            // Omit y component
            camForward = new Vector3(camForward.X, 0, camForward.Z).Normalized();
            camRight   = new Vector3(camRight.X, 0, camRight.Z).Normalized();

            Vector3 camFarPlaneWorldPosition = camWorldPosition + camForward * ShadowFarPlane;

            Vector3 camEdgeFarPlaneWorldPosition1 = camFarPlaneWorldPosition + camRight * ShadowFarPlane;
            Vector3 camEdgeFarPlaneWorldPosition2 = camFarPlaneWorldPosition - camRight * ShadowFarPlane;
            Vector3 camEdgeNearPlaneWorldPosition = camWorldPosition - camForward * ShadowNearPlane;

            //Matrix3 rotationPositive = Matrix3.CreateRotationY(MathHelper.DegreesToRadians(halfFoV));
            //Matrix3 rotationNegative = Matrix3.CreateRotationY(MathHelper.DegreesToRadians(-halfFoV));

            //Vector3 camEdgePlaneDirection1 = (VectorMath.VectorMathOperations.TransformVec3(ref camForward, ref rotationPositive)).Normalized();
            //Vector3 camEdgePlaneDirection2 = (VectorMath.VectorMathOperations.TransformVec3(ref camForward, ref rotationNegative)).Normalized();



            //float edge1ProjValue = Vector3.Dot(camEdgePlaneDirection1, camFarPlaneWorldPosition);
            //float edge2ProjValue = Vector3.Dot(camEdgePlaneDirection2, camFarPlaneWorldPosition);

            //Vector3 edgePosition1 = camWorldPosition + camEdgePlaneDirection1 * edge1ProjValue;
            //Vector3 edgePosition2 = camWorldPosition + camEdgePlaneDirection2 * edge2ProjValue;
            //Vector3 edgePosition3 = camWorldPosition - camForward * ShadowNearPlane;

            // TODO -> Find maxX, minX, maxZ, minZ

            float maxX = Math.Max(Math.Max(camEdgeFarPlaneWorldPosition1.X, camEdgeFarPlaneWorldPosition2.X), camEdgeNearPlaneWorldPosition.X);
            float maxZ = Math.Max(Math.Max(camEdgeFarPlaneWorldPosition1.Z, camEdgeFarPlaneWorldPosition2.Z), camEdgeNearPlaneWorldPosition.Z);

            float minX = Math.Min(Math.Min(camEdgeFarPlaneWorldPosition1.X, camEdgeFarPlaneWorldPosition2.X), camEdgeNearPlaneWorldPosition.X);
            float minZ = Math.Min(Math.Min(camEdgeFarPlaneWorldPosition1.Z, camEdgeFarPlaneWorldPosition2.Z), camEdgeNearPlaneWorldPosition.Z);

            Max = new Vector3(maxX, 0, maxZ);
            Min = new Vector3(minX, 0, minZ);
        }