前言:
给自己尝试一下PBl学习法好吧,哈哈,简单记录下学习过程
项目构思:
本项目计划以庆春节为主题,根据春节的习俗吃年夜饭,制作AR交互模型,通过本案例展示图像检测的部分功能。
项目设计:
当摄像头识别到准备好的年夜饭图片,如图所示,会显示一家人团圆吃年夜饭的模型,可以控制模型的放大与缩小。
项目实施:
在Unity中新建一个项目,命名为AR_Picture, 导入ARFoundation和ARCore XR Plugin,进行Android平台的开发环境配置(在ARFoundation的基本环境配置已经介绍过了)。
在Hierarachy窗口的空白处单击鼠标右键,在弹出的菜单中选择XR>AR Session Origin和XR>AR Session Origin。并删除场景中的Main Camera,如图所示。
然后我们需要可跟踪对象管理器ARTrackedImageManager和可跟踪对象ARTrackedImage用来检测与管理2D图形追踪。在Hierarachy窗口选择AR Session Origin,为其添加AR Tracked Image Manager组件,如图所示。
创建参考图像库,在project窗口空白处单击鼠标右键,create>XR>Reference Image Library,如图所示。
选择新建的参考图像库,在文末素材链接中,将素材包AR_Picture.unitypackage导入项目,在Inspector窗口点击 “Add Image”添加准备好的年夜饭的参考图片,如图所示。
补充一下,导入参考图像库的图片不能有中文和空格,因为unity不能读取路径中有中文或者空格的文件。
完成上述工作后,在Hierarchy。窗口选择ARSessionOrigin,把ReferenceImageLibrary挂载到AR Tracked Image Manager组件的Reference Library属性中 ,如图所示。
接下来为年夜饭模型添加控制缩放的脚本,新建一个C#脚本,命名为EnLarge,代码如下
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class EnLarge : MonoBehaviour {
Vector2 oldPos1;
Vector2 oldPos2;
void Start () {
}
void Update () {
if (Input.touchCount == 2)
{
if (Input.GetTouch(0).phase == TouchPhase.Moved || Input.GetTouch(1).phase == TouchPhase.Moved)
{
Vector2 temPos1 = Input.GetTouch(0).position;
Vector2 temPos2 = Input.GetTouch(1).position;
if (isEnLarge(oldPos1, oldPos2, temPos1, temPos2))
{
float oldScale = transform.localScale.x;
float newScalse = oldScale * 1.025f;
transform.localScale = new Vector3(newScalse,newScalse,newScalse);
}
else
{
float oldScale = transform.localScale.x;
float newScalse = oldScale /1.025f;
transform.localScale = new Vector3(newScalse, newScalse, newScalse);
}
oldPos1 = temPos1;
oldPos2 = temPos2;
}
}
}
//判断手势
bool isEnLarge(Vector2 oP1,Vector2 oP2,Vector2 nP1,Vector2 nP2)
{
float length1 = Mathf.Sqrt((oP1.x - oP2.x) * (oP1.x - oP2.x)+(oP1.y - oP2.y) * (oP1.y - oP2.y));
float length2 = Mathf.Sqrt((nP1.x - nP2.x) * (nP1.x - nP2.x) + (nP1.y - nP2.y) * (nP1.y - nP2.y));
if (length1 < length2)
{
return true;
}
else
{
return false;
}
}
}
随后将Resource中的年夜饭模型拖拽到Hierarchy窗口,为其挂载该脚本,如图所示
在Project窗口中的Assets目录下创建一个名为Prefabs分文件夹用于保存Prefab,把刚刚挂载脚本的模型拖入文件夹中,选择Original Prefab,如图所示,这样模型的预制体就制作好了,场景中的模型已经不需要了,可以Delete删除。
最后再把预制体赋值给AR Session Origin对象ARTrackedImageManager组件的Tracked Image Prefab属性,设置Max Number Of Moving Image为1,即指定可追踪的最大图像数为1,如图所示。
项目测试:
打包成apk发布到手机运行,效果如下图所示:
存在疑问:
之前用过Vuforia,Vuforia可以调节识别图片和模型的相对大小和方向,在没运行之前都可以看到相对位置,ARFoundation怎么调节prefab预制体的大小和转向感觉都没效果,是跟模型导入的默认大小和朝向有关系嘛?
素材链接:
https://pan.baidu.com/s/11xi_oe7AfvYk4qaPxwRniw?pwd=n98n
提取码:n98n