多语言展示
当前在线:1667今日阅读:26今日分享:39

Vufoira----动态加载AR模型

在第二章中我们实现了Vufoira通过默认方式识别并显示出三维模型,默认的加载模型是通过将3D物体直接放置在场景中并作为识别目标的子物体,这种实现方式的问题是,当场景中有很多识别目标之后,场景中需要一次性加载的模型内容会占用很大的内存,因此,在实际项目案例中,都需要动态加载识别目标对应的模型,当识别丢失之后删除模型,这样保证同一时刻内存的占用是手机可以承受的。本节教程将通过预制件实例化的方式实现AR模型的动态加载和显示。
方法/步骤
1

1、创建预制件:按照上一节内容,将ImageTarget下调整好的模型拖拽到最上层,保持和ImageTarget在层级视图中为平行关系。

2

在Assets目录中创建Resources的文件夹,并将层级视图Hierachy中的模型Sphere拖拽至Resources文件夹中,然后删除层级视图Hierachy中的Sphere模型。

3

2、为需要加载的预制件添加脚本:在工程视图Project中创建一个新的c#脚本,命名为TrackObject.cs,该脚本是为了更方便的去找到识别之后被显示的物体,将其拖拽到需要加载的预制件上。在工程视图Project中找到DefaultTrackableEventHandler.cs这个脚本,按住Ctrl+D可以将其复制一份相同的脚本,选中新复制出来的脚本并按F2快捷键将脚本改名为MyTrackableEventHandler.cs,双击打开,并将类名修改为MyTrackableEventHandler,并找到监听识别成功和识别丢失的两个方法OnTrackingFound和OnTrackingLost,默认代码如下://识别成功时候调用的方法 private void OnTrackingFound() {  Renderer[] rendererComponents = GetComponentsInChildren(true);Collider[] colliderComponents = GetComponentsInChildren(true);    // Enable rendering:    foreach (Renderer component in rendererComponents)    {        component.enabled = true;    }    // Enable colliders:    foreach (Collider component in colliderComponents)   {      component.enabled = true;    }   Debug.Log('Trackable ' + mTrackableBehaviour.TrackableName + ' found');} //识别丢失时候调用的方法private void OnTrackingLost(){    Renderer[] rendererComponents = GetComponentsInChildren(true);    Collider[] colliderComponents = GetComponentsInChildren(true);    // Disable rendering:    foreach (Renderer component in rendererComponents)    {        component.enabled = false;     }    // Disable colliders:    foreach (Collider component in colliderComponents)    {       component.enabled = false;    }    Debug.Log('Trackable ' + mTrackableBehaviour.TrackableName + ' lost');}      在默认的这两个方法实现中,OnTrackingFound函数是在识别图像成功之后会被调用,OnTrackingLost函数是在识别丢失之后会被调用,该脚本中是通过查找当前识别目标所有子物体的渲染器Renderer组件并打开或关闭,通过这种方式来实现3D物体的显示和隐藏。现在我们通过动态加载的方式来显示3D模型,则需要删除OnTrackingLost和OnTrackingFound两个函数中的内容,并将代码修改为动态加载的方式实现: //识别成功时候调用的方法 private void OnTrackingFound() {//动态加载模型并实例化到场景中      GameObject obj = GameObject.Instantiate(Resources.Load('Sphere')) as GameObject;//生成之后设定它的父级为识别图物体      obj.transform.parent = this.transform;//设定物体的位置与识别图位置在同一位置,这里可以根据需求设定      obj.transform.position = this.transform.position;       } //识别丢失时候调用的方法   private void OnTrackingLost()   {       //从子物体中查找所有TrackObject组件     TrackObject to=GetComponentInChildren();//如果找到显示物体,则销毁物体并释放无用资源         if (to != null)         {            Destroy(to.gameObject);            Resources.UnloadUnusedAssets();         }}

4

3、选择ImageTarget,在Inspector面板选择Remove Component并将DefaultTrackableEventHandler脚本,同时把MyTrackableEventHandler脚本添加到ImageTarget上。

5

最后,点击运行测试最终效果,如下图所示。

6

以上为动态加载AR中3D物体的步骤和方法。

推荐信息