儿童数字绘本移动端增强现实应用开发简述
2017-05-30王毅
王毅
DOI:10.19392/j.cnki.16717341.201714051
摘要:本文主要简述如何使用Unity及增强现实技术在移动端上实现虚拟3D吉祥物的展示。
关键词:Unity;增强现实;苏州园博会吉祥物
1 制作分析
该应用最终发布在Android及Ios平台,主要利用手机的摄像机对园博会吉祥物图片进行识别,然后利用EasyAR增强现实插件结合Unity游戏引擎对识别的结果进行比对,建立空间矩阵,然后回调相应的吉祥物3D虚拟人物进行表演。
2 实现方法
1)首先使用Maya等三维软件进行吉祥物的3D模型和动画的制作,并导入Unity场景(将模型中心放置在世界坐标原点上)、设置灯光背景等。图1示例了该Unity场景模型效果。
2)使用Unity的UI制作插件NGUI制作本应用的登录界面与3D虚拟人物展示界面,如图2所示(左侧为登录和引导界面、右侧为增强现实识别展示界面)。展示界面预留了用户帮助模块、3D虚拟人物动画播放模块、声音切换模块功能。
图1吉祥物Unity场景模型图2 应用界面
3)Unity导入EasyAR增强现实模块。EasyAR是国内最专业的AR引擎,是国内首款投入应用的AR SDK。EasyAR官网上下载相应插件并导入Unity场景,在EasyAR官网注册相应的应用iD并生成相应的Key值,将Key值填入Unity EasyAR节点相应的Key属性中。
4)在EasyAR 配套Unity基础场景中的ImageTargetJsonFileidback节点中将步骤D的吉祥物模型、相应的吉祥物识别卡片都放置在该节点下。当EasyAR调用成功时,摄像头开启后就可以对卡片进行识别,如果目标卡片与ImageTargetJsonFileidback节点下的卡片匹配,则会显示3D吉祥物,如果摄像头跟踪丢失那么3D吉祥物消失。
5)进行模型展示功能的开发。其中,多点触控来控制3D模型的旋转、缩放的核心代码如下:
public class ScaleAndRotate : MonoBehaviour
{
private Touch oldTouch1;∥上次触摸点1(手指1)
private Touch oldTouch2;∥上次触摸点2(手指2)
void Start() {}
GameObject Capsule_bady = null;
private float rotateN = 1.5f;
void Update()
{
Capsule_bady = GameObject.Find(“Capsule_bady”);∥查找相应的3D吉祥物
if (Input.touchCount <= 0 || Capsule_badynull) { return ; } //没有触摸返回
if (1 Input.touchCount)∥单点触摸,水平上下旋转
{
Touch touch = Input.GetTouch(0);
Vector2 deltaPos = touch.deltaPosition; ∥获得单点滑动的矢量
Capsule_bady.transform.Rotate(1*Vector3.up * deltaPos.x * rotateN);∥进行旋转
}
//多点触摸, 放大缩小
Touch newTouch1 = Input.GetTouch(0);∥获得第1个触摸点
Touch newTouch2 = Input.GetTouch(1); ∥获得第2个触摸点
if (newTouch2.phase == TouchPhase.Began) ∥第2點刚开始接触屏幕,不做处理
{
oldTouch2 = newTouch2;
oldTouch1 = newTouch1;
return;
}
∥计算以前的两点距离和新的两点间距离,变大要放大模型,变小要缩放模型
float oldDistance = Vector2.Distance(oldTouch1.position, oldTouch2.position);
float newDistance = Vector2.Distance(newTouch1.position, newTouch2.position);
∥两个距离之差,为正表示放大手势,为负表示缩小手势
float offset = newDistance oldDistance;
∥放大因子, 一个像素按 0.01倍来算(100可调整)
float scaleFactor = offset / 100f;
Vector3 localScale = Capsule_bady.transform.localScale;
Vector3 scale = new Vector3(localScale.x + scaleFactor,
localScale.y + scaleFactor,
localScale.z + scaleFactor);
if ((scale.x > 0.7f && scale.y > 0.7f && scale.z > 07f&&scale.x < 1.4f && scale.y < 1.4f && scale.z < 14f))∥最大縮放为1.4倍,最小缩放为0.7倍
{Capsule_bady.transform.localScale = scale; }
oldTouch1 = newTouch1;∥记住最新的触摸点,下次使用
oldTouch2 = newTouch2;
}}
基金项目:本文为校社科基金项目《基于传统文化传承的儿童绘本影像化研究》(项目编号:YN1431)