使用 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应用程序上触摸按钮时更改一个对象的两种材质