当 PlaneFinderBehaviour 使用 Vuforia 7 接收输入时触发自定义方法
Trigger custom method when PlaneFinderBehaviour receives input with Vuforia 7
今天我开始尝试使用 Vuforia 7 及其地平面/平面查找器功能进行一些操作。我做了在 Vuforia 网站上找到的简单示例,现在我正在尝试用它创建一个简单的应用程序。
我想要完成的是,当 Vuforia PlaneFinderBehaviour 检测到一架飞机时,我想在屏幕上显示一个工具箱,用户可以在其中 select 在几个原始 3D 游戏对象(立方体、球体)之间, 缸)。 select 生成所需的 3D 游戏对象后,我希望它出现在 Vuforia 检测到的地面上。接下来,当四处走动并且 Vuforia 再次检测到地面时,需要出现相同的工具箱,用户可以在其中 select 将不同类型的 3D 游戏对象放置在地面上。
在 Unity 中折腾后,我仍然没有成功创建自己的 PlaneFinderBehaviour C# 脚本,其中包含 Vuforia 检测到地面时需要触发的方法。
我做了什么:
- 创建了一个扩展
PlaneFinderBehaviour
的 C# 脚本,并有一个名为 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 GameObject 的默认
PlaneFinderBehaviour
有人可以给我正确的方向并解释 Vuforia 的平面检测是如何工作的,以便我了解我做错了什么。
谢谢!
您不需要自定义平面查找器行为即可实现此目的。只需使用标准 PlaneFinderBehaviour
.
的基本事件 OnAutomaticHitTest
OnAutomaticHitTest
在检测到平面的每一帧触发。 因此您可以使用此事件来切换您的工具箱。 (如果事件在最后一帧期间被触发,则以某种方式记录。例如,如果事件被触发,您可以记录帧数,然后在 LateUpdate
函数中进行比较。如果帧数匹配,则您知道当前有一架飞机检测到,如果没有...那么就没有。)
然后,如果显示了您的工具箱并且您的用户与之交互,只需触发 PlaneFinderBehaviour
的 public 方法 PerformHitTest
。此方法从给定的屏幕位置和地平面上的相应位置 returns 发射一条射线。如果此方法成功,则 PlaneFinderBehaviour
的另一个名为 OnInteractiveHitTest
的事件将被触发。
收听此事件,然后 position/spawn 内容如下:
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;
}
}
SpawnContent
从 OnInteractiveHitTest
事件处理程序调用。如果您有不同类型的内容,您当然需要在此方法中区分它们。
今天我开始尝试使用 Vuforia 7 及其地平面/平面查找器功能进行一些操作。我做了在 Vuforia 网站上找到的简单示例,现在我正在尝试用它创建一个简单的应用程序。
我想要完成的是,当 Vuforia PlaneFinderBehaviour 检测到一架飞机时,我想在屏幕上显示一个工具箱,用户可以在其中 select 在几个原始 3D 游戏对象(立方体、球体)之间, 缸)。 select 生成所需的 3D 游戏对象后,我希望它出现在 Vuforia 检测到的地面上。接下来,当四处走动并且 Vuforia 再次检测到地面时,需要出现相同的工具箱,用户可以在其中 select 将不同类型的 3D 游戏对象放置在地面上。
在 Unity 中折腾后,我仍然没有成功创建自己的 PlaneFinderBehaviour C# 脚本,其中包含 Vuforia 检测到地面时需要触发的方法。
我做了什么:
- 创建了一个扩展
PlaneFinderBehaviour
的 C# 脚本,并有一个名为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 GameObject 的默认
PlaneFinderBehaviour
有人可以给我正确的方向并解释 Vuforia 的平面检测是如何工作的,以便我了解我做错了什么。
谢谢!
您不需要自定义平面查找器行为即可实现此目的。只需使用标准 PlaneFinderBehaviour
.
OnAutomaticHitTest
OnAutomaticHitTest
在检测到平面的每一帧触发。 因此您可以使用此事件来切换您的工具箱。 (如果事件在最后一帧期间被触发,则以某种方式记录。例如,如果事件被触发,您可以记录帧数,然后在 LateUpdate
函数中进行比较。如果帧数匹配,则您知道当前有一架飞机检测到,如果没有...那么就没有。)
然后,如果显示了您的工具箱并且您的用户与之交互,只需触发 PlaneFinderBehaviour
的 public 方法 PerformHitTest
。此方法从给定的屏幕位置和地平面上的相应位置 returns 发射一条射线。如果此方法成功,则 PlaneFinderBehaviour
的另一个名为 OnInteractiveHitTest
的事件将被触发。
收听此事件,然后 position/spawn 内容如下:
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;
}
}
SpawnContent
从 OnInteractiveHitTest
事件处理程序调用。如果您有不同类型的内容,您当然需要在此方法中区分它们。