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

问题描述 投票:-1回答:1

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

storePos.Add(hit.Pose.position);

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

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

在尝试这段代码时,它不起作用,我已经想到了为什么但是很难找到解决这个问题的原因。在继续解决这个问题的同时,我会感谢一些建议,答案或提示! :)

c# unity3d arcore
1个回答
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");
            }

         }   
© www.soinside.com 2019 - 2024. All rights reserved.