本文介绍了如何增加一个定制的3D模型实例化时图像的目标,根据目标检测,使用Vuforia在Unity中的延伸和预置实例化技术。
步骤:
1.创建一个Unity项目,导入ImageTarget,打开ImageTarget场景。
2.让我们假设,为了便于参考,我们要动态地在运行时添加一个自定义的三维模型的“chips”的ImageTarget。
3.选择“chips”,消除场景中的茶壶3D模型,这样ImageTarget下没有子物体。
4.在项目视图中, 在Assets文件夹下创建一个Prefabs(如果你没有)。
5.添加一个预设物体到Prefabs;有许多方法可以创建制定的预设对象;例如,你可以创建你的场景视图的一个简单的游戏对象,然后拖动它从场景到预设的文件夹在项目视图;或者,你可以导入支持Unity的3D模型。
6.创建一个C#脚本,叫 MyModelInstantiator。并将它附到“chips”下。
7.把下面的代码放入脚本中并保存它:
using UnityEngine;
using System.Collections;
using Vuforia;
public class MyPrefabInstantiator : MonoBehaviour, ITrackableEventHandler
{
private TrackableBehaviour mTrackableBehaviour;
public Transform myModelPrefab;
// Use this for initialization
void Start ()
{
mTrackableBehaviour = GetComponent();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
}
public void onTrackableStateChanged(
TrackableBehaviour.Status previousStatus,
TrackableBehaviour.Status newStatus)
{
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
{
onTrackingFound();
}
}
private void onTrackingFound()
{
if (myModelPrefab != null)
{
Transform myModelTrf = GameObject.Instantiate(myModelPrefab) as Transform;
myModelTrf.parent = mTrackableBehaviour.transform;
myModelTrf.localPosition = new Vector3(0f, 0f, 0f);
myModelTrf.localRotation = Quaternion.identity;
myModelTrf.localScale = new Vector3(0.0005f, 0.0005f, 0.0005f);
myModelTrf.gameObject.active = true;
}
}
}
8.正如你可以从代码中看到的,MyModelInstantiator类实现了 ITrackableEventHandler接口,所以它被调用时,检测到目标。预制的3D模型实例化,并且附到ImageTarget下,3D模型大小和位置都调整过,因此可以很漂亮的增强在目标上。(请调整好你需要模型的位置,旋转和缩放)
9.另外,脚本中包含一个公共变量叫做MyPrefabModel,如果你现在回到Unity场景中点击ImageTarget,在属性窗口下,你会看到MyModelInstantiator脚本所在的物体中多了一个叫做My Prefab Model的文件,选择你的Prefab,将它拖到My Prefab Model。
10.保存场景并运行,当扫到识别图时,你预设的3D模型就会显示出来。
Ps:如果模型的大小是太小或太大,去脚本代码中调整localScale的值。如果要展示的模型过多,推荐使用这种方法。 |
|
|
|
|
|