今天我开始尝试使用 Vuforia 7 和它的 Ground Plane/Plane Finder 功能。我做了在 Vuforia 网站上找到的简单示例,现在我正在尝试用它创建一个简单的应用程序。

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

在 Unity 中搞砸之后,我仍然没有设法创建我自己的 PlaneFinderBehaviour C# 脚本,该脚本需要在 Vuforia 检测到地面时触发。

我做了什么:

  • 创建了一个扩展 PlaneFinderBehaviour 的 C# 脚本,并有一个名为 CustomPerformHitTest 的方法,它只是将一些内容打印到控制台中。


  • 用我的自定义脚本
  • 替换了 PlaneFinder 游戏对象的默认 PlaneFinderBehaviour
    c# - 当 PlaneFinderBehaviour 使用 Vuforia 7 接收输入时触发自定义方法-LMLPHP

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

    谢谢!

    最佳答案

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

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

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

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

    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/

    10-12 21:36