基于EasyAR的Android端AR应用开发(二)----脱卡

前言


国庆放了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;                               //模型脱卡时存放位置
    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的交互等等。。。

展开阅读全文

没有更多推荐了,返回首页