我正在使用Unity 5
和vuforia 8.1
。我有些奇怪的要求,当找到目标图像时,应该在屏幕上显示模态,但是当摄像机不在目标范围内时,它仍然应该存在。
我在目标图像上播放绿屏视频。我应该怎么做才能实现我的要求。 现在,我将Quad附加到Image Target,然后附加视频播放器。
我尝试过的事情:
我访问了link。但是没有达到我的结果。任何帮助将非常感激。谢谢!
答案 0 :(得分:2)
我个人不喜欢Vuforia如何设置对象。只有永久跟踪图像目标才有意义。
我通常将跟踪与我要定位的对象完全分开。
为此,我使用自定义的DefaultTrackableEventHandler
,将其扩展为UnityEvent
s(类似于onClick
的{{1}})
UI.Button
将此组件放在ImageTarget上。
将// 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;
}
}
}
单独放置在场景中的某个位置,并将以下组件附加到它上
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);
}
}
事件的ImageTarget中添加1个元素并拖动到onTargetFound
对象中。比从列表中选择方法Quad
-> PlaceOnImageTarget
(请确保选择一个表示UpdatePosition
->的方法,它不应输入任何字段,而是使用我们传递的值调用事件时输入的内容)
如果您希望在跟踪ImageTarget的同时对其进行永久更新,则对dynamic
事件也要重复此操作。
在智能手机上输入,因此没有保修,但我希望这个想法能弄清楚。
答案 1 :(得分:0)
为此,我正在使用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;