107 lines
3.3 KiB
C#
107 lines
3.3 KiB
C#
using System.Collections;
|
|
using UnityEngine;
|
|
|
|
public class CamOrthoTransition : MonoBehaviour
|
|
{
|
|
public Camera cam;
|
|
private float fov = 90f;
|
|
private float dist = 10f;
|
|
private bool m_Ortho;
|
|
private bool m_Animating = false;
|
|
|
|
public string distText = "10";
|
|
public Vector3 pos;
|
|
public float size;
|
|
public Transform[] objs;
|
|
|
|
private void OnGUI()
|
|
{
|
|
GUI.enabled = !m_Animating;
|
|
distText = GUILayout.TextField(distText);
|
|
if (float.TryParse(distText, out float d))
|
|
dist = d;
|
|
if (!m_Ortho && GUILayout.Button("Orthographic") )
|
|
{
|
|
dist = float.Parse(distText);
|
|
StartCoroutine(Perspective2Ortho());
|
|
}
|
|
if (m_Ortho && GUILayout.Button("Perspective"))
|
|
{
|
|
dist = float.Parse(distText);
|
|
StartCoroutine(Ortho2Perspective());
|
|
}
|
|
for(int i = 0; i < objs.Length; i++)
|
|
GUILayout.Label("O"+i+":" + cam.transform.InverseTransformPoint(objs[i].position).z);
|
|
}
|
|
private void OnDrawGizmos()
|
|
{
|
|
if (!m_Animating)
|
|
{
|
|
m_Ortho = cam.orthographic;
|
|
if (cam.orthographic)
|
|
{
|
|
size = cam.orthographicSize;
|
|
}
|
|
else
|
|
{
|
|
if (float.TryParse(distText, out float d))
|
|
dist = d;
|
|
size = dist * Mathf.Tan(fov * 0.5f * Mathf.Deg2Rad);
|
|
fov = cam.fieldOfView;
|
|
var trans = cam.transform;
|
|
pos = trans.position + trans.forward * dist;
|
|
}
|
|
}
|
|
float a = cam.aspect;
|
|
Gizmos.color = Color.green;
|
|
var u = cam.transform.up * size;
|
|
var r = cam.transform.right * size*a;
|
|
Gizmos.DrawLine(pos + u + r, pos - u + r);
|
|
Gizmos.DrawLine(pos + u - r, pos - u - r);
|
|
Gizmos.DrawLine(pos + u + r, pos + u - r);
|
|
Gizmos.DrawLine(pos - u + r, pos - u - r);
|
|
Gizmos.DrawLine(pos + u + r, pos - u - r);
|
|
Gizmos.DrawLine(pos - u + r, pos - u + r);
|
|
}
|
|
IEnumerator Perspective2Ortho()
|
|
{
|
|
m_Animating = true;
|
|
var trans = cam.transform;
|
|
fov = cam.fieldOfView;
|
|
pos = trans.position + trans.forward * dist;
|
|
size = dist * Mathf.Tan(fov * 0.5f * Mathf.Deg2Rad);
|
|
|
|
for (float t = 0; t < 1.1f; t+=Time.deltaTime*1f)
|
|
{
|
|
float f = Mathf.Lerp(fov, 0, t);
|
|
float d = size / Mathf.Tan(f * 0.5f * Mathf.Deg2Rad);
|
|
cam.fieldOfView = f;
|
|
trans.position = pos - trans.forward * d;
|
|
if (f < 1f || d > 700)
|
|
break;
|
|
yield return null;
|
|
}
|
|
cam.orthographic = true;
|
|
cam.orthographicSize = size;
|
|
cam.fieldOfView = fov;
|
|
m_Ortho = true;
|
|
m_Animating = false;
|
|
}
|
|
IEnumerator Ortho2Perspective()
|
|
{
|
|
m_Animating = true;
|
|
var trans = cam.transform;
|
|
size = cam.orthographicSize;
|
|
cam.orthographic = false;
|
|
for (float t = 0; t < 1.1f; t += Time.deltaTime * 1f)
|
|
{
|
|
float f = Mathf.Lerp(1f, fov, t);
|
|
float d = size / Mathf.Tan(f * 0.5f * Mathf.Deg2Rad);
|
|
cam.fieldOfView = f;
|
|
trans.position = pos - trans.forward * d;
|
|
yield return null;
|
|
}
|
|
m_Ortho = false;
|
|
m_Animating = false;
|
|
}
|
|
} |