MRが楽しい

MRやVRについて学習したことを書き残す

Unityでカメラの投影方式を透視投影と平行投影で切り替える その2(スクリプトからの変更)

本日は Unity の小ネタ枠です。
Unityでカメラの投影方式を透視投影と平行投影で切り替える方法を記事にします。
本記事はスクリプトからの変更についてです。

前提条件

前回記事の続きです。
bluebirdofoz.hatenablog.com

透視投影と平行投影の切り替え

Camera コンポーネントに含まれる orthographic 変数の true/false を切り替えることで変更できます。
docs.unity3d.com
docs.unity3d.com

更に透視投影の場合は fieldOfView 変数で画角の調整、平行投影の場合は orthographicSize 変数で投射面のサイズ調整が行えます。

変数でのサンプルコード

・透視投影への変更

    /// <summary>
    /// 透視投影の視点に変更する
    /// </summary>
    [ContextMenu("ChangePerspectiveProjection")]
    public void ChangePerspectiveProjection()
    {
        Camera.main.orthographic = false;
        Camera.main.fieldOfView = 60.0f;
    }

f:id:bluebirdofoz:20220302231121j:plain

・平行投影への変更

    /// <summary>
    /// 平行投影の視点に変更する
    /// </summary>
    [ContextMenu("ChangeOrthographicProjection")]
    public void ChangeOrthographicProjection()
    {
        Camera.main.orthographic = true;
        Camera.main.orthographicSize = 10.0f;
    }

f:id:bluebirdofoz:20220302231133j:plain

カスタム投射行列の設定

また、projectionMatrix 変数にカメラの投射行列を直接設定して投影方法を変更することもできます。
docs.unity3d.com
docs.unity3d.com

projectionMatrix 変数を用いてカメラの投影方法を直接変更した場合、ResetProjectionMatrix 関数を実行するまで fieldOfView などの設定と実際の投影方式が一致しなくなります。
docs.unity3d.com

カスタム投射行列でのサンプルコード

・透視投影への変更

    /// <summary>
    /// 透視投影の視点に変更する(Matrix指定)
    /// </summary>
    [ContextMenu("ChangePerspectiveMatrix")]
    public void ChangePerspectiveMatrix()
    {
        float fieldOfView = 60.0f;        // 画角
        float aspectRatio = 16.0f / 9.0f; // アスペクト比

        // 平行投影のProjectionMatrixを計算する
        Matrix4x4 projMatrix = Matrix4x4.Perspective(
            fieldOfView,
            aspectRatio,
            0.1f, 100.0f
            );

        // カメラのProjectionMatrixを設定する
        Camera.main.projectionMatrix = projMatrix;
    }

f:id:bluebirdofoz:20220302231207j:plain

・平行投影への変更

    /// <summary>
    /// 平行投影の視点に変更する(Matrix指定)
    /// </summary>
    [ContextMenu("ChangeOrthographicMatrix")]
    public void ChangeOrthographicMatrix()
    {
        float orthographicSize = 5.0f;    // 投射面のサイズ
        float aspectRatio = 16.0f / 9.0f; // アスペクト比
        float orthoWidth = orthographicSize * aspectRatio;
        float orthoHeight = orthographicSize;

        // 平行投影のProjectionMatrixを計算する
        Matrix4x4 projMatrix = Matrix4x4.Ortho(
            orthoWidth * -1, orthoWidth,
            orthoHeight * -1, orthoHeight,
            0.1f, 100.0f
            );

        // カメラのProjectionMatrixを設定する
        Camera.main.projectionMatrix = projMatrix;
    }

f:id:bluebirdofoz:20220302231218j:plain