Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- using System.Collections;
- using System.Collections.Generic;
- using UnityEngine;
- [RequireComponent(typeof(Camera))]
- public class CameraSceneRender : MonoBehaviour
- {
- private Vector3 targetPos => targetObject.transform.position;
- [SerializeField]
- private GameObject targetObject;
- private Camera camera;
- private Vector3 p => camera.transform.position;
- private Vector3 viewDir => camera.transform.forward;
- private Vector3 viewUp => camera.transform.up;
- private Vector3 viewRight => camera.transform.right;
- private Vector3 straight => targetPos - p;
- private Vector3 targetDir => straight.normalized;
- // distance along viewing direction to plane intercting the target
- private float d => Vector3.Dot(targetDir, viewDir) * straight.magnitude;
- private Vector3 viewCentre => p + viewDir * d;
- private float theta => camera.fieldOfView;
- private float phi => camera.fieldOfView / 2;
- private float tanTheta => Mathf.Tan(theta * Mathf.Deg2Rad);
- private float tanPhi => Mathf.Tan(phi * Mathf.Deg2Rad);
- private float b => tanPhi * d;
- // vectors aligning up and right sized for the frustum
- private Vector3 u => viewRight * frustumWidth;
- private Vector3 v => viewUp * b;
- private Vector3 tr => viewCentre + u + v;
- private Vector3 tl => viewCentre - u + v;
- private Vector3 br => viewCentre + u - v;
- private Vector3 bl => viewCentre - u - v;
- private float frustumHeight => d * Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad);
- private float frustumWidth => frustumHeight * camera.aspect;
- // This is the red line
- private Vector3 comp => targetPos - viewCentre;
- private Vector3 compDir => comp.normalized;
- private float uCompAlignment => Vector3.Dot(viewRight, compDir);
- private float vCompAlignment => Vector3.Dot(viewUp, compDir);
- private Vector3 uPrime => viewRight * comp.magnitude * uCompAlignment;
- private Vector3 vPrime => viewUp * comp.magnitude * vCompAlignment;
- private Vector3 trPrime => viewCentre + uPrime + vPrime;
- private Vector3 tlPrime => viewCentre - uPrime + vPrime;
- private Vector3 brPrime => viewCentre + uPrime - vPrime;
- private Vector3 blPrime => viewCentre - uPrime - vPrime;
- // Start is called before the first frame update
- void Start()
- {
- camera = GetComponent<Camera>();
- }
- // Update is called once per frame
- void Update()
- {
- drawTargets();
- drawFrustum();
- drawTheoreticalFrustum();
- }
- private void drawTargets()
- {
- Debug.DrawLine(p, targetPos, Color.white);
- Debug.DrawLine(p, viewCentre, Color.blue);
- Debug.DrawLine(viewCentre, viewCentre + u, Color.blue);
- Debug.DrawLine(viewCentre, viewCentre + v, Color.blue);
- }
- private void drawFrustum()
- {
- Debug.DrawLine(p, tr, Color.green);
- Debug.DrawLine(p, tl, Color.green);
- Debug.DrawLine(p, br, Color.green);
- Debug.DrawLine(p, bl, Color.green);
- Debug.DrawLine(tr, tl, Color.green);
- Debug.DrawLine(tr, br, Color.green);
- Debug.DrawLine(bl, br, Color.green);
- Debug.DrawLine(bl, tl, Color.green);
- }
- private void drawTheoreticalFrustum()
- {
- //Debug.DrawLine(p, tr, Color.green);
- //Debug.DrawLine(p, tl, Color.green);
- //Debug.DrawLine(p, br, Color.green);
- //Debug.DrawLine(p, bl, Color.green);
- Debug.DrawLine(viewCentre, targetPos, Color.red);
- Debug.DrawLine(viewCentre, viewCentre + uPrime, Color.red);
- Debug.DrawLine(viewCentre, viewCentre + vPrime, Color.red);
- Debug.DrawLine(trPrime, tlPrime, Color.red);
- Debug.DrawLine(trPrime, brPrime, Color.red);
- Debug.DrawLine(blPrime, brPrime, Color.red);
- Debug.DrawLine(blPrime, tlPrime, Color.red);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement