Unity3d 光线投射获取飞机撞击的局部坐标

Unity3d 光线投射获取飞机撞击的局部坐标,unity3d,Unity3d,我有一个具有比例(64,1,36)和旋转(90,-180,0)的平面,需要2d坐标格式的光线投射命中的局部坐标: (0,0)-------(64,0) | | | | | | (0,36)------(64,36) 使用我当前的代码: RaycastHit hit; Vector3 coords = new Vector3(); if (Physics.Raycast(GazeOriginCombinedLocal,

我有一个具有比例(64,1,36)和旋转(90,-180,0)的平面,需要2d坐标格式的光线投射命中的局部坐标:

(0,0)-------(64,0)
 |             |
 |             |
 |             |
(0,36)------(64,36)
使用我当前的代码:

RaycastHit hit;
Vector3 coords = new Vector3();
if (Physics.Raycast(GazeOriginCombinedLocal, GazeDirectionCombined, out hit, Mathf.Infinity))
    {
        if (!hit.transform.Equals("Cube"))
        {
            Pointer.transform.position = hit.point; //Green cube for visualization of hit in worldspace
            // coords = RectTransformUtility.ScreenPointToLocalPointInRectangle(Plane, hit.point, Camera.main, out coords);// no result at all
        }

       
    }
试一试:

hit.transform.InverseTransformPoint(hit.point)
给我这个

(5,-5)---(-5,-5)
  |         |
  |  (0,0)  |
  |         |
(5,5)----(-5,5)
是否有人有想法获得所需的格式

这就是我的飞机,它是主摄像机和我的层次结构的子对象,看起来是这样的: 提前谢谢

我想你可以用

将位置从世界空间转换为局部空间

然后,因为这也会受到缩放倍数的影响,所以它会再次受到使用的平面缩放的影响

所以你的坐标应该是

coords=hit.transform.localScale/2f+Vector3.Scale(hit.transform.InverseTransformPoint(hit.point),hit.transform.localScale);

由于在智能手机上打字,现在无法测试。例如,您可能需要根据需要和平面旋转方式等反转y/z组件,但我希望这能给您一个想法

为了调试错误,您可能应该一步一步地打印出值

var scale=hit.transform.localScale;//64, 1, 36
var半刻度=刻度/2f;//32, 0.5, 18
var localHitPoint=hit.transform.InverseTransformPoint(hit.point);
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=newvector2(-localHitPoint.x,localHitPoint.z);
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,newvector2(Scale.x,Scale.z));
Log($“{nameof(scaledHitPoint)}:{scaledHitPoint:0.000}”);
现在应该给出如下值

(-32,-18)--(32,-18)
|             |
|   (0, 0)    |
|             |
(-32, 18)-----(32, 18)
这就是为什么需要添加中心点作为参照

coords=newvector2(halfScale.x,halfScale.z)+scaledHitPoint;
Log($“{nameof(coords)}:{coords:0.000}”);
现在应该是什么

(0,0)----(64,0)
|            |
|  (32, 18)  |
|            |
(0, 36)-----(64, 36)
我希望这能让我们更清楚地了解这些“奇怪”的值是从哪里来的



由于您的相机是按比例缩放的,而且没有其他任何问题,老实说,我很难找到10的因子会潜入计算中的位置。

如果您想转换此值:

hit.transform.InverseTransformPoint(hit.point)
因此:

(5,-5)---(-5,-5)
  |         |
  |  (0,0)  |
  |         |
(5,5)----(-5,5)
为此:

(0,0)-------(64,0)
 |             |
 |             |
 |             |
(0,36)------(64,36)
为什么不这样做:

Vector2.Scale(
        hit.transform.InverseTransformPoint(hit.point) - new Vector2(5,-5),
        new Vector2(-6.4, 3.6) 
        );
这个答案对
(5,-5)
(-6.4,3.6)
术语进行了硬编码,因为问题没有包含足够的信息来使用变量

假设平面(主摄影机)的父对象的比例为(10,10),则这应足以:

Vector3 planeScale = hit.transform.localScale;
Vector3 cameraScale = hit.transform.parent.localScale;

result = Vector2.Scale(
          hit.transform.InverseTransformPoint(hit.point) 
        - new Vector2(cameraScale * 0.5f ,-cameraScale * 0.5f),
        new Vector2(-planeScale.x * 0.5f/cameraScale.x, planeScale.y * 0.5f / cameraScale.y) 
        );

我已经用你的代码编辑了我的文章,因为它没有按预期工作。该平面没有矩形变换,所以枢轴在中间,但是反演变换点的结果很奇怪地被更新为使用局部尺度代替。听起来你的飞机有一些不同比例的双亲?你能再查一下吗?似乎有点不公平,顺便说一句,你接受了另一个答案,基本上把我所有的东西,我已经把想法放进去了,只是用一些硬编码的乘法器热固定了值…家长(主摄像头)没有缩放,处于原始位置,因此,使用lossyscale=localscale很遗憾会导致错误的结果。@Dadium我在底部添加了一些进一步的想法。这可能有助于理解为什么会得到奇怪的值。主要原因之一是平面的局部旋转导致轴翻转。。我还在努力找出为什么你的是10倍的折扣…超级酷,这帮了大忙,非常感谢。我所说的奇怪的价值观,和你遇到的问题是一样的。在场景中,没有什么比连接到摄影机的平面始终面向用户更重要的了。不过,这解决了我的问题,所以也许我以后会找到原因,但现在我很高兴。请编辑问题以包含一个。这应该包括所有相关游戏对象和任何连接的碰撞器或其他组件的层次结构。请包括
摄影机的变换(特别是显示比例)。摄影机的比例为(1,1,1)。我添加了一张它的照片,这就是为什么我没有找到解决方案,因为数字似乎是随机的(-6.4,0,3.6)是去的关键。。。lossyscale(64,1,36)给出了错误的结果,但感谢它就像一个热修复程序。。如果仔细观察,您会发现这些值是ba