我目前正在尝试检测触摸输入是否击中了我的ARCore场景中的3D对象。我只是编辑了HelloAR示例脚本,以使用自定义预制而不是andy对象,并且在生成它之后,我希望能够对其进行触摸。预制件由六个3D平台组成,每个平台都有不同的名称和一个盒子碰撞器。以下代码给出了非常奇怪的结果。
if (Frame.Raycast(touch.position.x, touch.position.y, raycastFilter, out hit))
{
// Use hit pose and camera pose to check if hittest is from the
// back of the plane, if it is, no need to create the anchor.
if ((hit.Trackable is DetectedPlane) &&
Vector3.Dot(FirstPersonCamera.transform.position - hit.Pose.position,
hit.Pose.rotation * Vector3.up) < 0)
{
Debug.Log("Hit at back of the current DetectedPlane");
}
else
{
if (!IsPointerOverUIObject())
{
if(!platsSpawned)
{
// Instantiate platforms at the hit pose.
var platforms = Instantiate(platformPrefab, new Vector3(hit.Pose.position.x, hit.Pose.position.y + offsetY, hit.Pose.position.z), hit.Pose.rotation);
// Create an anchor to allow ARCore to track the hitpoint as understanding of the physical
// world evolves.
var anchor = hit.Trackable.CreateAnchor(hit.Pose);
// Make platforms a child of the anchor.
platforms.transform.parent = anchor.transform;
platsSpawned = true;
}
else if (platsSpawned)
{
//Ray raycast = Camera.main.ScreenPointToRay(Input.GetTouch(0).position);
Ray raycast = FirstPersonCamera.ScreenPointToRay(Input.GetTouch(0).position);
RaycastHit raycastHit;
if (Physics.Raycast(raycast, out raycastHit))
{
try
{
debugLabel.text = raycastHit.collider.name;
var obj = GameObject.Find(raycastHit.collider.name);
obj.GetComponent<SomeScript>().DoeSmthng();
}
catch (Exception ex)
{
Debug.Log(ex.Message);
}
}
}
}
}
}
运行此代码,有时将不会碰到任何平台(即使您清楚地触摸它们),有时会正确检测到触摸,有时会碰到预制件中的任何其他平台(即使只有一个平台)目前可见)。
我觉得Raycast发生了一些奇怪的事情。我尝试使用“ Camera.main”和“ FirstPersonCamera”进行投射,但结果几乎相同。
关于为什么发生这种情况的任何想法?有人有适当的示例吗,或者可以帮助我更正我的代码?
编辑:我发现只要平台对象不是锚点的子代,RayCast便可以正常工作。我认为对象可能会变成“可跟踪对象”,但我不确定如何处理这些对象。