使用EasyAR SDK 来开发好玩的 AR 应用
脱卡是目前AR 应用开发中最普遍的功能,因此我今天给大家借助EasyAR SDK介绍两种最普遍的脱卡功能。
实现脱卡第一种方案
思路:我们知道的,当所识别的卡片离开摄像头时,EasyImageTargetBehaviour 这段脚本中的Image的SetActive为false,因此其子物也就不显示了,因此解决的办法就是在Target (false)时间将模型放到一个合适的位置,这样就能实现脱卡,当Target (true)时,再回到原来位置。
1.首先在EasyAR下面的Augmenter下建设一个空物体,用来存放脱卡后的模型命名cube,这个位置的模型不会移动,永远都在屏幕固定位置。然后在cube下面建一个空物体用来保存模型的最佳位置和角度。(具体位置与角度大家根据自己的要求自行调节)
![](https://i-blog.csdnimg.cn/blog_migrate/97e7bcb271f02a1df4d74fc00ef0cd09.webp?x-image-process=image/format,png)
2.然后在ImageTarget的下面建一个空物体用来保存target(名字随便起)出现时间的位置和角度。
![](https://i-blog.csdnimg.cn/blog_migrate/4ced329d689d6d115260623a8ec9cf75.webp?x-image-process=image/format,png)
3.建一个空物体并挂上这段脚本(记住:这个空物体千万不要建到ImageTarget 下,否则脱卡功能会失效)
- using UnityEngine;
- using System.Collections;
- public class ZSetactive : MonoBehaviour
- {
- public Transform GreatTransfrom; //脱卡后最佳位置
- public GameObject cubePos; //模型脱卡时存放位置
- public Transform[] TargetTransfrom; //模型在卡片上的最佳位置
- public GameObject[] Target; //卡片
- public GameObject[] cube; //模型
- void Start ()
- {
- for (int i = 0; i < cube.Length; i++) { //所有模型初始化全部不显示
- cube [i].SetActive (false);
- }
- }
- public void tiaozheng () //模型倾斜时调整最佳位置
- {
- GreatTransfrom.localPosition = new Vector3 (0f, 0f, 0f);
- GreatTransfrom.localRotation = Quaternion.identity;
- for (int i = 0; i < cube.Length; i++) {
- cube [i].transform.localPosition = GreatTransfrom.localPosition;
- cube [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) {
- cube [i].SetActive (true);
- index = i;
- }
- if (i != index) {
- cube [i].SetActive (false);
- }
- }
- }
- void TargetT () //不脱卡
- {
- for (int i = 0; i < Target.Length; i++) {
- if (Target [i].activeSelf == true) {
- cube [i].transform.parent = Target [i].transform;
- cube [i].transform.position = TargetTransfrom [i].position;
- }
- }
- }
- void TargetF () //脱卡
- {
- for (int i = 0; i < Target.Length; i++) {
- if (Target [i].activeSelf == false) {
- cube [i].transform.parent = zhenf.transform;
- cube [i].transform.localPosition = GreatTransfrom.localPosition;
- }
- }
- }
- }
第三部分:实现脱卡第二种方案
思路:大致思路就是,托卡后将模型的父类设为ARCamera下的一个游戏物体,并调整好位置。
1.EasyAR下的Augmenter下也添加一个模型(与ImageTarget 模型一样),并设置这个模型在你相机下的位置大小各种参数。
![](https://i-blog.csdnimg.cn/blog_migrate/9564d3f2578707df910febdab41d74c5.webp?x-image-process=image/format,png)
- using UnityEngine;
- using System.Collections;
- public class Tuoka : MonoBehaviour
- {
- public GameObject Target;//卡片
- public GameObject zhen;//识别图上的模型
- public GameObject zhen2;//相机下的模型
- bool firstFound = false;//是否是第一次识别
- void Start()
- {
- zhen.SetActive(false);
- zhen2.SetActive(false);
- }
- void Update()
- {
- if (Target.activeSelf == true)
- {
- zhen.SetActive(true);
- zhen2.SetActive(false);//不显示脱卡状态的模型
- zhen2.transform.GetComponent().Stop("Take 001");//停止脱卡状态下模型的动画
- zhen.GetComponent().Stop("Take 001");//识别图上的模型不播放动画
- firstFound = true;
- }
- if (Target.activeSelf == false && firstFound == true)
- {
- zhen.SetActive(false);
- zhen2.SetActive(true);//显示模型
- zhen2.transform.GetComponent().Play("Take 001");
- }
- }
- }