UnityのCameraに非対称なfrustumをセットする

UnitySampleProject

GitHub - hikatech/UnityAsymmetricFrustum

目的

  • UnityのCameraに自由度の高い(左右非対称などの)視錘台を設定する

背景

  • Unityのカメラをいじっていると、上下左右対称な(gluPerspective()を使ったような)projection matrixではなく、もっと自由に(glFrustum()のように)視錘台を設定したくなる時がある
  • 特に非HMD系のVRをやってると、PCモニタをVR世界を覗く窓として使う時があるが、そんなときに有効

環境

  • OS: Windows 10 Pro
  • Unity: 2018.1.1f1

FrustumSetterSimple.cs

  • 基本的にはCameraコンポーネントのprojectionMatrixフィールドに、Matrix4x4.Frustum()で生成したプロジェクション行列をセットするだけ
  • 下記のスクリプトをMainCameraオブジェクトなどにAddComponentすればいい
using UnityEngine;

[RequireComponent(typeof(Camera))]
[ExecuteInEditMode]
public class FrustumSetterSimple : MonoBehaviour
{
    [SerializeField]
    float m_left = -1;
    [SerializeField]
    float m_right = 1;
    [SerializeField]
    float m_top = 1;
    [SerializeField]
    float m_bottom = -1;
    [SerializeField]
    float m_near = 1;
    [SerializeField]
    float m_far = 1000;

    Camera m_cam = null;

    // Use this for initialization
    void Start () {
        m_cam = GetComponent<Camera>();
    }

    // Update is called once per frame
    void Update()
    {
        if (m_cam != null)
        {
            // set projection matrix
            m_cam.projectionMatrix = Matrix4x4.Frustum(m_left, m_right, m_bottom, m_top, m_near, m_far);

            // for displaying right bounds of viewing frustum (Not absolutely necessary)
            m_cam.nearClipPlane = m_near;
            m_cam.farClipPlane = m_far;
        }
    }
}

もっと簡単にのぞき窓を設定する

おわりに

ヒカテクにコーヒーをおごってみませんか!(投げ銭|Donation

投稿者: hikatech