目标:仅在 Z 轴上 移动相机位置,使视锥体适合 2 个对象。
条件:
- 其中一个对象将始终与相机 X 位置对齐
- 相机设置为透视模式,而不是正交。
- 2个球体没有父级
到目前为止我所做的:
使用三角函数可以将其视为:
知道了这一点,目标是找到相邻的一面,这将是相机和仍然适合黄色的黑点之间的距离。
从技术上讲,这段代码应该找到相邻的值:
private float CalculateMaxZoomDistanceToBall()
{
//Calculate angle from camera, should be divided of 2 cause it's placed on the middle of the line
Camera currentCamera = cameraComp;
angleDegrees = currentCamera.fieldOfView / 2; //(degrees)
//pass the angle to radians
angleRadians = angleDegrees * Mathf.Deg2Rad;
//Calculate the SinAngle
sinAngle = Mathf.Sin(angleRadians);
//Calculate Opposite
opposite = Mathf.Abs(blackPoint.transform.localPosition.x - yellowPoint.transform.position.x);
//Calculate hypotenuse
hypotenuse = opposite / sinAngle;
//Calculate CosX
cosAngle = Mathf.Cos(angleRadians);
//Calculate adjacent distance
adjacent = cosAngle * hypotenuse;
return adjacent;
}
由于相机对象位于 0,我只需将返回值添加到gameObject.transform.position.z
有人可能会说“但这是在寻找垂直的 FOV,你需要水平的”,好吧,我也尝试过水平的,发现:
float vFOVrad = currentCamera.fieldOfView * Mathf.Deg2Rad;
float cameraHeightAt1 = Mathf.Tan(vFOVrad * 0.5f);
float hFOVrad = Mathf.Atan(cameraHeightAt1 * currentCamera.aspect) * 2;
hFOV = hFOVrad * Mathf.Rad2Deg;
而且它不起作用,在某些情况下,相机位置离预期位置很远,有时它很合适,而另一些则只是关闭。
任何帮助将不胜感激,谢谢。