--重点局部坐标 (目标点可能有旋转)
例如物体A的世界坐标坐标为(1,2,3),物体B的世界坐标为(2,2,2),现在需要计算物体B相对于物体A的局部坐标,则应该使用A.transform.InverseTransformPoint(B)
--移动相机使 场景内的目标点在屏幕中心 的方法
1.计算目标点相对相机的坐标InverseTransformPoint
2.上面的结果就是相机需要移动的距离(无视Z值)
--如果是移动相机使 场景内的目标点在屏幕中某一点 的方法
--还需要计算相机UV挪动
--正确思路
--0.算出目标在屏幕的UV
--1.根据UV 和 目标点相对相机坐标系下的距离offsetZ值
--2.然后算出相机视锥内 四个视锥点
--3.根据UV算出相对相机的坐标 转成世界坐标
*/
public Vector3 OffsetPosByUV(float offsetZ, float uvx = 0.5f, float uvy = 0.5f)
{
Vector2 uv = new Vector2(uvx, uvy);
if (Camera == null)
return Vector3.zero;
if (Mathf.Approximately(uv.x, 0.5f) && Mathf.Approximately(uv.y, 0.5f))
return Vector3.zero;
Camera.CalculateFrustumCorners(viewRect, offsetZ, Camera.MonoOrStereoscopicEye.Mono, frustumCorners);
//frustumCorners 视锥平面四个角落点坐标
float x = Mathf.Lerp(frustumCorners[2].x, frustumCorners[0].x, uv.x);
float y = Mathf.Lerp(frustumCorners[1].y, frustumCorners[0].y, uv.y);
return Camera.transform.TransformVector(new Vector3(x, y, 0));//换算出世界坐标插值
}
/// <summary>
/// 返回相机坐标
/// </summary>
/// <param name="offsetZ"></param>
/// <param name="uv"></param>
/// <param name="target"></param>
/// <returns></returns>
public Vector3 OffsetPosByUV2(float offsetZ, float uvx , float uvy , Transform target)
{
Vector3 worldPos = OffsetPosByUV(offsetZ, uvx, uvy); // 相机不动,算出屏幕uv上z轴上所在的世界位置,
Vector3 targetOffset = Camera.transform.position - worldPos;
return targetOffset + target.position;
}
文章来源地址https://www.toymoban.com/news/detail-533323.html
文章来源:https://www.toymoban.com/news/detail-533323.html
到了这里,关于unity相机视角平移一段距离的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!