使用 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
}
悬而未决的问题是:如果射线没有命中,返回什么?
我在将触摸位置转换为世界坐标时遇到问题。我希望能够在平面上单击的位置放置一个对象,但我在 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
}
悬而未决的问题是:如果射线没有命中,返回什么?