ARCore 存储 Anchor/HitTrackable 个位置并进行比较

ARCore Storing Anchor/HitTrackable positions and comparing

我是 unity 的新手,我想在 HelloARController 脚本中创建一个简单的函数。在此脚本中,我试图做的是存储 Andy 对象在现实世界中的放置位置。我在 Update() 方法中使用以下代码执行此操作:

storePos.Add(hit.Pose.position);

根据我自己的理解,hit.Pose.position 是用户点击屏幕位置相对于现实世界的 3D 定位 space(我假设。经过一些研究,我得出了这个结论。请随时纠正我!)。所以我所做的是将这些坐标存储在一个列表中。如果用户再次点击或点击相同坐标的某处,我只想生成一个 canvas。为此,我使用 for 循环将命中位置与之前存储的位置进行比较,如下所示:

for (int i = 0; i < storePos.Count; i++)
                    {
                        if (hit.Pose.position == storePos[i])
                        {
                            etc...
                        }
                    }

尝试此代码时,它不起作用,我想出了一些原因,但一直在努力寻找解决此问题的方法。在继续解决这个问题的同时,我将不胜感激一些建议、答案或提示! :)

正如我在评论中所说,这完全有道理,您的代码无法正常工作。由于浮点值的精度,考虑将两个浮点值与 == 进行比较不起作用,将 vector3s' 与 3 个浮点数进行比较是不可能的。为了实现这一点,您可以为每个存储点定义一个半径,并检查新触摸是否在任何点的半径内,如下所示:

float distance = 0.0f;
for (int i = 0; i < storePos.Count; i++)
{
         distance = (hit.Pose.position - storePos[i]).magnitude;
         // 0.1 as radius
         if (distance < 0.1f )
         {
             etc...
         }
 }

此外,如果您想实现类似点击 Andy 对象并生成 canvas 的效果,您可以像这样使用 Raycasting

        Touch touch;
        if (!(Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began))
        {

            Ray ray = Camera.main.ScreenPointToRay(touch.position);
            RaycastHit hit;

            if (Physics.Raycast(ray, out hit, 100))
            {                    
                Debug.Log(hit.transform.gameObject+" Object is hit");
            }

         }