unity移动相机使场景内的目标点在屏幕中心的方法

	--重点局部坐标 (目标点可能有旋转)
	例如物体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;
    }

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值