Advertisement
Guest User

Start of camera math

a guest
Sep 23rd, 2019
176
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.55 KB | None | 0 0
  1. using System.Collections;
  2. using System.Collections.Generic;
  3. using UnityEngine;
  4.  
  5. [RequireComponent(typeof(Camera))]
  6. public class CameraSceneRender : MonoBehaviour
  7. {
  8.     private Vector3 targetPos => targetObject.transform.position;
  9.  
  10.     [SerializeField]
  11.     private GameObject targetObject;
  12.  
  13.     private Camera camera;
  14.     private Vector3 p => camera.transform.position;
  15.  
  16.     private Vector3 viewDir => camera.transform.forward;
  17.     private Vector3 viewUp => camera.transform.up;
  18.     private Vector3 viewRight => camera.transform.right;
  19.  
  20.     private Vector3 straight => targetPos - p;
  21.     private Vector3 targetDir => straight.normalized;
  22.     // distance along viewing direction to plane intercting the target
  23.     private float d => Vector3.Dot(targetDir, viewDir) * straight.magnitude;
  24.  
  25.     private Vector3 viewCentre => p + viewDir * d;
  26.  
  27.     private float theta => camera.fieldOfView;
  28.     private float phi => camera.fieldOfView / 2;
  29.     private float tanTheta => Mathf.Tan(theta * Mathf.Deg2Rad);
  30.     private float tanPhi => Mathf.Tan(phi * Mathf.Deg2Rad);
  31.  
  32.     private float b => tanPhi * d;
  33.     // vectors aligning up and right sized for the frustum
  34.     private Vector3 u => viewRight * frustumWidth;
  35.     private Vector3 v => viewUp * b;
  36.  
  37.     private Vector3 tr => viewCentre + u + v;
  38.     private Vector3 tl => viewCentre - u + v;
  39.     private Vector3 br => viewCentre + u - v;
  40.     private Vector3 bl => viewCentre - u - v;
  41.  
  42.     private float frustumHeight => d * Mathf.Tan(camera.fieldOfView * 0.5f * Mathf.Deg2Rad);
  43.     private float frustumWidth => frustumHeight * camera.aspect;
  44.  
  45.     // This is the red line
  46.     private Vector3 comp => targetPos - viewCentre;
  47.     private Vector3 compDir => comp.normalized;
  48.     private float uCompAlignment => Vector3.Dot(viewRight, compDir);
  49.     private float vCompAlignment => Vector3.Dot(viewUp, compDir);
  50.     private Vector3 uPrime => viewRight * comp.magnitude * uCompAlignment;
  51.     private Vector3 vPrime => viewUp * comp.magnitude * vCompAlignment;
  52.  
  53.     private Vector3 trPrime => viewCentre + uPrime + vPrime;
  54.     private Vector3 tlPrime => viewCentre - uPrime + vPrime;
  55.     private Vector3 brPrime => viewCentre + uPrime - vPrime;
  56.     private Vector3 blPrime => viewCentre - uPrime - vPrime;
  57.  
  58.     // Start is called before the first frame update
  59.     void Start()
  60.     {
  61.         camera = GetComponent<Camera>();
  62.     }
  63.  
  64.     // Update is called once per frame
  65.     void Update()
  66.     {
  67.         drawTargets();
  68.         drawFrustum();
  69.         drawTheoreticalFrustum();
  70.     }
  71.  
  72.     private void drawTargets()
  73.     {
  74.         Debug.DrawLine(p, targetPos, Color.white);
  75.         Debug.DrawLine(p, viewCentre, Color.blue);
  76.         Debug.DrawLine(viewCentre, viewCentre + u, Color.blue);
  77.         Debug.DrawLine(viewCentre, viewCentre + v, Color.blue);
  78.     }
  79.  
  80.     private void drawFrustum()
  81.     {
  82.         Debug.DrawLine(p, tr, Color.green);
  83.         Debug.DrawLine(p, tl, Color.green);
  84.         Debug.DrawLine(p, br, Color.green);
  85.         Debug.DrawLine(p, bl, Color.green);
  86.  
  87.         Debug.DrawLine(tr, tl, Color.green);
  88.         Debug.DrawLine(tr, br, Color.green);
  89.         Debug.DrawLine(bl, br, Color.green);
  90.         Debug.DrawLine(bl, tl, Color.green);
  91.     }
  92.  
  93.     private void drawTheoreticalFrustum()
  94.     {
  95.         //Debug.DrawLine(p, tr, Color.green);
  96.         //Debug.DrawLine(p, tl, Color.green);
  97.         //Debug.DrawLine(p, br, Color.green);
  98.         //Debug.DrawLine(p, bl, Color.green);
  99.         Debug.DrawLine(viewCentre, targetPos, Color.red);
  100.         Debug.DrawLine(viewCentre, viewCentre + uPrime, Color.red);
  101.         Debug.DrawLine(viewCentre, viewCentre + vPrime, Color.red);
  102.  
  103.         Debug.DrawLine(trPrime, tlPrime, Color.red);
  104.         Debug.DrawLine(trPrime, brPrime, Color.red);
  105.         Debug.DrawLine(blPrime, brPrime, Color.red);
  106.         Debug.DrawLine(blPrime, tlPrime, Color.red);
  107.     }
  108. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement