使用Vuforia Engine和Unity

本文提供了为Vuforia Engine目标创作数字内容的常见操作指南。了解如何在运行时添加内容、在目标上交换3D模型或实现屏幕交互逻辑,以便用户进行直观控制。

如何在Unity中动态向目标添加内容

下面的示例演示了如何使用自定义3D模型增强图像目标,该模型在运行时使用Vuforia引擎检测目标时实例化。该脚本执行以下操作:它动态地向宇航员图像目标添加3D模型。

遵循以下步骤:

  1. 打开或创建一个Unity项目,添加图像目标游戏对象。导入带有宇航员图像的默认示例数据库,或导入并选择带有图像目标的自定义数据库。
  2. 在项目视图中,在资产文件夹,创建名为预制件.
  3. 将预制对象添加到前言文件夹。有很多方法可以创建自定义预置来表示3D对象。例如,您可以:
    • 创建一个简单的立方体游戏对象在场景视图中,然后将其从场景视图拖动到预制件项目视图中的文件夹,
    • 以Unity支持的格式导入三维模型(例如FBX公司,OBJ公司,DAE(DAE),或三维立体显示). 有关如何从各种文件格式的3D模型创建预置的详细信息,请参阅Unity网站。
  4. 创建一个C#脚本,调用它MyPrefab实例化程序,并将其连接到宇航员图像目标。
  5. 将以下代码复制到脚本中,然后保存脚本:
使用UnityEngine;使用Vuforia;公共类MyPrefabInstantiator:DefaultObserverEventHandler{公共游戏对象myModelPrefab;游戏对象mMyModelObject;受保护的覆盖void OnTrackingFound(){调试。日志(“找到目标”);//仅当模型预制尚未实例化时才实例化它if(mMyModelObject==空)实例化前缀();底座。OnTrackingFound();}void InstantiatePrefab(){if(myModelPrefab!=空){调试。日志(“找到目标,添加内容”);mMyModelObject=实例化(myModelPrefab,mObserverBehaviour.transform);mMyModelObject.transform.localScale=新矢量3(0.1f,0.1f,0.1 f);mMyModelObject。设置活动(true);}}}

这个MyPrefab实例化程序类继承自默认观察者事件处理程序类,该类负责在检测到目标时处理事件。此时,Prefab 3D模型被实例化并附加到Image Target上。

  1. 返回Unity场景视图并单击宇航员图像目标,在检查器中您将看到MyPrefab实例化程序脚本公开一个名为我的模型预制构件。
    • 在中选择预制预制件文件夹(在项目视图中)并将其拖到我的模型预制件中的字段MyPrefab实例化程序脚本组件。。
  2. 保存项目,然后生成并运行应用程序或使用播放模式。一旦检测到图像目标并跟踪,您的预制3D模型应出现在其顶部。
  3. 如果模型大小太小或太大,可以转到脚本代码并调整本地规模值。

如何在Unity中动态交换目标的3D模型

本节介绍如何在运行时将图像目标(或其他目标)的3D模型与其他3D模型交换。

  1. 打开或创建Unity项目,添加ImageTarget游戏对象。
  2. 添加三维模型作为图像目标的子对象,例如球体。
  3. 创建一个C#脚本,命名它模型交换程序。此脚本将在相机视图顶部显示一个按钮,按下该按钮后,可以将一个模型与另一个3D模型交换。在我们的示例中,这将是一个立方体。
  4. 将以下代码插入模型交换程序脚本:
使用UnityEngine;使用Vuforia;公共类ModelSwapper:MonoBehaviour{公众观察员行为目标;private bool mSwapModel=false;//将其用于初始化无效开始(){if(mTarget==null){调试。日志(“警告:未设置目标!!”);}}//每帧调用一次更新无效更新(){if(mSwapModel&&mTarget!=空){SwapModel();mSwapModel=false;}}无效OnGUI(){if(GUI按钮(新Rect(50、50、120、40),“交换模型”){mSwapModel=真;}}私有void SwapModel(){//禁用任何预先存在的增强游戏对象mExistingModel=mTarget.GameObject;for(int i=0;i<mExistingModel.transform.childCount;i++){Transform child=mExistingModel.Transform。GetChild(i);child.game对象。SetActive(假);}//创建简单的多维数据集对象游戏对象立方体=游戏对象。CreatePrimitive(PrimitiveType.Cube);//将立方体作为可跟踪游戏Object的子对象重新分配cube.transform.parent=m目标转换;//调整位置和刻度//这样它就能很好地对准目标cube.transform.localPosition=新矢量3(0,0.2f,0);cube.transform.localRotation=四元数标识;cube.transform.localScale=新矢量3(0.1f,0.1f,0.1 f);//确保它处于活动状态立方体。设置活动(true);}}
  1. 将脚本附加到阿卡梅拉游戏对象在场景视图中,
  2. 在检查器视图中,拖动目标游戏对象到现场目标.
  3. 使用播放模式测试脚本,然后按Swap模型按钮禁用球体并创建立方体作为目标的子对象。

如何使用触摸输入拖动增强

本节提供了一个脚本的示例代码,该脚本允许用户用手指在屏幕上拖动AR对象,

  1. 打开或创建新的Unity项目。添加阿卡梅拉和一辆Vuforia目标游戏对象.
  2. 将三维球体或其他三维内容作为子对象添加到目标游戏对象。内容必须具有网格碰撞器。
  3. 创建名为的新脚本拖动对象.cs。将以下代码添加到其中,并将脚本附加到阿卡梅拉。该脚本允许用户触摸和拖动周围的对象
使用UnityEngine;公共类DragObject:MonoBehaviour{private Transform pickedObject=null;private Vector3 lastPlanePoint;//每帧调用一次更新无效更新(){平面targetPlane=新平面(transform.up,transform.position);foreach(Input.Touch中的Touch Touch){//获取触摸屏幕的位置处的光线光线=Camera.main。ScreenPointToRay(触摸位置);//获取光线沿平面的位置浮动距离=0.0f;//使光线与平面相交。将dist设置为沿射线相交处的距离目标飞机。光线投射(光线,输出距离);//返回沿射线的点距离。矢量3平面点=射线。获取点(dist);//如果开始手指触摸,则为True。如果光线与碰撞器相交,请将pickedObject设置为碰撞器对象的变换if(touch.phase==TouchPhase.Began){//用于从光线投射中获取信息的结构RaycastHit命中=新的RaycastHit();if(物理.Raycast(射线,输出命中,1000)){//当Ray与对撞机相交时为True。如果为True,hit包含有关对撞机被击中位置的附加信息pickedObject=点击转换;lastPlanePoint=平面点;}其他的{pickedObject=空;}//选定对象后手指移动时移动对象。}else if(touch.phase==TouchPhase.Moved){if(pickedObject!=null){pickedObject.position+=planePoint-lastPlanePoint;lastPlanePoint=平面点;}//触摸结束后,将pickedObject设置为null。}else if(touch.phase==TouchPhase.Ended){pickedObject=空;}}}}