Set a custom projection matrix.
If you change this matrix, the camera no longer updates its rendering based on its fieldOfView.
This lasts until you call ResetProjectionMatrix.
Use a custom projection only if you really need a non-standard projection.
This property is used by Unity's water rendering to setup an
oblique projection matrix. Using custom projections requires good knowledge
of transformation and projection matrices.
@script ExecuteInEditModevar left :
float = -0.2;
var right :
float = 0.2;
var top :
float = 0.2;
var bottom :
float = -0.2;
function LateUpdate () {
var cam : Camera = camera;
var m :
Matrix4x4 = PerspectiveOffCenter(
left, right, bottom, top,
cam.nearClipPlane, cam.farClipPlane );
cam.projectionMatrix = m;
}
static function PerspectiveOffCenter(
left :
float, right :
float,
bottom :
float, top :
float,
near :
float, far :
float ) :
Matrix4x4{
var x :
float = (2.0 * near) / (right - left);
var y :
float = (2.0 * near) / (top - bottom);
var a :
float = (right + left) / (right - left);
var b :
float = (top + bottom) / (top - bottom);
var c :
float = -(far + near) / (far - near);
var d :
float = -(2.0 * far * near) / (far - near);
var e :
float = -1.0;
var m :
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;
}
using UnityEngine;
using System.Collections;
[
ExecuteInEditMode]
public class example :
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;
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;
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;
}
}
import UnityEngine
import System.Collections
[
ExecuteInEditMode]
class example(
MonoBehaviour):
public left as single = (-0.2F)
public right as single = 0.2F
public top as single = 0.2F
public bottom as single = (-0.2F)
def
LateUpdate():
cam as Camera = camera
m as
Matrix4x4 = PerspectiveOffCenter(left, right, bottom, top, cam.nearClipPlane, cam.farClipPlane)
cam.projectionMatrix = m
static def PerspectiveOffCenter(left as single, right as single, bottom as single, top as single, near as single, far as single) as
Matrix4x4:
x as single = ((2.0F * near) / (right - left))
y as single = ((2.0F * near) / (top - bottom))
a as single = ((right + left) / (right - left))
b as single = ((top + bottom) / (top - bottom))
c as single = ((-(far + near)) / (far - near))
d as single = ((-((2.0F * far) * near)) / (far - near))
e as single = (-1.0F)
m as
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