|
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.
// Make camera wobble in a funky way!
var originalProjection : Matrix4x4;
originalProjection = camera.projectionMatrix;
function Update () {
var p : Matrix4x4 = originalProjection;
// change some values from the original matrix
p.m01 += Mathf.Sin (Time.time * 1.2) * 0.1;
p.m10 += Mathf.Sin (Time.time * 1.5) * 0.1;
camera.projectionMatrix = p;
}
using UnityEngine;
using System.Collections;
public class example : MonoBehaviour {
public Matrix4x4 originalProjection;
void Update() {
Matrix4x4 p = originalProjection;
p.m01 += Mathf.Sin(Time.time * 1.2F) * 0.1F;
p.m10 += Mathf.Sin(Time.time * 1.5F) * 0.1F;
camera.projectionMatrix = p;
}
void Example() {
originalProjection = camera.projectionMatrix;
}
}
import UnityEngine
import System.Collections
class example(MonoBehaviour):
public originalProjection as Matrix4x4
def Update():
p as Matrix4x4 = originalProjection
p.m01 += (Mathf.Sin((Time.time * 1.2F)) * 0.1F)
p.m10 += (Mathf.Sin((Time.time * 1.5F)) * 0.1F)
camera.projectionMatrix = p
def Example():
originalProjection = camera.projectionMatrix
// Set an off-center projection, where perspective's vanishing
// point is not necessarily in the center of the screen.
//
// left/right/top/bottom define near plane size, i.e.
// how offset are corners of camera's near plane.
// Tweak the values and you can see camera's frustum change.
@script ExecuteInEditMode
var 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