Creating a dynamic camera zoom

Hi all,

I'm currently writing a dynamic camera zoom script which frames two transforms (this could be expanded later).

The first issue I'm having is that the camera has different vertical and horizontal fields of view (makes sense, rectangular screen). I can't work quite figure out how to calculate these two values currently.

The second issue I'm having is that my camera is rotated in the X axis, and pointed at the two characters. This seems to cause the character at the bottom to move out of view, whilst overcompensating for the character at the top.

Anyways, apologies if that is not explained brilliantly, here's the code I wrote so far:

using UnityEngine;
using System.Collections;

public class CameraFollow : MonoBehaviour { public Transform target1; public Transform target2; public float damping = 5f; public bool lookAt = true;

`Vector3 offset;
public float viewAngle = 18;
public float minDist = 20;
public float sideVision = 6;

void Awake()
{
if( target1 == null ) return;
offset = transform.position - AveragePos( target1, target2 );
}

void LateUpdate ()
{
if( target1 == null || !lookAt ) return;

Quaternion rotation = Quaternion.LookRotation(AveragePos( target1, target2 ) - transform.position);
transform.rotation = Quaternion.Slerp(transform.rotation, rotation, Time.deltaTime * damping);

}

void FixedUpdate ()
{
if( target1 == null ) return;

Vector3 ap = AveragePos( target1, target2 );

float opDist = Vector3.Distance( ap, target1.position )+sideVision;
float aDist = Mathf.Clamp( opDist / ( Mathf.Tan(viewAngle*Mathf.Deg2Rad) ), minDist, Mathf.Infinity );

transform.position = Vector3.Lerp ( transform.position, ap + (Vector3.Normalize(offset)*aDist), Time.deltaTime * damping );

}

Vector3 AveragePos( Transform p1, Transform p2 )
{
if( target1 == null ) return Vector3.zero;
if( target2 == null ) return p1.position;
Vector3 avPos = (p1.position + p2.position)/2;
return avPos;
}
`

}

Try this one

http://www.unifycommunity.com/wiki/index.php?title=SmoothLookFrame