c# - 当 PlaneFinderBehaviour 使用 Vuforia 7 接收输入时触发自定义方法

标签 c# unity3d vuforia

今天,我开始尝试使用 Vuforia 7 及其地平面/平面查找器功能进行一些操作。我做了在 Vuforia 网站上找到的简单示例,现在我正在尝试用它创建一个简单的应用程序。

我想要完成的是,当 Vuforia PlaneFinderBehaviour 检测到一个平面时,我想在屏幕上显示一个工具箱,用户可以在其中选择几个原始 3D 游戏对象(立方体、球体、圆柱体)。选择所需的 3D 游戏对象后,我希望它出现在 Vuforia 检测到的地面上。接下来,当四处走动并且 Vuforia 再次检测到地面时,需要出现相同的工具箱,用户可以在其中选择要放置在地面上的不同类型的 3D 游戏对象。

在 Unity 中摸索之后,我仍然无法创建自己的 PlaneFinderBehaviour C# 脚本,其中包含 Vuforia 检测到地面时需要触发的方法。

我做了什么:

  • 创建了一个 C# 脚本,该脚本扩展了 PlaneFinderBehaviour 并具有一个名为 CustomPerformHitTest 的方法,该方法只是将一些内容打印到控制台中。
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using Vuforia;

public class CustomPlaneFinderBehaviour : PlaneFinderBehaviour
{
    public void CustomPerformHitTest(Vector2 screenPosition)
    {
        print("CustomPlaneFinderBehaviour > CustomPerformHitTest has been triggered");
    }
}
  • 用我的自定义脚本替换了 PlaneFinder 游戏对象的默认 PlaneFinderBehaviour

CustomPlaneFinderBehaviour

有人可以给我正确的方向并解释 Vuforia 的平面检测是如何工作的,以便我了解我做错了什么。

谢谢!

最佳答案

您不需要自定义平面查找器行为即可实现此目的。只需使用标准 PlaneFinderBehaviour 的基本事件 OnAutomaticHitTest

OnAutomaticHitTest 在检测到平面的每一帧触发。 因此您可以使用此事件来切换您的工具箱。 (如果事件在最后一帧期间被触发,则以某种方式记录。例如,如果事件被触发,您可以记录帧数,然后在 LateUpdate 函数中进行比较。如果帧数匹配,您就会知道当前检测到飞机,如果没有……那么就没有。)

然后,如果显示了您的工具箱并且您的用户与之交互,只需触发 PlaneFinderBehaviour 的公共(public)方法 PerformHitTest。此方法从给定的屏幕位置发射光线并返回地平面上的相应位置。如果此方法成功,则调用 OnInteractiveHitTestPlaneFinderBehaviour 的另一个事件将被触发。

听这个事件然后像这样定位/生成内容:

public class CustomContentPositioningBehaviour : MonoBehaviour
{
    public GameObject yourContentPrefab;

    private PositionalDeviceTracker deviceTracker;
    private GameObject previousAnchor;

    public void Awake()
    {
        VuforiaARController.Instance.RegisterVuforiaStartedCallback( OnVuforiaStarted );
    }

    public void OnDestroy()
    {
        VuforiaARController.Instance.UnregisterVuforiaStartedCallback( OnVuforiaStarted );
    }

    private void OnVuforiaStarted()
    {
        deviceTracker = TrackerManager.Instance.GetTracker<PositionalDeviceTracker>();
    }

    public void SpawnContent( HitTestResult result )
    {
        if( result == null || yourContentPrefab == null)
        {
            Debug.LogWarning( "Hit test is invalid or content is not set" );
            return;
        }

        var anchor = deviceTracker.CreatePlaneAnchor( Guid.NewGuid().ToString(), result );
        if( anchor != null )
        {
            anchor.transform.parent = this.gameObject.transform;

            GameObject content = Instantiate( yourContentPrefab );

            content.transform.parent = anchor.transform;
            content.transform.localPosition = Vector3.zero;
            content.transform.localRotation = Quaternion.identity;
            content.SetActive( true );
        }

        if( previousAnchor != null )
        {
            Destroy( previousAnchor );
        }

        previousAnchor = anchor;
    }
 }

SpawnContentOnInteractiveHitTest 事件处理程序调用。如果您有不同类型的内容,您当然需要在此方法中区分它们。

关于c# - 当 PlaneFinderBehaviour 使用 Vuforia 7 接收输入时触发自定义方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49221948/

相关文章:

c# - 从代码隐藏中获取重写的 url

ios - 在 iOS 应用程序的一个 View 中使用 Unity3D

android - Unity3D + Glass 开发套件预览

android - 在 vuforia 增强现实应用程序中运行时选择 3d 模型

带有 Digimarc 的 Android Unity3d 和 VUForia。初始化失败!您的硬件不支持此应用程序

c# - MVC 中的 URL 编码 token

c# - 将 SPFile 保存到本地硬盘

ios - 团结,Vuforia iOs 'App rejected Due to Non-public API'

c# - Linq Select Query 或 For Loop 哪种方式更好地搜索通用列表中的内容?

unity3d - 什么是烘焙 GI 设置中的环境光遮蔽?