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;
}
}
}
もっと簡単にのぞき窓を設定する
- sample project
- シーン中に設置されたQuadをバーチャルなモニタとみなして、カメラからそのQuadを覗いたときに見える景色を切り取る視錘台を生成できるようにしてみた
- 視点をいい感じにトラッキングできれば、その移動量をCameraに反映することで運動視差がつく
- 結果、本当に覗き窓のように見える
おわりに
ヒカテクにコーヒーをおごってみませんか!(投げ銭|Donation)