《AR与VR开发实战》——第3章 AR内容交互 3.1 动态加载AR模型

    xiaoxiao2024-01-21  166

    本节书摘来自华章出版社《AR与VR开发实战》一书中的第章,第3.1节,作者 张克发 赵兴 谢有龙,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

    3.1 动态加载AR模型

    在第2章中我们实现了通过Vufoira默认方式识别并显示三维模型。默认的加载模型是通过将3D物体直接放置在场景中并作为识别目标的子物体来实现的,这种实现方式的问题是,当场景中有很多识别目标后,需要一次性加载的模型内容会占用很大的内存。因此,在实际项目案例中需要动态加载识别目标对应的模型,在识别丢失之后删除模型,这样可以保证同一时刻内存的占用是手机可以承受的。本节将通过预制件实例化的方式实现AR模型的动态加载和显示。1.创建预制件将ImageTarget下调整好的模型拖到最上层,和ImageTarget在层级视图中保持平级关系。

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

    2.为需要加载的预制件添加脚本 在工程视图Project中创建一个新的C#脚本,命名为TrackObject.cs,该脚本是为了更方便地找到识别后显示的物体,将其拖到需要加载的预制件上。 在工程视图Project中找到DefaultTrackableEventHandler.cs这个脚本,按住Ctrl+D可以 复制一份相同的脚本,选中新复制出来的脚本并按F2快捷键将脚本改名为MyTrackable EventHandler.cs。然后双击打开,将类名修改为MyTrackableEventHandler,找到监听识别成功和识别丢失的两个方法OnTrackingFound和OnTrackingLost,默认代码如下: //识别成功时调用的方法 private void OnTrackingFound() { Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true); Collider[] colliderComponents = GetComponentsInChildren<Collider>(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<Renderer>(true); Collider[] colliderComponents = GetComponentsInChildren<Collider>(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<TrackObject>(); //如果找到显示物体,则销毁物体并释放无用资源 if (to != null) { Destroy(to.gameObject); Resources.UnloadUnusedAssets(); }

    }3.效果实现选择ImageTarget,在Inspector面板上选择Remove Component,并将DefaultTrackable EventHandler脚本移除,同时把MyTrackableEventHandler脚本添加到ImageTarget上。

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

    以上为动态加载AR中3D物体的步骤和方法。 相关资源:敏捷开发V1.0.pptx
    最新回复(0)