Unity ARCore触摸对象

时间:2018-08-07 06:06:57

标签: c# unity3d arcore

我目前正在尝试检测触摸输入是否击中了我的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便可以正常工作。我认为对象可能会变成“可跟踪对象”,但我不确定如何处理这些对象。

0 个答案:

没有答案