Camera.projectionMatrix
Declaration
public Matrix4x4 projectionMatrix;Описание
Матрица 4x4, которая используется для преобразования пространственных координат мира в пространственные координаты клипа.
Если вы измените эту матрицу, камера больше не обновляет свое отображение на основе ее fieldOfView. Кроме того, это оставляет камеру nearClipPlane и farClipPlane неизменными, так что вам нужно обновить их вручную, чтобы избежать несоответствий. Это продолжается до тех пор, пока вы не вызовете ResetProjectionMatrix.
Используйте пользовательскую проекцию только в том случае, если вам действительно нужна нестандартная проекция. Это свойство используется Unity'с воды рендеринг для установки наклонная проекция Использование пользовательских проекций требует хорошего знания матриц преобразований и проекций.
Обратите внимание, что матрица проекции, передаваемая шейдерам, может изменяться в зависимости от платформы и другого состояния. Если вам нужно вычислить матрицу проекции для шейдера из проекции камеры, используйте GL.GetGPUProjectionMatrix.
Эффекты, такие как временное выравнивание (TAA) будет применять субпиксельное колебание к этой матрице, которое меняется между кадрами. Чтобы получить матрицу без этого колебания, используйте Camera.nonJitteredProjectionMatrix.
// Add a temporal wobble to the camera projection matrix 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; } }