《AR与VR开发实战》——第3章 AR内容交互 3.1 动态加载AR模型-阿里云开发者社区

开发者社区> 华章计算机> 正文

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

简介:
+关注继续查看

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

3.1 动态加载AR模型

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


effbf943796e179eb469c51add18a81660552fd0

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


6abcb3dc0ccdc6ef0e6ad0a9afc74702c8632fdf

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上。


3b45c844753db55dd4680901b5af54050900e331

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


9168fb60ea1a45f458d8b9006e1d96414840c742

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android开发13——内容提供者ContentProvider的基本使用
  一、ContentProvider简介 当应用继承ContentProvider类,并重写该类用于提供数据和存储数据的方法,就可以向其他应用共享其数据。ContentProvider为存储和获取数据提供了统一的接口。虽然使用其他方法也可以对外共享数据,但数据访问方式会因数据存储的方式而不同,如采用文件方式对外共享数据,需要进行文件操作读写数据;采用sharedpreferences
899 0
《Lua游戏开发实践指南》一第1章 游戏开发入门
本节书摘来华章计算机《Lua游戏开发实践指南》一书中的第1章 ,(美)Paul SchuytemaMark Manyen 著 田剑译 更多章节内容可以访问云栖社区“华章计算机”公众号查看。
876 0
Java Class类的使用 和 动态加载类
Class类 1)在面向对象的世界里,万事万物皆对象。 类是对象,类是java.lang.Class类的实例对象。 There is a class named Class 2)Foo的实例对象如何表示 Foo foo1=new Foo();//foo1就表示出来了 ...
622 0
Android插件化开发之动态加载技术学习
Android插件化开发之动态加载技术学习 为什么要插件化开发和动态加载呢?我认为原因有三点: 可以实现解耦 可以解除单个dex函数不能超过65535的限制 可以给apk瘦身,比如说360安全卫士,整个安装包才13.
1813 0
10059
文章
0
问答
来源圈子
更多
+ 订阅
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载