使用 AR Foundation 将屏幕触摸位置转换为 AR 中的世界位置

Translating screen touch position to world position in AR with AR Foundation

我在将触摸位置转换为世界坐标时遇到问题。我希望能够在平面上单击的位置放置一个对象,但我在 Z 轴方面遇到了问题。

我正在使用 camera.ScreenToWorldPoint() 将 Vector2 触摸位置转换为世界位置,但我似乎无法正确设置 Z 轴。

Vector3 pos = new Vector3(vector2.x, vector2.y);
pos = camera.ViewportToScreenPoint(pos);
Ray ray = camera.ScreenPointToRay(new Vector3(pos.x, pos.y, 0));
RaycastHit hit;

if (Physics.Raycast(ray, out hit))   
{
    distance = hit.distance;    
}

pos = new Vector3(pos.x, pos.y, distance);
return camera.ScreenToWorldPoint(pos);

假设您的起始 z 轴位置为 10,您的命中 z 轴位置为 30,则距离为 20,但您的命中位置为 30。

//pos = new Vector3(pos.x, pos.y, distance);
pos = new Vector3(pos.x, pos.y, hit.position.z);

没有need/it首先通过ViewportToScreenPoint转换它是没有意义的.. Touch.position已经在像素屏幕中space。

然后就可以直接传入ScreenPointToRay,它需要这样一个像素space的位置。

最后,如果您已经有了 RaycastHit,那么通过 hit.distance 再次重新计算 3D 世界 space 位置是没有意义的,而是直接使用 RaycastHit.point!

所以假设 vector2 等于你的触摸位置 像素 space 它宁愿只是

var ray = camera.ScreenPointToRay(vector2);

if (Physics.Raycast(ray, out var hit))   
{
    var hitPos = hit.point;

    // ... whatever you want to do with the hit position   
}

悬而未决的问题是:如果射线没有命中,返回什么?