ARCore存储锚点/命中率位置并进行比较

时间:2019-02-20 06:36:34

标签: c# unity3d arcore

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

storePos.Add(hit.Pose.position);

据我自己的理解,hit.Pose.position是用户点击屏幕相对于现实空间的3D位置(我假设。经过研究后,我得出了这一结论。请随意纠正我!)。所以我要做的是将这些坐标存储在一个列表中。如果用户再次点击或点击相同坐标的某个位置,我只想生成画布。通过使用for循环将命中位置与以前存储的位置进行比较,来做到这一点:

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

尝试此代码时,它不起作用,我想到了一些原因,但为什么要努力找到解决该问题的方法。在继续弄清楚这一点的同时,我将不胜感激一些建议,答案或技巧! :)

1 个答案:

答案 0 :(得分:0)

正如我在评论中所说,这完全可以说明您的代码无法正常工作。考虑到由于浮点值的精度而无法将两个浮点值与==进行比较,因此无法比较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对象并生成画布的操作,则可以使用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");
            }

         }