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

Posted

技术标签:

【中文标题】使用 AR Foundation 将屏幕触摸位置转换为 AR 中的世界位置【英文标题】:Translating screen touch position to world position in AR with AR Foundation 【发布时间】:2021-07-01 03:59:59 【问题描述】:

我在将触摸位置转换为世界坐标时遇到问题。我希望能够在平面上单击的位置放置一个对象,但是 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);

【问题讨论】:

【参考方案1】:

没有必要/没有意义首先通过ViewportToScreenPoint 转换它。Touch.position 已经在像素屏幕空间中。

然后你可以直接将它传递给ScreenPointToRay,它期望这样一个像素空间位置。

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

因此,假设vector2 等于您在像素空间中的触摸位置,那就更简单了

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   

悬而未决的问题是:如果没有任何东西被射线击中,应该返回什么?

【讨论】:

【参考方案2】:

假设你开始的z轴位置是10,你命中的z轴位置是30,距离是20,但是你的命中位置是30。

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

【讨论】:

以上是关于使用 AR Foundation 将屏幕触摸位置转换为 AR 中的世界位置的主要内容,如果未能解决你的问题,请参考以下文章

Three.js如何在AR应用程序上触摸按钮时更改一个对象的两种材质

在 ARKit 中检测对 SCNNode 不同位置的触摸

手动向左旋转横向模式的坐标系

通过触摸移动按钮

检测触摸何时开始在屏幕上的任何位置,即使是在 UIButton 上

AR地图之——经纬度到平面坐标系的转换