Version: 2022.3

Camera.projectionMatrix

切换到手册
public Matrix4x4 projectionMatrix ;

描述

设置自定义投影矩阵。

If you change this matrix, the camera no longer updates its rendering based on its fieldOfView. Moreover, this leaves the camera's nearClipPlane and farClipPlane unchanged, so you need to update those manually to avoid inconsistencies. This lasts until you call ResetProjectionMatrix.

仅在您确实需要非标准投影时,才使用自定义投影。 Unity 的水渲染使用该属性设置一个 倾斜投影矩阵。要使用自定义投影,您必须具备良好的 变换和投影矩阵知识。

注意,可以根据平台和其他状态修改 传递给着色器的投影矩阵。如果需要从摄像机投影计算 供着色器使用的投影矩阵,请使用 GL.GetGPUProjectionMatrix

另请参阅:Camera.nonJitteredProjectionMatrix

// Make camera wobble in a funky way!
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; } }