实现扫描图片出现3d模型的虚拟仿真技术

前期配置

unity2017

软件实现功能准备

数据库的准备

登录到vuforia的官网并且sign in官网图

点击 Get Basic创建一个Liscense Key.
在这里插入图片描述
创建界面

进入已经创建的Liscense Manager,将 License Key复制下来,后面会用到。
灰色区域是 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);//平移的方向、距离和速度
			}
		}
	}

}
  • 3
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值