Нажмите, чтобы выбрать конкретную плоскость в ARCore с Unity - PullRequest
1 голос
/ 05 апреля 2019

Я пытаюсь создать модификацию примера приложения размещения Энди в ARCore, отображая только одну плоскость вместо всех обнаруженных плоскостей.Я хотел бы добиться этого, нажав на самолет, который будет оказан.Вот что я попробовал.

protected override void OnEndManipulation(TapGesture gesture)
{
    if (gesture.WasCancelled)
    {
        return;
    }

    // If gesture is targeting an existing object we are done.
    if (gesture.TargetObject != null)
    {
        return;
    }

    // Raycast against the location the player touched to search for planes.
    TrackableHit hit;
    TrackableHitFlags raycastFilter = TrackableHitFlags.PlaneWithinInfinity | TrackableHitFlags.PlaneWithinPolygon;

    if (Frame.Raycast(gesture.StartPosition.x, gesture.StartPosition.y, raycastFilter, out hit))
    {
        Debug.Log("Entered into hit if condition");
        // 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)
        {
            //var andyObject = Instantiate(AndyPrefab, hit.Pose.position, hit.Pose.rotation);
            Debug.Log("Hit at back of the current DetectedPlane");
        }
        else
        {                
            if (PlaneFixed is false)
            {
                foreach (GameObject plane in DetectedPlaneGenerator.instance.PLANES) //RK
                {
                    // THE PROBLEM IS HERE! HOW TO GET CORRECT TYPECAST?
                    if (hit.Trackable is plane)
                    {
                        Debug.Log("Plane Selected");
                        PlaneFixed = true;
                        FixPositionButton.gameObject.SetActive(true);
                    }
                    else
                    {
                        plane.SetActive(false);
                    }
                }
            }
        }
    }
}

Проблема в том, что я не могу получить правильное соответствие между GameObject (PLANES - созданным в DetectedPlaneGenerator.cs) и объектом DetectedPlane (возвращаемым при попадании.Отслеживается с использованием лучевых фильтров PlaneWithinInfinity | PlaneWithinPolygon).

Я также видел способ попытаться связать «тег» с DetectedPlaneVisualizer ( решение для этого ).Тем не менее, я вижу, что это также касается самолетов, использующих GameObject.Как сопоставить GameObject и Hit.Trackable (объект DetectedPlane), чтобы определить, какая конкретная плоскость была только что нажата?

...