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");
}
}
我是 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");
}
}