- Home /
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?
Answer by Joshua 3 · Oct 25, 2010 at 08:02 PM
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?
Answer by BjornVTI · Oct 31, 2012 at 01:19 PM
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: http://docs.unity3d.com/Documentation/ScriptReference/Camera-projectionMatrix.html
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;
}
}
Your answer
![](https://koobas.hobune.stream/wayback/20220612234244im_/https://answers.unity.com/themes/thub/images/avi.jpg)
Follow this Question
Related Questions
Orthographic position to Perspective position 0 Answers
How to do perspective camera zoom? 1 Answer
Sphere turns oval at edge of viewport 1 Answer