即使目标图像在 Vuforia 中丢失,也要将目标模型附加到屏幕?
Attach the target model to screen even when target image is lost in Vuforia?
我正在使用 Unity 5
和 vuforia 8.1
。我有一些奇怪的要求,当找到目标图像时,模态应该显示在屏幕上,但是当相机超出目标时,它应该仍然存在。
我正在目标图像上播放绿屏视频。我应该怎么做才能实现我的要求。
到目前为止,我正在将四边形附加到图像目标,然后附加视频播放器。
我试过的:
我去过这个。但是无法达到我的结果。任何帮助将非常感激。谢谢!
我为此使用了 DefaultTrackableEventHandler.cs 的修改版本。因为我不想更改 vuforia 自己的代码,所以我复制了所有内容并创建了一个新脚本。这是可以解决您的问题的代码。
您可以设置一个布尔值来标记您是否跟踪了一个标记。如果它没有跟踪标记,它将禁用 3d 模型(Quad),否则,它将正常工作。您可以添加另一个条件来检查新跟踪的标记是否与另一个不同。
代码:
if (_isTracked)
return;
var rendererComponents = GetComponentsInChildren<Renderer>(true);
var colliderComponents = GetComponentsInChildren<Collider>(true);
var canvasComponents = GetComponentsInChildren<Canvas>(true);
// Disable rendering:
foreach (var component in rendererComponents)
component.enabled = false;
// Disable colliders:
foreach (var component in colliderComponents)
component.enabled = false;
// Disable canvas':
foreach (var component in canvasComponents)
component.enabled = false;
我个人不喜欢 Vuforia 设置对象的方式。只有永久跟踪图像目标才有意义。
我通常将跟踪与我要定位的对象完全分开。
为此,我使用自定义 DefaultTrackableEventHandler
扩展它 UnityEvent
s(类似于 UI.Button
的 onClick
)
// We need a custom UnityEvent for passing on the
// ImageTargets transform reference
[Serializable]
public class TransformEvent : UnityEvent<Transform> { }
public class VuforiaTargetEvents : DefaultTrackableEventHandler
{
public TransformEvent onTargetFound;
public TransformEvent whileTargetTracked;
public TransformEvent onTargetLost;
protected override void OnTrackingFound()
{
base.OnTrackingFound();
onTargetFound.Invoke(transform);
StopAllCoroutines();
StartCoroutine(WhileTracked());
}
protected override void OnTrackingLost()
{
base.OnTrackingLost();
onTargetLost.Invoke(transform);
StopAllCoroutines();
}
// For more information about Coroutines see
// https://docs.unity3d.com/Manual/Coroutines.html
private IEnumerator WhileTracked()
{
// looks dangerous but is ok inside a Coroutine
// as long as you yield somewhere
while(true)
{
whileTargetTracked.Invoke(transform);
yield return null;
}
}
}
将此组件放在 ImageTarget 上。
将 Quad
单独放置在场景中的某处并将以下组件附加到它
public class PlaceOnImageTarget : MonoBehaviour
{
// In the Inspector configure
// if this object should be enabled or disabled at start
public bool startEnabled;
private void Awake()
{
gameObject.SetActive(startEnabled);
}
public void UpdatePosition(Transform imageTarget)
{
transform.position = imageTarget.position;
transform.rotation = imageTarget.rotation;
gameObject.SetActive(true);
}
}
现在在 onTargetFound
事件的 ImageTarget 中添加 1 个元素并拖入 Quad
对象。比列表中的 select 方法 PlaceOnImageTarget
-> UpdatePosition
(确保 select 说 dynamic
-> 它应该没有输入字段但会使用我们在调用事件时传入的值)
如果您希望它在跟踪 ImageTarget 时永久更新,也对 whileTargetTracked
事件重复相同的操作。
在智能手机上打字,所以没有保证,但我希望这个想法能清楚。
我正在使用 Unity 5
和 vuforia 8.1
。我有一些奇怪的要求,当找到目标图像时,模态应该显示在屏幕上,但是当相机超出目标时,它应该仍然存在。
我正在目标图像上播放绿屏视频。我应该怎么做才能实现我的要求。
到目前为止,我正在将四边形附加到图像目标,然后附加视频播放器。
我试过的:
我去过这个
我为此使用了 DefaultTrackableEventHandler.cs 的修改版本。因为我不想更改 vuforia 自己的代码,所以我复制了所有内容并创建了一个新脚本。这是可以解决您的问题的代码。
您可以设置一个布尔值来标记您是否跟踪了一个标记。如果它没有跟踪标记,它将禁用 3d 模型(Quad),否则,它将正常工作。您可以添加另一个条件来检查新跟踪的标记是否与另一个不同。
代码:
if (_isTracked)
return;
var rendererComponents = GetComponentsInChildren<Renderer>(true);
var colliderComponents = GetComponentsInChildren<Collider>(true);
var canvasComponents = GetComponentsInChildren<Canvas>(true);
// Disable rendering:
foreach (var component in rendererComponents)
component.enabled = false;
// Disable colliders:
foreach (var component in colliderComponents)
component.enabled = false;
// Disable canvas':
foreach (var component in canvasComponents)
component.enabled = false;
我个人不喜欢 Vuforia 设置对象的方式。只有永久跟踪图像目标才有意义。
我通常将跟踪与我要定位的对象完全分开。
为此,我使用自定义 DefaultTrackableEventHandler
扩展它 UnityEvent
s(类似于 UI.Button
的 onClick
)
// We need a custom UnityEvent for passing on the
// ImageTargets transform reference
[Serializable]
public class TransformEvent : UnityEvent<Transform> { }
public class VuforiaTargetEvents : DefaultTrackableEventHandler
{
public TransformEvent onTargetFound;
public TransformEvent whileTargetTracked;
public TransformEvent onTargetLost;
protected override void OnTrackingFound()
{
base.OnTrackingFound();
onTargetFound.Invoke(transform);
StopAllCoroutines();
StartCoroutine(WhileTracked());
}
protected override void OnTrackingLost()
{
base.OnTrackingLost();
onTargetLost.Invoke(transform);
StopAllCoroutines();
}
// For more information about Coroutines see
// https://docs.unity3d.com/Manual/Coroutines.html
private IEnumerator WhileTracked()
{
// looks dangerous but is ok inside a Coroutine
// as long as you yield somewhere
while(true)
{
whileTargetTracked.Invoke(transform);
yield return null;
}
}
}
将此组件放在 ImageTarget 上。
将 Quad
单独放置在场景中的某处并将以下组件附加到它
public class PlaceOnImageTarget : MonoBehaviour
{
// In the Inspector configure
// if this object should be enabled or disabled at start
public bool startEnabled;
private void Awake()
{
gameObject.SetActive(startEnabled);
}
public void UpdatePosition(Transform imageTarget)
{
transform.position = imageTarget.position;
transform.rotation = imageTarget.rotation;
gameObject.SetActive(true);
}
}
现在在 onTargetFound
事件的 ImageTarget 中添加 1 个元素并拖入 Quad
对象。比列表中的 select 方法 PlaceOnImageTarget
-> UpdatePosition
(确保 select 说 dynamic
-> 它应该没有输入字段但会使用我们在调用事件时传入的值)
如果您希望它在跟踪 ImageTarget 时永久更新,也对 whileTargetTracked
事件重复相同的操作。
在智能手机上打字,所以没有保证,但我希望这个想法能清楚。