基于EasyAR的Android端AR应用开发(二)----脱卡
2017-10-12 20:01
507 查看
前言
国庆放了8天,这几天才空出时间来写下面的内容,惭愧。。。言归正传,上篇博客讲了EasyAR的关于图片识别的功能,识别图片,然后叠加3D模型,3D模型却必须要显示在图片上,那我将手机从图片上移开,怎么样保存3D模型呢,这就是我们要讲的脱卡功能。先给几篇我参考的文章
http://blog.csdn.net/albertleebob/article/details/70143749
http://blog.csdn.net/qq_26270779/article/details/51444377
讲的都比较好,不过都存在一些小问题,下面我把我自己的操作写出来供大家参考
脱卡功能
首先要明白一点就是所谓的脱卡并不是真正意义上的脱卡,什么意思呢?就是说并不是你手机从图片上移开之后,3D模型跟着移动,而是你在unity3D的Camera下预设了一个几乎不可见的物体,当手机从图片上移开的时候,程序记录下3D模型的属性,同时将这个属性赋予给预设物体,这样预设物体就变成了3D模型,从而来实现脱卡的效果。首先是在Camera下创建空物体,便于后续存放3D模型,这个空物体的大小(scale)可以设置为0.001,位置(position设置为20可根据自己情况进行设置)这样就可以忽略不见了,不会影响整体的效果。如下图:
GreatTransfrom是脱卡后的最佳位置 ,TargetTransfrom是模型在卡片上的最佳位置
完成上面的操作之后在创建一个空物体来挂载下面的脚本
对照相应的名称分别填入右边的选项
using UnityEngine; using System.Collections; public class ZSetactive : MonoBehaviour { public Transform GreatTransfrom; //脱卡后最佳位置 public GameObject zhenf; // a932 模型脱卡时存放位置 public Transform[] TargetTransfrom; //模型在卡片上的最佳位置 public GameObject[] Target; //卡片 public GameObject[] zhen; //模型 void Start () { for (int i = 0; i < zhen.Length; i++) { //所有模型初始化全部不显示 zhen [i].SetActive (false); } } public void tiaozheng () //模型倾斜时调整最佳位置 { GreatTransfrom.localPosition = new Vector3 (0f, 0f, 0f); GreatTransfrom.localRotation = Quaternion.identity; for (int i = 0; i < zhen.Length; i++) { zhen [i].transform.localPosition = GreatTransfrom.localPosition; zhen [i].transform.localRotation = GreatTransfrom.localRotation; } } void Update () { WhoShouldShow (); //哪个模型应该显示 TargetT (); //有卡片时 TargetF (); //无卡片时 } int index = -1; void WhoShouldShow () //哪个模型应该显示 { for (int i = 0; i < Target.Length; i++) { if (Target [i].activeSelf == true) { zhen [i].SetActive (true); index = i; } if (i != index) { zhen [i].SetActive (false); } } } void TargetT () //不脱卡 { for (int i = 0; i < Target.Length; i++) { if (Target [i].activeSelf == true) { zhen [i].transform.parent = Target [i].transform; zhen [i].transform.position = TargetTransfrom [i].position; } } } void TargetF () //脱卡 { for (int i = 0; i < Target.Length; i++) { if (Target [i].activeSelf == false) { zhen [i].transform.parent = zhenf.transform; zhen [i].transform.localPosition = GreatTransfrom.localPosition; } } tiaozheng (); } }
再来看看上面这段代码主要分量重情况,分贝是脱卡和不脱卡的时候。不脱卡就是跟图片识别一样,不需要做太多变化;脱卡的时候,即需要将3D模型转移到我们Camera下的空物体上,并设置一下空物体的属性,最后加入tiaozheng ()即可正常显示(刚才参考的文章中主要缺少了调整函数的调用导致脱卡之后模型的非正常显示)。
最后我们同样导出为android工程,运行在手机上看看效果,是不是从图片上移开,模型没消失。
最后
又写了一点,希望能帮到有需要的朋友,后续还会讲到模型的旋转,缩放,以及unity3d和android的交互等等。。。相关文章推荐
- 基于EasyAR的Android端AR应用开发(三)---模型的旋转、缩放、平移
- 基于EasyAR的Android端AR应用开发(一)
- 基于 PhoneGap 与 Java 开发的 Android 应用的性能对比
- 基于Basic4android的Android应用开发指南——第一个Basic4android程序(1)
- 基于PhoneGap的Android应用开发
- 基于PhoneGap的Android应用开发[eclipse]
- 基于命令行模式进行开发ANDROID应用
- 基于Android应用开发的跨进程通信实现(IPC)
- 基于命令行模式进行开发ANDROID应用
- 基于Basic4android的Android应用开发指南——引言 .
- (转)基于PhoneGap与Java开发的Android应用的性能对比
- 基于Android内核的应用开发环境搭建
- 基于Google Map的简单Android应用开发【图解】
- 开发基于 Google Map 的 Android 应用
- 基于Android平台淘宝网手机客户端实战开发(共四季,涉及各类技术应用)
- 基于Basic4android的Android应用开发指南——引言
- 基于PhoneGap的Android应用开发:Get started
- 1.1搭建基于Eclipse的Android应用开发环境
- 基于WebKit内核Android应用和Web项目开发,问题剖析
- 基于PhoneGap的Android应用开发[Dreamweaver CS5.5]