ジャイロ(Gyro)で視差

環境

Unity2022.3.1f1

概要

ジャイロを使用した以下のツイートのような事をしたかったので試してみました。

スマホをひっくり返すと後部が見えます。

プログラムには傾斜錐台を使用しています。

コード

using UnityEngine;
using TMPro;
public class ObliqueProjection : MonoBehaviour
{
    [SerializeField] private Camera _camera = null;
    [SerializeField] private TextMeshProUGUI _text = null;
    [SerializeField] [Range(-1f,1f)] private float _horizontal = 0.0f;
    [SerializeField] [Range(-1f,1f)] private float _vertical = 0.0f;
    private Vector3 _org_position;
    private float _distance;

    void OnEnable()
    {
        _org_position = _camera.transform.localPosition;
        _distance = _org_position.magnitude;
        Input.gyro.enabled = true;
#if UNITY_EDITOR
        Input.gyro.enabled = false;
#endif
    }

    void OnDisable()
    {
    }

    void LateUpdate()
    {
        if(Input.gyro.enabled == true)
        {
            const float scale = 1.0f;
            const float offset = 1.0f;
            _horizontal = Mathf.Clamp(Input.gyro.gravity.x * scale, -1.0f, 1.0f);
            _vertical = Mathf.Clamp(Input.gyro.gravity.y * scale + offset, -1.0f, 1.0f);
        }
        var cam = _camera;
        var rect = cam.pixelRect;
        var ratio = (float)rect.height / (float)rect.width;
        _text.text = $"horizontal:{_horizontal} vertical:{_vertical}";

        cam.ResetProjectionMatrix();
        var proj = cam.projectionMatrix;
        proj.m02 = _horizontal * ratio;
        proj.m12 = _vertical;
        cam.projectionMatrix = proj;        
        var tan = Mathf.Tan(cam.fieldOfView*0.5f*Mathf.Deg2Rad);
        _camera.transform.localPosition = _org_position + new Vector3(-_horizontal * _distance * tan, 0.0f, -_vertical * _distance * tan);
    }
}

参考

傾斜錐台の使用 - Unity マニュアル

[Unity]カメラの消失点を中央からずらすスクリプト - Qiita

https://twitter.com/apphands/status/1556128036549865472