前期配置
unity2017
软件实现功能准备
数据库的准备
登录到vuforia的官网并且sign in
点击 Get Basic创建一个Liscense Key.
进入已经创建的Liscense Manager,将 License Key复制下来,后面会用到。
在Liscense Key的上面点击Target Manager创建需要识别的图片的数据库。
数据库名字不能为中文,数据库的作用是存放需要识别的图片,类型选择Device
创建完如下图,双击进入数据库
**点击Add Target添加图片,名称不能是中文,Type选择“Device”
将图片添加完以后,点击 “Downlode Database(All)”下载该数据库。数据库的下载格式为unity
进入unity建一个新的项目
进入项目,然后在Hierachy面板中建一个ARCamera
点击file然后点击build setting,进入build setting面板。
选择android端,点击“Player Setting”,在“Inspector”面板中设置Company Name和Product Name并且勾选“XR Settings”中的“Vuforia Augmented Realit”。
点击“AR Cramera”的“inspector”面板,点击面板内 “Vuforia Behaviour(Script)” 组件中的“Open Vuforia configuration”。
在Vuforia configuration面板中Database 的App License Key粘贴第二步的内容,选择自己导入数据库并勾选Activate。
自己导入:点击add database,然后跳转到数据库,下载以unity格式数据库,下载完毕后打开就导入进去了
在Hierachy面板中右键点击Vuforia 然后点击 Image创建一个ImageTarget。
查看ImageTarget的inspector面板,在该面板中的“Image Target Behaviour(Script)”组件中“Database”选择之前创建的数据库,“Image Target”选择数据库中相应的图片。
将3D模型导入Unity,在Hierachy面板中将该模型拖到对应的ImageTarget中
要让图片的正上方出现模型,把他们的xyz坐标调整一样即可
建立代码脚本
将缩放和旋转和平移脚本拖到Hierachy面板中所创建的ImageTarget的模型里就能实现旋转和缩放和平移的效果了
在Hierachy面板中建一个新的空物体,命名为Manager
将脚本Manager拉到空物体Manager中
在之前创建的Image中添加脚本MyTrackable,并取消里面的第一个脚本的勾选。这样就完成了脱卡效果的添加
Unity导出安卓apk
点击file然后点击build setting,选择安卓端平台,点击“Player Settings”
在Inspector面板中,勾选XR settting中的Vurforia Augmnted Reality
点击“Other Settings”,修改Package Name,将之前设置的Company Name、Product Name填入其中。注意下面的TV不勾选
在Build Settings中点击的Build就可以导出安卓apk,然后将apk文件发送到手机下载安装即完成。
源码
控制代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Manager : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
public List<Transform>allTargetImages=new List<Transform>();
public void HideAllModels(){
foreach (Transform item in allTargetImages) {
item.GetComponent <MyTrackable>().HideCurrentModel ();
}
}
}
托卡代码
/*==============================================================================
Copyright (c) 2017 PTC Inc. All Rights Reserved.
Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.
All Rights Reserved.
Confidential and Proprietary - Protected under copyright and other laws.
==============================================================================*/
using UnityEngine;
using Vuforia;
/// <summary>
/// A custom handler that implements the ITrackableEventHandler interface.
/// </summary>
public class MyTrackable : MonoBehaviour, ITrackableEventHandler
{
#region PRIVATE_MEMBER_VARIABLES
private Transform aRCamera;
private bool isFirstFound = false;
private Manager manager;
protected TrackableBehaviour mTrackableBehaviour;
#endregion // PRIVATE_MEMBER_VARIABLES
#region UNTIY_MONOBEHAVIOUR_METHODS
protected virtual void Start()
{
aRCamera = GameObject.Find ("ARCamera").transform;
HideCurrentModel ();
manager = GameObject.Find ("Manager").GetComponent <Manager>();
manager.allTargetImages.Add (this.transform );
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
#endregion // UNTIY_MONOBEHAVIOUR_METHODS
#region PUBLIC_METHODS
/// <summary>
/// Implementation of the ITrackableEventHandler function called when the
/// tracking state changes.
/// </summary>
public void OnTrackableStateChanged(
TrackableBehaviour.Status previousStatus,
TrackableBehaviour.Status newStatus)
{
if (newStatus == TrackableBehaviour.Status.DETECTED ||
newStatus == TrackableBehaviour.Status.TRACKED ||
newStatus == TrackableBehaviour.Status.EXTENDED_TRACKED)
{
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found");
OnTrackingFound();
}
else if (previousStatus == TrackableBehaviour.Status.TRACKED &&
newStatus == TrackableBehaviour.Status.NOT_FOUND)
{
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
OnTrackingLost();
}
else
{
// For combo of previousStatus=UNKNOWN + newStatus=UNKNOWN|NOT_FOUND
// Vuforia is starting, but tracking has not been lost or found yet
// Call OnTrackingLost() to hide the augmentations
OnTrackingLost();
}
}
#endregion // PUBLIC_METHODS
#region PRIVATE_METHODS
protected virtual void OnTrackingFound()
{
isFirstFound = true;
manager.HideAllModels ();
ShowCurrentModel ();
}
protected virtual void OnTrackingLost()
{
if (isFirstFound) {
aRCamera.position = new Vector3 (-0.000f,- 0.500f, -5.000f);
aRCamera.localRotation = Quaternion.identity;
}
}
private void ShowCurrentModel()
{
foreach (Transform item in this.transform) {
item.gameObject.SetActive (true);
}
}
public void HideCurrentModel()
{
foreach (Transform item in this.transform) {
item.gameObject.SetActive (false );
}
}
#endregion // PRIVATE_METHODS
}
旋转代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Xuanzhuan : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update(){
if(Input.touchCount==1){ //当触控状态为单机时
if(Input.GetTouch(0).phase==TouchPhase.Moved)//当触控状态为移动时
{ Vector2 deltaPos = Input.GetTouch(0).deltaPosition;
float x = deltaPos.x;
float y = deltaPos.y;//获取xy轴的偏移量
float speed = 0.5f;
transform.Rotate(Vector3.up *-x*speed,Space.World);
transform.Rotate(Vector3.right*y*speed,Space.World);//旋转的方向、距离和速度
}
}
}
}
缩放代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Suofang : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update () {
if(Input.touchCount==2){
Touch touch1_Current = Input.GetTouch(0);//获取现在第一个触控点
Touch touch2_Current= Input.GetTouch(1);
Vector2 touch1_Previous_Pos = touch1_Current.position- touch1_Current.deltaPosition;
Vector2 touch2_Previous_Pos = touch2_Current.position- touch2_Current.deltaPosition;
float dis_Current = Vector2.Distance(touch2_Current.position, touch1_Current.position);
float dis_Previous = Vector2.Distance(touch2_Previous_Pos, touch1_Previous_Pos);
float offset = dis_Current - dis_Previous;
float scaleFactor = offset*0.01f;
Vector3 localScale = transform.localScale;
Vector3 scale = new Vector3 (localScale.x +scaleFactor, localScale.y +scaleFactor, localScale.z +scaleFactor);
if(scale.x>=0.05f&& scale.x<=6.0f&& scale.y>=0.05f&& scale.y<=6.0f&& scale.z>=0.05f&& scale.z<=6.0f)
{ transform.localScale = scale;}
}
}
}
平移代码
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
public class Pingyi : MonoBehaviour {
// Use this for initialization
void Start () {
}
// Update is called once per frame
void Update(){
if(Input.touchCount==1)
{ //当触控状态为单机时
if(Input.GetTouch(0).phase==TouchPhase.Moved)//当触控状态为移动时
{
Vector2 deltaPos = Input.GetTouch(0).deltaPosition;//获取手指移动的距离
float x = deltaPos.x;
float y = deltaPos.y;//获取xy轴的偏移量
float speed = 0.005f;
transform.Translate(Vector3.right*x*speed,Space.World);
transform.Translate(Vector3.right*y*speed,Space.World);//平移的方向、距离和速度
}
}
}
}