Skip to content

Instantly share code, notes, and snippets.

@darbotron
Last active May 22, 2020 21:49
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save darbotron/8aba1b726632a937c06f956f4d0a03cb to your computer and use it in GitHub Desktop.
Save darbotron/8aba1b726632a937c06f956f4d0a03cb to your computer and use it in GitHub Desktop.
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class TargetingCamera : MonoBehaviour
{
[SerializeField] Transform m_Horizontal = null;
[SerializeField] Transform m_Vertical = null;
[SerializeField] Transform m_Target = null;
void Start()
{}
void Update()
{
// find vector to target
Vector3 v3RootToTarget = ( m_Target.position - transform.position );
Vector3 v3DirectionToCameraTarget = v3RootToTarget.normalized;
// project onto current root plane (not orizontal pivot only rotates around Y so has same up vector
Vector3 v3CameraDirectionLocal = transform.InverseTransformDirection( v3DirectionToCameraTarget );
Vector3 v3CameraDirectionLocalHorizontal = Vector3.ProjectOnPlane( v3CameraDirectionLocal, Vector3.up );
float fSignedAngleAroundY = Vector3.SignedAngle ( Vector3.forward, v3CameraDirectionLocalHorizontal, Vector3.up );
Quaternion qHorizontalRotation = Quaternion.AngleAxis ( fSignedAngleAroundY, Vector3.up );
m_Horizontal.localRotation = qHorizontalRotation;
Debug.DrawRay( transform.position, v3RootToTarget, Color.yellow );
Debug.DrawRay( transform.position, ( transform.TransformDirection( v3CameraDirectionLocalHorizontal ) * 1.5f ), Color.cyan );
Debug.DrawRay( transform.position, m_Horizontal.right, Color.red );
Debug.DrawRay( transform.position, m_Horizontal.up, Color.green );
Debug.DrawRay( transform.position, m_Horizontal.forward, Color.blue );
//
Vector3 v3CameraDirectionInHorizVerticalPlane = Vector3.ProjectOnPlane( v3DirectionToCameraTarget, m_Horizontal.right ).normalized;
Vector3 V3CameraInVerticalPlaneLocal = m_Horizontal.InverseTransformVector( v3CameraDirectionInHorizVerticalPlane );
float fSignedAngleAroundHorizX = Vector3.SignedAngle( Vector3.forward, V3CameraInVerticalPlaneLocal, Vector3.right );
Quaternion qVerticalRotationLocal = Quaternion.AngleAxis( fSignedAngleAroundHorizX, Vector3.right );
m_Vertical.localRotation = qVerticalRotationLocal;
Debug.DrawRay( transform.position, ( v3CameraDirectionInHorizVerticalPlane * 2f ), Color.magenta );
Debug.DrawRay( transform.position, ( m_Vertical.forward * 2.5f ), Color.cyan );
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment