在ARCore unity中禁用/切换跟踪平面的可视化

Adi*_*l.R 3 c# android unity-game-engine arcore

我一直在寻找ARCore Unity的代码已有一段时间,我想做一个简单的任务,就是有一个切换按钮,以便用户可以在场景中放置对象,同时知道在跟踪平面可见的情况下将对象放置在哪里并且,一旦用户放置了对象,便可以在视觉上禁用跟踪的平面,从而使它看起来更逼真。通过在主HelloArActivity.java中执行以下操作,我可以在Android Studio中做到这一点:

if (planeToggle) {
                mPlaneRenderer.drawPlanes(mSession.getAllPlanes(), frame.getPose(), projmtx);
            }
Run Code Online (Sandbox Code Playgroud)

这真的很简单。我创建了一个名为planeToggle的布尔型,并将mPlaneRenderer.drawPlanes函数置于if条件中。当布尔值为true时,它显示飞机;而布尔值为false时,它不显示飞机。

但是,对于Unity我感到困惑。我在HelloARController.cs中做了这样的事情:

我做了一个按钮来切换平面。设置一个事件侦听器以切换一个布尔变量,并执行以下操作:

for (int i = 0; i < m_newPlanes.Count; i++)
                {
                // 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.

                GameObject planeObject = Instantiate(m_trackedPlanePrefab, Vector3.zero, Quaternion.identity,
                        transform);
                    planeObject.GetComponent<TrackedPlaneVisualizer>().SetTrackedPlane(m_newPlanes[i]);

                    m_planeColors[0].a = 0;

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


        if (togglePlanes == false){    // my code

          planeObject.SetActive(false); // my code

          } //
  }
Run Code Online (Sandbox Code Playgroud)

当我按下切换按钮时,什么也没有发生。

我的另一个选择是在TrackedPlaneVisualizer.cs中进行如下更改:

for (int i = 0; i < planePolygonCount; ++i)
            {
                Vector3 v = m_meshVertices[i];

                // Vector from plane center to current point
                Vector3 d = v - planeCenter;

                float scale = 1.0f - Mathf.Min((FEATHER_LENGTH / d.magnitude), FEATHER_SCALE);
                m_meshVertices.Add(scale * d + planeCenter);

                if (togglePlanesbool == true) // my code
                {
                    m_meshColors.Add(new Color(0.0f, 0.0f, 0.0f, 1.0f)); // my code
                }

                else
                {
                    m_meshColors.Add(new Color(0.0f, 0.0f, 0.0f, 0.0f)); // my code
                }
     }
Run Code Online (Sandbox Code Playgroud)

这确实有效。但是我遇到了切换的延迟,有时如果渲染了两个不同的平面,它们将开始在它们自己之间切换(如果启用了一个,则禁用了另一个)。所以我想这也是不可行的选择。...谁能提供帮助?

请注意,我是Unity的初学者。

Cla*_*son 6

该示例并非真正用于隐藏和显示飞机,因此您必须添加一些内容。

首先,没有代表ARCore平面的GameObjects的集合。最简单的方法是向游戏对象添加标签:

在Unity编辑器中,找到TrackedPlaneVisualizer预制件并选择它。然后在属性检查器中,下拉标签下拉列表并添加一个名为plane的标签。

接下来,在Toggle处理程序方法中,您需要找到所有带有“ plane”标记的游戏对象。然后获取Renderer和TrackedPlaneVisualizer组件,并根据切换启用或禁用它们。您需要同时做这两个组成部分。渲染器绘制平面,TrackedPlaneVisualizer重新启用渲染器(理想情况下,它将接受渲染器的状态)。

    public void OnTogglePlanes(bool flag) {
        showPlanes = flag;
        foreach (GameObject plane in GameObject.FindGameObjectsWithTag ("plane")) {
            Renderer r = plane.GetComponent<Renderer> ();
            TrackedPlaneVisualizer t = plane.GetComponent<TrackedPlaneVisualizer>();
            r.enabled = flag;
            t.enabled = flag;
        }
    }
Run Code Online (Sandbox Code Playgroud)

您还可以在实例化GameObject的地方做类似的事情,因此新的飞机将使用该切换。