Off centre projection matrix breaks cascaded shadows

I have an off centre projection matrix in my game but while it works if the offset is on the x axis if there is any y offset then cascaded shadows get offset in the opposite direction, and example can be seen in the picture, can anyone offer a solution to fix this? alt text

I have the same problem and I am using the PerspectiveOffCenter method found here http://unity3d.com/support/documentation/ScriptReference/Camera-projectionMatrix.html

Anyone have a solution?

I found a solution to this problem. You will need to calculate the aspect ratio and field of view before setting the new projection matrix.

Lets use the PerspectiveOffCenter example found here:

And extend it with code to calculate and set the aspect ratio and field of view:

using UnityEngine;
using System.Collections;

[ExecuteInEditMode]
public class OffProjection : MonoBehaviour {
    public float left = -0.2F;
    public float right = 0.2F;
    public float top = 0.2F;
    public float bottom = -0.2F;
	
    void LateUpdate() {
        Camera cam = camera;
		float width = (right - left);
        float height = (top - bottom);
		cam.aspect = width/height;
		float fov = (Mathf.Atan(top/cam.nearClipPlane) - Mathf.Atan(bottom/cam.nearClipPlane)) * 57.2957795f;
		cam.fieldOfView = fov;

		Matrix4x4 m = PerspectiveOffCenter(left, right, bottom, top, cam.nearClipPlane, cam.farClipPlane);
        cam.projectionMatrix = m;
    }
	
    static Matrix4x4 PerspectiveOffCenter(float left, float right, float bottom, float top, float near, float far) {
        float x = 2.0F * near / (right - left);
        float y = 2.0F * near / (top - bottom);
        float a = (right + left) / (right - left);
        float b = (top + bottom) / (top - bottom);
        float c = -(far + near) / (far - near);
        float d = -(2.0F * far * near) / (far - near);
        float e = -1.0F;
        Matrix4x4 m = new Matrix4x4();
        m[0, 0] = x;
        m[0, 1] = 0;
        m[0, 2] = a;
        m[0, 3] = 0;
        m[1, 0] = 0;
        m[1, 1] = y;
        m[1, 2] = b;
        m[1, 3] = 0;
        m[2, 0] = 0;
        m[2, 1] = 0;
        m[2, 2] = c;
        m[2, 3] = d;
        m[3, 0] = 0;
        m[3, 1] = 0;
        m[3, 2] = e;
        m[3, 3] = 0;
        return m;
    }
}