【问题标题】:Create objects with ground plane detection only once with Vuforia & Unity使用 Vuforia 和 Unity 仅创建一次具有地平面检测的对象
【发布时间】:2023-04-09 11:54:01
【问题描述】:

我正在尝试使用 Unity 和 Vuforia 创建 AR 应用。我有一个 3D 模型,需要在检测到地平面时生成。但这只需要发生一次。 Vuforia 的工作方式是,当检测到新平面时,它会继续生成对象。所以我需要做的是要么只检测一次平面,要么只生成一次对象。由于我是 Unity 的新手,因此我需要帮助。如果有人能告诉我我需要做些什么来实现这一目标,那就太好了。

【问题讨论】:

    标签: c# unity3d vuforia


    【解决方案1】:

    大多数答案都是正确的,但有点过时了,正确的方法是通过代码。

    例如创建一个名为 GameManager 的游戏对象,并将 GroundPlaneStage 和要生成的对象的预制件传递给附加到该 GameManager 的脚本,例如称为 GameManagerScript.cs,并创建一个名为 spawnObjects 的小函数,它执行以下操作:

    public class SceneManagerScript : MonoBehaviour {
    
        public GameObject objPrefab;
        public GameObject ground;
        private int count = 0;
    
        public void spawnObject() {
            Instantiate(objPrefab, new Vector3(count, 0, 0), Quaternion.identity, ground.transform);
        count += 2; 
        }
    }
    

    然后转到 PlaneFinder,专门针对 PlaneFinderBehaviour.cs 组件,您将获得 OnInteractiveHitTest 和 OnAutomaticHitTest 的回调,在您需要 OnAutomativeHitTest 的情况下,单击 + 并添加一个新的回调(上面代码中的函数 spawnObject,如下图)

    1. 另外,当您通过预制件实例化您偏好的对象时,不要忘记编写正确的位置更新,以防止将对象添加到同一位置
    2. 也不要忘记将 GroundPlaneStage 设置为对象的父对象,并意识到您在 Instantiate() 函数中添加的位置是相对于该父对象的(在上面的代码中使用变量 ground 表示的 GroundPlaneStage)
    3. 最后别忘了在 Plane Finder 的“Content Positioning Behaviour”组件中取消勾选 Duplicate Stage,如下图所示:

    希望对你有帮助

    【讨论】:

      【解决方案2】:

      请尝试 vuforia 网站解决此问题

      Introduction to Ground Plane in Unity

      【讨论】:

        【解决方案3】:

        我挣扎了很久,总之我们必须在命中后禁用 AnchorInputListenerBehaviour

        1. 我在 PlaneFinder 上附加了一个新脚本,代码如下:

          <!-- language-all: c# -->
          public void OnInteractiveHitTest(HitTestResult result)
          {
              var listenerBehaviour = GetComponent<AnchorInputListenerBehaviour>();
              if (listenerBehaviour != null)
              {
                  listenerBehaviour.enabled = false;
              }
           }
          
        2. 我在 Plane Finder Behavior 上添加了事件

        就这些了,希望对你有用。

        【讨论】:

        • 我尝试使用该脚本,但无法使其正常工作。视觉给了我一堆错误。
        【解决方案4】:

        对于更新版本:

        转到“高级”设置和“开启交互式命中测试”脚本 -> 为脚本选择“关闭”选项。

        【讨论】:

          【解决方案5】:

          Vuforia 已更新。现在没有 DeploymentStageOnce 脚本。为了在我们触摸时停止复制,我们必须在 Content Positioning Behavior (Script) 中关闭 Duplicate Stage,当我们单击 Plane Finder 时检查 Inspector。

          【讨论】:

          • 做到了。仍在多次部署对象。
          【解决方案6】:

          在您的应用中,您应该在某处有一个 Plane Finder 对象,并默认设置以下属性

          Plane Finder 对象附加了一个 Behavior 组件,如果找到平面,该组件将调用 Position Content 方法。该方法属于Content Positioning Behaviour,它会创建一个Ground Plane Stage 的实例(克隆)。为了避免多个实例,您应该导入位于此处的 vuforia Deploy Stage Once 脚本:https://library.vuforia.com/articles/Solution/ground-plane-guide.html,您应该将 Plane Finder Behaviour 更改为以下内容:

          【讨论】:

          • 这并没有解决我的问题。当我单击新飞机时,会弹出一个新模型。现在我也有另一个问题……模型甚至在地面检测之前就显示在相机之前。并在检测到地平面时正常消失并再次出现。
          • @AnupGPrasad 引用:“Vuforia 的工作方式是,当检测到新平面时,它会继续生成对象。”你没有说任何关于点击的事情。不过我知道你在说什么,因为我已经为自己解决了这个问题。提示:转到此页面library.vuforia.com/articles/Solution/ground-plane-guide.html 并查看第 15 号
          • 好的。我在带有动作的模型上有一个交互式按钮。如果我替换脚本,这会不会与此发生冲突?
          • @AnupGPrasad 我不明白这个问题。
          • Vuforia 文档缺少为 onInteractiveHitTest 更新 PlaneFinder 功能的关键步骤。感谢您使用屏幕截图明确说明。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多