王毅

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)