我认为你可以使用
Transform.InverseTransformPoint
,它将位置从世界空间转换为本地空间。然后,由于这也受比例的影响,再次使用
Vector3.Scale
乘以平面的比例。因此,你的坐标应该是类似这样的:
coords = hit.transform.localScale / 2f + Vector3.Scale(hit.transform.InverseTransformPoint(hit.point), hit.transform.localScale);
目前无法测试,因为在智能手机上打字。根据您的需求和平面的旋转等情况,您可能需要反转y / z分量。但我希望这能给您一个想法。
为了调试出问题的原因,您应该逐步打印出值。
var scale = hit.transform.localScale;
var halfScale = scale / 2f;
var localHitPoint = hit.transform.InverseTransformPoint(hit.point);
Debug.Log($"{nameof(localHitPoint)}:{localHitPoint:0.000}");
所以我最初期望的是这里的值会像这样。
(-0.5, 0.5, 0)----(0.5, 0.5, 0)
| |
| (0, 0, 0) |
| |
(-0.5, -0.5, 0)---(0.5, -0.5, 0)
但是,正如你现在所添加的:“你的飞机被旋转了!”
在X轴上的90°实际上使Y轴和Z轴交换位置。因此,为了得到所需的Y坐标,你应该读取
localHitPoint.z
。
然后,在Y轴上的180°基本上颠倒了X轴和Z轴。
因此,我现在希望值看起来像:
(0.5, 0, -0.5)----(-0.5, 0, -0.5)
| |
| (0, 0, 0) |
| |
(0.5, 0, 0.5)---(-0.5, 0, 0.5)
这段话的意思是:“这看起来非常像您描述的值。但不确定为什么要乘以10,也不知道为什么不需要交换Y和Z。然而,由于您实际上想让0,0位于左上角,所以您只需要翻转X轴并使用Z代替Y。”
fixedLocalHitPoint = new Vector2(-localHitPoint.x, localHitPoint.z);
Debug.Log($"{nameof(fixedLocalHitPoint)}:{fixedLocalHitPoint:0.000}");
现在应该给你提供像这样的值
(-0.5, -0.5)----(0.5, -0.5)
| |
| (0, 0) |
| |
(-0.5, 0.5)----(0.5, 0.5)
仍然需要再次扩大规模。
var scaledHitPoint = Vector2.Scale(fixedLocalHitPoint, new Vector2 (scale.x, scale.z));
Debug.Log($"{nameof(scaledHitPoint)}:{scaledHitPoint:0.000}");
现在应该给出类似于以下的值
(-32, -18)----(32, -18)
| |
| (0, 0) |
| |
(-32, 18)-----(32, 18)
这就是为什么你需要将中心点作为参考点添加的原因。
coords = new Vector2(halfScale.x, halfScale.z) + scaledHitPoint;
Debug.Log($"{nameof(coords)}:{coords:0.000}");
这现在应该是什么。
(0, 0)------(64, 0)
| |
| (32, 18) |
| |
(0, 36)-----(64, 36)
我希望这能让你更加了解这些“奇怪”的值来自哪里。
由于你的相机缩放比例为
1,1,1
,且没有其他因素参与计算,说实话我很难找到这个因数10是从哪里悄悄溜进计算中的。
Camera
游戏对象的变换(特别是显示比例)。 - Ruzihm