【问题标题】:Translating screen touch position to world position in AR with AR Foundation使用 AR Foundation 将屏幕触摸位置转换为 AR 中的世界位置
【发布时间】: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);

【问题讨论】:

    标签: c# unity3d augmented-reality


    【解决方案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);
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-08-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-04
        • 1970-01-01
        相关资源
        最近更新 更多