【Unity】PerspectiveなカメラのProjection行列をスクリプトで上書きしてOrthographicなカメラにする

PerspectiveなカメラのProjection行列をスクリプトで上書きしてOrthographicなカメラにする方法です。
特に目的があるわけではありませんが、カメラの理解を深めるために作りました。

Unity2018.3

やりたいこと

Unityのカメラはボタン一つでPerspectiveとOrthographicを切り替えられます。

f:id:halya_11:20190207004523g:plain

これは内部的にはプロジェクション行列が異なるだけなはずなので、
このプロジェクション行列をスクリプトで計算して上書きすることでPerspectiveなカメラをOrthographicに変えます。

方針

Orthographicなカメラが描画する範囲は「Size」で決まります。
ProjectionをOrthographicに設定した時の「Size」が13なので、今回はSizeが13となるような行列を作ればよさそうです。

f:id:halya_11:20190207004830p:plain

そしてこのSizeは、「カメラの縦方向の大きさの半分」という定義のようです。

docs.unity3d.com

さらに、OrthographicなMatrixはMatrix4x4.Ortho()で作れます。
この引数で描画範囲の立方体を定義するので、その際にSizeを使って計算すればよさそうです。

docs.unity3d.com

ソースコード

前節の方針に基づいてソースコードを書いてみました。

using UnityEngine;

[RequireComponent(typeof(Camera))]
public class Example : MonoBehaviour
{
    private const float ORTHO_SIZE = 13;
    
    private void Start()
    {
        var camera = GetComponent<Camera>();

        // 平行投影のProjectionMatrixを計算する
        var aspectRatio = (float)Screen.width / Screen.height;
        var orthoWidth = ORTHO_SIZE * aspectRatio;
        var projMatrix = Matrix4x4.Ortho(orthoWidth * -1, orthoWidth, ORTHO_SIZE * -1, ORTHO_SIZE, 0, 1000);

        // カメラのProjectionMatrixを上書き
        camera.projectionMatrix = projMatrix;
    }
}

意外と簡単にできました。
縦幅にORTHO_SIZEを使用し、横幅はそれにアスペクト比の値を掛けて算出しています。Z値は適当です。

結果

このスクリプトをPerspectiveなCameraにアタッチして再生すると、
ProjectionMatrixを上書きすることでOrthographicな見栄えになります。

f:id:halya_11:20190207005555g:plain

参考

docs.unity3d.com

docs.unity3d.com