Описание
Установите пользовательскую матрицу проекций.
Если вы измените эту матрицу, камера больше не будет обновлять свой рендеринг на основе своего fieldOfView. Это длится до тех пор, пока вы не вызовете ResetProjectionMatrix.
Используйте пользовательскую проекцию, только если вам действительно нужна нестандартная проекция. Это свойство используется при рендеринге воды в Unity для настройки матрицы наклонной проекции. Использование пользовательских проекций требует хорошего знания матриц преобразования и проекций.
Обратите внимание, что матрица проекции, передаваемая шейдерам, может быть изменена в зависимости от платформы и другого состояния. Если вам нужно рассчитать матрицу проекции для использования шейдера из проекции камеры, используйте GL.GetGPUProjectionMatrix.
Смотрите так же: Camera.nonJitteredProjectionMatrix
// Заставить камеру качаться причудливым образом!
using UnityEngine;
using System.Collections;
public class ExampleClass : MonoBehaviour
{
public Matrix4x4 originalProjection;
Camera cam;
void Start()
{
cam = GetComponent<Camera>();
originalProjection = cam.projectionMatrix;
}
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;
cam.projectionMatrix = p;
}
}
// 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.
using UnityEngine;
using System.Collections;
[ExecuteInEditMode]
public class ExampleClass : 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.main;
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;
}
}