Documentation

Unity Engine


User Manual

Script Reference

Unity Engine


CalculateFrustumCorners(Rect, float, MonoOrStereoscopicEye, Vector3[])

Given viewport coordinates, calculates the view space vectors pointing to the four frustum corners at the specified camera depth.
Read time 1 minuteLast updated 21 days ago

Definition

  • Type: Method
  • Namespace: UnityEngine
  • Assembly: UnityEngine.CoreModule
public void CalculateFrustumCorners(Rect viewport, float z, Camera.MonoOrStereoscopicEye eye, Vector3[] outCorners)

Parameters

viewport

Normalized viewport coordinates to use for the frustum calculation.

Z-depth from the camera origin at which the corners will be calculated.

Camera eye projection matrix to use.

outCorners

Output array for the frustum corner vectors. Cannot be null and length must be >= 4.

Remarks

The order of the corners is lower left, upper left, upper right, lower right.
CalculateFrustumCorners can be used to efficiently calculate the world space position of a pixel in an image effect shader. See standard assets implementation of global fog.
using UnityEngine;public class ExampleClass : MonoBehaviour{ void Update() { // this example shows the different camera frustums when using asymmetric projection matrices (like those used by OpenVR). var camera = GetComponent<Camera>(); Vector3[] frustumCorners = new Vector3[4]; camera.CalculateFrustumCorners(new Rect(0, 0, 1, 1), camera.farClipPlane, Camera.MonoOrStereoscopicEye.Mono, frustumCorners); for (int i = 0; i < 4; i++) { var worldSpaceCorner = camera.transform.TransformVector(frustumCorners[i]); Debug.DrawRay(camera.transform.position, worldSpaceCorner, Color.blue); } camera.CalculateFrustumCorners(new Rect(0, 0, 1, 1), camera.farClipPlane, Camera.MonoOrStereoscopicEye.Left, frustumCorners); for (int i = 0; i < 4; i++) { var worldSpaceCorner = camera.transform.TransformVector(frustumCorners[i]); Debug.DrawRay(camera.transform.position, worldSpaceCorner, Color.green); } camera.CalculateFrustumCorners(new Rect(0, 0, 1, 1), camera.farClipPlane, Camera.MonoOrStereoscopicEye.Right, frustumCorners); for (int i = 0; i < 4; i++) { var worldSpaceCorner = camera.transform.TransformVector(frustumCorners[i]); Debug.DrawRay(camera.transform.position, worldSpaceCorner, Color.red); } }}
Which can be seen in the following image:
FrustumCorners (CalculateFrustumCorners(Rect, float, MonoOrStereoscopicEye, Vector3[]))
.