Unity C#中InverseTransformPoint函数工作原理及代码块解析
InverseTransformPoint逻辑 我来一步步帮你捋清楚这段代码的运作思路,尤其是InverseTransformPoint在这里的核心作用:
首先,这个PlaceOnCircle函数的目的是把屏幕上的输入位置,映射到当前脚本挂载物体局部空间的一个指定半径的圆上,让生成的点始终跟着物体的朝向和位置走。
逐行解析:
Ray ray = Camera.main.ScreenPointToRay(position);
这行是把屏幕坐标(比如鼠标点击位置)转换成一条从主相机出发、指向屏幕外的射线,用来获取世界空间中的参考点。Vector3 pos = ray.GetPoint(0f);GetPoint(0)返回的是射线的起点,也就是主相机在世界空间中的位置。这里我们把相机位置作为参考,用来判断“玩家想在物体的哪个方向放置点”。pos = transform.InverseTransformPoint(pos);
这就是你困惑的核心步骤:InverseTransformPoint的作用是把世界空间坐标转换为当前物体的局部空间坐标。- 这里我们把相机的世界位置,转换成当前脚本挂载物体的局部坐标后,
pos的X、Y、Z值就代表:相机相对于物体自身原点的位置(比如pos.x为正,说明相机在物体局部X轴的正方向)。 - 这么做的关键原因是:接下来的圆的计算要基于物体自身的坐标系,而不是世界坐标系。这样不管物体在世界里怎么移动、旋转,这个圆都会跟着物体的朝向走,不会出现“物体转了但圆还在原地”的错位问题。
float angle = Mathf.Atan2(pos.x, pos.z) * Mathf.Rad2Deg;
这行是计算相机在物体局部XZ平面上相对于原点的角度:Mathf.Atan2(pos.x, pos.z)会返回一个弧度值,代表从物体局部Z轴正方向,到相机位置连线的夹角(绕Y轴旋转的角度)。- 乘以
Mathf.Rad2Deg是把弧度转换成更直观的角度值。
pos.x = circle.radius * Mathf.Sin(angle * Mathf.Deg2Rad);pos.z = circle.radius * Mathf.Cos(angle * Mathf.Deg2Rad);
最后这两行是根据刚才算出的角度,把点“固定”在物体局部空间的圆上:- 利用三角函数的特性,
Sin(角度)和Cos(角度)的组合能生成一个距离原点(物体局部原点)距离为circle.radius的点,而且这个点的方向和之前相机相对于物体的方向完全一致。 - 到这里,
pos已经是物体局部空间中圆上的点了,如果需要用到世界空间,只需要再用transform.TransformPoint(pos)转回去就行(你的代码没写完,但逻辑上是这样)。
- 利用三角函数的特性,
总结一下InverseTransformPoint的核心作用:
它把世界空间的参考点(相机位置)转换成物体局部坐标,让后续的角度计算和圆的生成都基于物体自身的坐标系,保证了交互的“跟随性”——不管物体怎么动,这个圆始终是“属于”该物体的。
内容的提问来源于stack exchange,提问作者RealAnyOne

