如何在ARCORE v1.2.0中停止平面检测

时间:2018-06-27 12:02:37

标签: unity3d arcore

如何通过赋予用户功能通过按任意按钮或任何种类的命令停止平面来停止在ARCORE v1.2.0中检测平面?

4 个答案:

答案 0 :(得分:0)

您可以通过禁用平面生成器预制件或用于检测和可视化这些平面的任何预制件来执行此操作。 点击按钮后,将GameObject的活动状态设置为false

DetectedPlanePrefab.setActive(false);

其中DetectedPlanePrefab是GameObject。这是我知道的最简单的方法。

答案 1 :(得分:0)

我假设您正在使用 DetectedPlaneGenerator 类来检测GoogleARCore软件包中提供的统一平面。

在其Update()方法中: 以下代码段负责平面检测,并在实例化此平面预制件之后。

Session.GetTrackables<DetectedPlane>(m_NewPlanes, TrackableQueryFilter.New);

它使用 DetectedPlane (其他三个可跟踪对象之一)来使用 GetTrackables 方法搜索飞机。

要启用/禁用此平面检测,只需在Update()中简单地进行bool检查,您就可以以任何方式进行处理,我添加了两个新方法,以便您可以添加按钮调用以启用和禁用它。

bool search = false;

public void StartSearch()
{
    search = true;
}

public void StopSearch()
{
    search = false;
}

public void Update()
{
    // Check that motion tracking is tracking.
    if (Session.Status != SessionStatus.Tracking)
    {
        return;
    }

    if(search){
        Session.GetTrackables<DetectedPlane>(m_NewPlanes, TrackableQueryFilter.New);
        for (int i = 0; i < m_NewPlanes.Count; i++)
        {
            GameObject planeObject = Instantiate(DetectedPlanePrefab, Vector3.zero, Quaternion.identity, transform);
            planeObject.GetComponent<DetectedPlaneVisualizer>().Initialize(m_NewPlanes[i]);
        }
    }
}

您可以通过禁用此脚本附加到的组件的所有子对象来进一步实例化平面预制件,因为这些预制件被实例化为其子gameObjects。

答案 2 :(得分:0)

最初创建bool以限制表面检测代码,并最初将bool设置为true。

bool isSurfaceDetected = true;

if (isSurfaceDetected) {


            Session.GetTrackables<TrackedPlane> (_newPlanes, TrackableQueryFilter.New);

            // Iterate over planes found in this frame and instantiate corresponding GameObjects to visualize them.
            foreach (var curPlane in _newPlanes) {
                // Instantiate a plane visualization prefab and set it to track the new plane. The transform is set to
                // the origin with an identity rotation since the mesh for our prefab is updated in Unity World
                // coordinates.
                var planeObject = Instantiate (plane, Vector3.zero, Quaternion.identity,
                                      transform);
                planeObject.GetComponent<DetectedPlaneVisualizer> ().Initialize (curPlane);

                //              Debug.Log ("test....");

                // Apply a random color and grid rotation.
                //          planeObject.GetComponent<Renderer>().material.SetColor("_GridColor", new Color(Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f), Random.Range(0.0f, 1.0f)));
                //          planeObject.GetComponent<Renderer>().material.SetFloat("_UvRotation", Random.Range(0.0f, 360.0f));

                //

            }

在画布上创建一个停止按钮,并在方法下方附加

public void StopTrack()
    {
        // Make isSurfaceDetected to false to disable plane detection code
        isSurfaceDetected = false;
        // Tag DetectedPlaneVisualizer prefab to Plane(or anything else)
        GameObject[] anyName = GameObject.FindGameObjectsWithTag ("Plane");
        // In DetectedPlaneVisualizer we have multiple polygons so we need to loop and diable DetectedPlaneVisualizer script attatched to that prefab.
        for (int i = 0; i < anyName.Length; i++) 
        {
            anyName[i].GetComponent<DetectedPlaneVisualizer> ().enabled = false;
        }

    }

确保停止按钮方法在ARController中

答案 3 :(得分:0)

转到GoogleARCore->配置-> DefaultSessionConfig,然后在Inspector窗口中将PlaneFindingMode更改为 Disabled

GameObject.Find ("ARCore Device").GetComponent<ARCoreSession> ().getConfig().setPlaneFindingMode(Config.PlaneFindingMode.DISABLED);