Unity3D+VuforiaOffTarget的原理与实现方法。
来源:互联网 发布:电工模拟接线软件 编辑:程序博客网 时间:2024/06/07 02:57
模型OffTarget的原理:通过脚本实现图片识别之后,当识别图离开镜头的时候将模型固定在镜头前。
模型OffTarget的实现方法:第一步先搭建Vuforia的基础开发环境,具体流程可参照备注:http://manew.com/thread-100442-1-1.html,
1、在Hierrarchy视图空白处右键,创建一个空物体,命名为OffTargetPositionObject,拖到Camera物体下。
2、将要进行OffTarget的物体拖到OffTargetPositionObject下,并移动OffTargetPositionObject到ArCamera前,此时要保证OffTarget的物体在OffTargetPositonObject物体下的position为0。
3、在ImageTarget下面新建一个空物体,命名为Mgr,将要OffTarget的物体到Mgr下,保证Mgr和物体position为0。
4、此时,我们新建两个C#脚本,一个命名为OffTargetTrackableEventHandler,一个命名为OffTargetMgr。
6、打开ImageTarget上的DefaultTrackableEventHandler脚本,按Ctrl+A全选Ctrl+C复制,打开OffTargetTrackableEventHandler脚本,Ctrl+A全选,Ctrl+V粘贴,记住修改类名与脚本名保持一致,否则会报错。
7、打开OffTargetMgr脚本,键入以下代码
using System.Collections;using System.Collections.Generic;using UnityEngine;public class OffTargetMgr : MonoBehaviour { //要OffTarget的物体 public GameObject OffTargetObject; //摄像机下的物体 public GameObject OffTargetPositionObject;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {} void OnEnable() { //在此脚本启用时,将OffTarget的父物体设定为挂载了这个脚本的物体,并且把本地位置和本地角度设置为0。 OffTargetObject.transform.parent = this.transform; OffTargetObject.transform.localPosition = new Vector3(0, 0, 0); OffTargetObject.transform.localEulerAngles = new Vector3(0, 0, 0); } void OnDisable() { //在此脚本关闭时,将OffTarget的父物体设定为摄像机下的空物体,并且把本地位置和本地角度设置0。 OffTargetObject.transform.parent = OffTargetPositionObject.transform; OffTargetObject.transform.localPosition = new Vector3(0, 0, 0); OffTargetObject.transform.localEulerAngles = new Vector3(0, 0, 0); }}
8、将OffTargetMgr挂载在ImageTarget下的Mgr上,并将要OffTarget的物体和OffTargetPositionObject物体拖入,并将OffTargetMgr脚本关闭勾选。
9、将ImageTarget物体上的DefaultTrackableEventHandler脚本Remove Component,将OffTargetTrackableEventHandler挂载在ImageTarget上。
10、在OffTargetTrackableEventHandler脚本中键入以下代码
/*==============================================================================Copyright (c) 2010-2014 Qualcomm Connected Experiences, Inc.All Rights Reserved.Confidential and Proprietary - Protected under copyright and other laws.==============================================================================*/using UnityEngine;namespace Vuforia{ /// <summary> /// A custom handler that implements the ITrackableEventHandler interface. /// </summary> public class OffTargetTrackableEventHandler : MonoBehaviour, ITrackableEventHandler { #region PRIVATE_MEMBER_VARIABLES private TrackableBehaviour mTrackableBehaviour; #endregion // PRIVATE_MEMBER_VARIABLES #region UNTIY_MONOBEHAVIOUR_METHODS void Start() { 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) { OnTrackingFound(); } else { OnTrackingLost(); } } #endregion // PUBLIC_METHODS #region PRIVATE_METHODS private void OnTrackingFound() { //获取这个物体下的第一个子物体上的OffTargetMgr脚本,并且启用它。 this.transform.GetChild(0).GetComponent<OffTargetMgr>().enabled = true; Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true); Collider[] colliderComponents = GetComponentsInChildren<Collider>(true); // Enable rendering: foreach (Renderer component in rendererComponents) { component.enabled = true; } // Enable colliders: foreach (Collider component in colliderComponents) { component.enabled = true; } Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found"); } private void OnTrackingLost() { //获取这个物体下的第一个子物体上的OffTargetMgr脚本,并且关闭它。 this.transform.GetChild(0).GetComponent<OffTargetMgr>().enabled = false; Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true); Collider[] colliderComponents = GetComponentsInChildren<Collider>(true); // Disable rendering: foreach (Renderer component in rendererComponents) { component.enabled = false; } // Disable colliders: foreach (Collider component in colliderComponents) { component.enabled = false; } Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost"); } #endregion // PRIVATE_METHODS }}
11、保存并且运行,模型内容OffTarget完成。
视频OffTarget的原理:通过脚本实现图片识别之后,当识别图离开镜头的时候将视频自动全屏播放或在镜头前播放。
视频OffTarget的实现方法:搭建视频播放的环境,具体流程可参照备注:http://blog.csdn.net/wene_zheng/article/details/52223958
1~3步和上面的一样,都是在Camera下面创建一个空物体。
4、新建两个脚本,分别命名为VideoOffTargetMgr和VideoTrackableEventHandler。
5、复制TrackableEventHandler内容到VideoTrackableEventHandler脚本里,记得修改类名,然后将ImageTarget上的TrackableEventHandler去掉换成VideoTrackableEventHandler,VideoTrackableEventHandler脚本内容如下。
/*============================================================================== * Copyright (c) 2012-2015 Qualcomm Connected Experiences, Inc. All Rights Reserved. * ==============================================================================*/using UnityEngine;using Vuforia;/// <summary>/// A custom handler that implements the ITrackableEventHandler interface./// </summary>public class VideoTrackableEventHandler : MonoBehaviour, ITrackableEventHandler{ #region PRIVATE_MEMBERS private TrackableBehaviour mTrackableBehaviour; private bool mHasBeenFound = false; private bool mLostTracking; private float mSecondsSinceLost; #endregion // PRIVATE_MEMBERS #region MONOBEHAVIOUR_METHODS void Start() { mTrackableBehaviour = GetComponent<TrackableBehaviour>(); if (mTrackableBehaviour) { mTrackableBehaviour.RegisterTrackableEventHandler(this); } OnTrackingLost(); } void Update() { // Pause the video if tracking is lost for more than two seconds if (mHasBeenFound && mLostTracking) { if (mSecondsSinceLost > 2.0f) { VideoPlaybackBehaviour video = GetComponentInChildren<VideoPlaybackBehaviour>(); if (video != null && video.CurrentState == VideoPlayerHelper.MediaState.PLAYING) { video.VideoPlayer.Pause(); } mLostTracking = false; } mSecondsSinceLost += Time.deltaTime; } } #endregion //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) { OnTrackingFound(); } else { OnTrackingLost(); } } #endregion //PUBLIC_METHODS #region PRIVATE_METHODS private void OnTrackingFound() { this.transform.GetChild(0).GetComponent<VideoOffTargetMgr>().enabled = true; Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(); Collider[] colliderComponents = GetComponentsInChildren<Collider>(); // Enable rendering: foreach (Renderer component in rendererComponents) { component.enabled = true; } // Enable colliders: foreach (Collider component in colliderComponents) { component.enabled = true; } Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " found"); // Optionally play the video automatically when the target is found VideoPlaybackBehaviour video = GetComponentInChildren<VideoPlaybackBehaviour>(); if (video != null && video.AutoPlay) { if (video.VideoPlayer.IsPlayableOnTexture()) { VideoPlayerHelper.MediaState state = video.VideoPlayer.GetStatus(); if (state == VideoPlayerHelper.MediaState.PAUSED || state == VideoPlayerHelper.MediaState.READY || state == VideoPlayerHelper.MediaState.STOPPED) { // Pause other videos before playing this one PauseOtherVideos(video); // Play this video on texture where it left off video.VideoPlayer.Play(false, video.VideoPlayer.GetCurrentPosition()); } else if (state == VideoPlayerHelper.MediaState.REACHED_END) { // Pause other videos before playing this one PauseOtherVideos(video); // Play this video from the beginning video.VideoPlayer.Play(false, 0); } } } mHasBeenFound = true; mLostTracking = false; } private void OnTrackingLost() { this.transform.GetChild(0).GetComponent<VideoOffTargetMgr>().enabled = false; Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(); Collider[] colliderComponents = GetComponentsInChildren<Collider>(); // Disable rendering: foreach (Renderer component in rendererComponents) { component.enabled = false; } // Disable colliders: foreach (Collider component in colliderComponents) { component.enabled = false; } Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost"); mLostTracking = true; mSecondsSinceLost = 0; } // Pause all videos except this one private void PauseOtherVideos(VideoPlaybackBehaviour currentVideo) { VideoPlaybackBehaviour[] videos = (VideoPlaybackBehaviour[]) FindObjectsOfType(typeof(VideoPlaybackBehaviour)); foreach (VideoPlaybackBehaviour video in videos) { if (video != currentVideo) { if (video.CurrentState == VideoPlayerHelper.MediaState.PLAYING) { video.VideoPlayer.Pause(); } } } } #endregion //PRIVATE_METHODS}
6、将VideoOffTarget脚本挂在ImageTarget物体下的Mgr上,VideoOffTarget脚本内容如下
using System.Collections;using System.Collections.Generic;using UnityEngine;public class VideoOffTargetMgr : MonoBehaviour { public GameObject VideoObject; public GameObject OffTargetObject;// Use this for initializationvoid Start () {}// Update is called once per framevoid Update () {} void OnEnable() { VideoObject.transform.parent = this.transform; VideoObject.transform.position = new Vector3(0,0,0); VideoObject.transform.eulerAngles = new Vector3(0, 0, 0); } void OnDisable() { VideoObject.transform.parent = OffTargetObject.transform; VideoObject.transform.position = new Vector3(0, 0, 0); VideoObject.transform.eulerAngles = new Vector3(0, 0, 0); /*全屏播放方法如下 Handheld.PlayFullScreenMovie("VuforiaSizzleReel_1.mp4", Color.black, FullScreenMovieControlMode.CancelOnInput); 括号中第一个参数为视频路径,第二个为背景颜色,第三个为播放模式。*/ }}
7、打包成安卓或者IOS包,在手机上运行,电脑上无法播放视频(使用Vuforia自带视频插件时)。
- Unity3D+VuforiaOffTarget的原理与实现方法。
- 代码混淆的实现原理与方法
- Atitit.编程语言原理---方法重载的实现与设计 调用方法的原理
- 网络监听的原理、实现技术与防范方法
- STC单片机PWM的实现方法与原理参考实例
- 实例解释瀑布流图的实现原理与方法
- 嵌入式系统HAL原理与BSP的实现方法
- Atitit paip.对象方法的实现原理与本质.txt
- unity3d与web交互的方法
- iOS与Unity3d的交互实现
- iOS与Unity3d的交互实现
- Unity3D Assetbundle的原理
- Unity3D Assetbundle的原理
- Unity3D-PerlinNoise原理及实现
- Unity3D消消乐实现原理
- new方法的实现原理
- join方法的实现原理
- 数据加密原理与实现方法
- python爬虫实现简单爬取淘宝商品demo
- Redhat6.3 yum .repo源配置问题 rhel-server-6.3
- 第三周 --顺序表 的基本运算
- Oracle GoldenGate磁盘要求
- spring无法启动
- Unity3D+VuforiaOffTarget的原理与实现方法。
- Android Studio安装插件 重启后保存不上的问题
- [dp]cf gym 101485B; bzoj4426 Better Productivity(NWERC 2015 B)
- JVM垃圾回收机制
- js基础-函数★★★
- jpg批量转成一个pdf
- MyBatis原理剖析
- 一些有趣的SQL题目
- AngularJs中,如何在render完成之后,执行Js脚本