最近做的实验,最终选定用EasyAR主要是因为它比Vuforia更快捷一些,从我之前写的两篇文章能明显对比出来,而且EasyAR是开源免费的,没有水印。
研究了一下模型如何脱卡实现VR效果,接下来给大家分享一下:
首先要明白一点就是所谓的脱卡并不是真正意义上的脱卡,什么意思呢?就是说并不是你手机从图片上移开之后,3D模型跟着移动,而是你在unity3D的Camera下预设了一个几乎不可见的物体,当手机从图片上移开的时候,程序记录下3D模型的属性,同时将这个属性赋予给预设物体,这样预设物体就变成了3D模型,从而来实现脱卡的效果。
大致思路:当卡片离开摄像头时间,ImageTarget-Image的SetActive (false),所以其子物体(model)也就不显示了,因此解决的办法就是在Target (false)时间将模型放到一个合适的位置,这样就能实现脱卡,当Target (true)时,再回到原来位置。
步骤如下:
1、新建一个项目或者scenes,删除Main Camera,将EasyAR_Startup拖入到Hierarchy处,并在Inspector处加入密钥(前面的文章已经说了如何做,可以去看详情);
2、将ImageTarget拖入Hierarchy处(可在如下图处寻找ImageTarget);
3、为ImageTarget创建Target图片(此步骤看上述超链接的文章);
4、在ImageTarget处添加一个GameObject(Cube),坐标大小调整好,直接Ctrl+D复制一个相同的,然后拖入到AR Camera下,重命名为CubeT,此时不需要调整任何坐标和大小,因为在复制的时候,它就已经自动调整好了;
5、如下图,在ImageTarget同级处创建一个GameObject(我建立的是一个球,将其scale设置到0.001,肉眼几乎不可见),我起名为NoImageTargetShow,(CubeT是脱卡后的最佳位置,这个位置的模型不会移动,永远都在屏幕固定位置。此空物体用来保存模型的最佳位置和角度 ,NoImageTargetShow是模型在卡片上的最佳位置 );
6、建立C#脚本代码如下:
using UnityEngine;
using System.Collections;
public class NoImageTargetShow : MonoBehaviour {
public GameObject ModelOfAugmenter;
public GameObject ImageTarget;
private bool HasFound = false; // Use this for initialization
void Start () {
ModelOfAugmenter.SetActive (false);
} // Update is called once per frame
void Update () {
if (ImageTarget.activeSelf == true) {
HasFound = true;
ModelOfAugmenter.SetActive (false);
}
if (ImageTarget.activeSelf == false && HasFound == true) {
ModelOfAugmenter.SetActive (true);
}
}
}
7、将脚本绑定至NoImageTargetShow上,单击NoImageTargetShow,如下图Inspector红框处,需要将CubeT和ImageTarget拖入其中即可。
8、演示结果:有卡片的时候,模型在卡片上,脱卡后,模型在固定的屏幕位置。