CapersProject/Assets/01.Scenes/99.LMG/CameraTest.cs
SweetJJuya d4d816cd14 First
2025-01-16 17:49:49 +09:00

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;
}
}