unity 教程Tanks中的Transform.InverseTransformPoint理解

Tanks教程中在处理摄像机缩放的时候使用了下面的函数,取两个坦克的中心点之后,根据两个坦克之间的距离,保证两个坦克都在屏幕中,然后进行缩放。

 1  private float FindRequiredSize()
 2     {
 3         Vector3 desiredLocalPos = transform.InverseTransformPoint(m_DesiredPosition);
 4         float size = 0f;
 5         for (int i = 0; i < m_Targets.Length; i++)
 6         {
 7             if (!m_Targets[i].gameObject.activeSelf)
 8                 continue;
 9 
10             Vector3 targetLocalPos = transform.InverseTransformPoint(m_Targets[i].position);
11             Vector3 desiredPosToTarget = targetLocalPos - desiredLocalPos;
12             size = Mathf.Max (size, Mathf.Abs (desiredPosToTarget.y));
13 
14             size = Mathf.Max (size, Mathf.Abs (desiredPosToTarget.x) / m_Camera.aspect);
15         }
16         
17         size += m_ScreenEdgeBuffer;
18 
19         size = Mathf.Max(size, m_MinSize);
20         
21         return size;
22     }

一开始没有明白InverseTransformPoint,这个函数变换位置从世界坐标到自身坐标。

结构如下:

 

 

 摄像机选择的是正交投影,所以坦克到中心点CameraRig的x,y就是坦克距离屏幕中心点的位置。

因为camera的父节点CameraRig有个旋转,所以计算到屏幕的中心点的坐标要考虑到旋转,不如直接调用InverseTransformPoint,这样得到tank相对CameraRig的坐标,就是到屏幕中心的坐标。而z轴对于我们的计算没有用处。

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值