Version: 2019.1
Лучи из камеры
Создание ощущения больших и маленьких размеров

Using an Oblique Frustum

By default, the view frustum is arranged symmetrically around the camera’s center line, but it doesn’t necessarily need to be. You can make the frustum “oblique”, which means that one side is at a smaller angle to the centre line than the opposite side. This makes the perspective on one side of the image seem more condensed, giving the impression that the viewer is very close to the object visible at that edge. An example of how this can be used is a car racing game; if the frustum is flattened at its bottom edge, it appears to the viewer that they are closer to the road, accentuating the feeling of speed.

Although the Camera component does not have functions specifically for setting the obliqueness of the frustum, you can do it by either enabling the camera’s Physical Camera properties and applying a Lens Shift, or by adding a script to alter the camera’s projection matrix.

Setting Frustum Obliqueness with a Lens Shift

Enable a camera’s Physical Camera properties to expose the Lens Shift options. You can use these to offset the camera’s focal center along the X and Y axes in a way that minimizes distortion of the rendered image.

Shifting the lens reduces the frustum angle on the side opposite the direction of the shift. For example, as you shift the lens up, the angle between the bottom of the frustum and the camera’s center line gets smaller.

Normally a camera’s frustum is symmetrical (left), meaning the angles on either side of the center line are equal. Shifting the lens (right) makes the frustum oblique, meaning the angle is smaller on one side than on the other.
Normally a camera’s frustum is symmetrical (left), meaning the angles on either side of the center line are equal. Shifting the lens (right) makes the frustum oblique, meaning the angle is smaller on one side than on the other.

For further information about the Physical Camera options, see documentation on Physical Cameras.

For further information about setting individual Physical Camera properties, see the Camera Component reference.

Setting Frustum Obliqueness Using a Script

The following script example shows how to quickly achieve an oblique frustum by altering the camera’s projection matrix. Note that you can only see the effect of the script while the game is running Play mode.

using UnityEngine;
using System.Collections;

public class ExampleScript : MonoBehaviour {
    void SetObliqueness(float horizObl, float vertObl) {
        Matrix4x4 mat  = Camera.main.projectionMatrix;
        mat[0, 2] = horizObl;
        mat[1, 2] = vertObl;
        Camera.main.projectionMatrix = mat;
    }
}

C# script example

function SetObliqueness(horizObl: float, vertObl: float) {
    var mat: Matrix4x4 = camera.projectionMatrix;
    mat[0, 2] = horizObl;
    mat[1, 2] = vertObl;
    camera.projectionMatrix = mat;
}

JS script example

К счастью, чтобы это использовать, вовсе не обязательно разбираться в том, как работает матрица проекции. Значениям horizObl и vertObl присваивается количество соответственно горизонтальной и вертикальной “косости”. Положительное значение сдвигает пирамиду вправо или вверх, таким образом, делая более плоской правую или верхнюю часть пирамиды. Эффект можно явно увидеть, если добавить этот скрипт к камере и переключиться в окно Scene при запущенной игре. Wireframe представление пирамиды видимости камеры будет меняться с изменением значений horizObl и vertObl в инспекторе. Значение 1 или –1 в любой из переменных означает, что одна из сторон пирамиды будет полностью плоской относительно центральной линии. При этом, хоть и такая необходимость и возникает редко, но можно использовать значения вне этого диапазона.


  • 2018–10–05 Page amended with limited editorial review

  • Lens Shift options added in Unity 2018.2

Лучи из камеры
Создание ощущения больших и маленьких размеров