- 直接在ImageTarget下的DefaultTrackableEventHandler脚本中修改
- 首先在ARCamera下创建一个空的游戏物体并调整z轴距离
- 需要创建两个对象一个是你需要脱卡后居中的模型一个是空物体
- 创建一个transform来储存模型初始位置
public GameObject house;//室外场景模型
public GameObject arempty;//arcamera下的空物体
private Transform housrTransform;//模型的位置
1.在start方法里将模型位置初始化
2.接着需要创建一个Bool值来判断是否脱卡,并且要还需要一个Bool值来判断是否是第一次识别到物体初始值都为false
private bool isFirst = false ;//是否第一次识别到物体
private bool isTuoKa = false;//是否脱卡
3.在OnTrackingFound()方法里将isFirst设为true; isTuoKa为false
4.在OnTrackingLost()方法里判断if(!isFirst)则执行两个foreach函数体;否则else使isTuoKa设为true并且将ARCamera下空物体的位置赋给模型,接着令模型的父物体为ARCamera下空物体且位置一样;要想使脱卡后物体面对着你,需要给他固定旋转度,如housrTransform.localEulerAngles = new Vector3(-90, 0, 0)使模型的x轴旋转度为-90度;固定脱卡后大小也是一样调用transform下的localScale方法使之等于new Vector3( x , y , z )三个值
5.这样之后脱卡后就能显示在屏幕中央且能固定位置,但是再次扫描图就不行了;
6.要想再次扫描可以,那么我们创建一个Bool值来判断是否返回这里我用的Tkreturn,初始值为false
7.当isTuoKa为true时,位置什么的全变换完后令Tkreturn为true,之后在OnTrackingFound()方法里再次将父物体变回来,再调整当地的欧拉角的值,但是在固定大小时需要判断Tkreturn是否为true,如果不判断再次扫描时大小不是很大就是很小。
全部代码如下:
/*==============================================================================
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 DefaultTrackableEventHandler : MonoBehaviour,
ITrackableEventHandler
{
#region PRIVATE_MEMBER_VARIABLES
public GameObject house;//室外场景模型
public GameObject arempty;//arcamera下的空物体
private Transform housrTransform;//模型的位置
private bool isFirst = false ;//是否第一次识别到物体
private bool isTuoKa = false;//是否脱卡
private bool Tkreturn = false;
private TrackableBehaviour mTrackableBehaviour;
#endregion // PRIVATE_MEMBER_VARIABLES
#region UNTIY_MONOBEHAVIOUR_METHODS
void Start()
{
mTrackableBehaviour = GetComponent<TrackableBehaviour>();
if (mTrackableBehaviour)
{
mTrackableBehaviour.RegisterTrackableEventHandler(this);
}
housrTransform = house.transform;
}
#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()
{
Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
isFirst = true;
isTuoKa = false;
house.transform .position = this.transform.position;
housrTransform.SetParent(transform);
housrTransform.localEulerAngles = new Vector3(0, 180, 0);
if (Tkreturn)
{
housrTransform.localScale = new Vector3(0.015f, 0.0151f, 0.015f);
}
// 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()
{
Renderer[] rendererComponents = GetComponentsInChildren<Renderer>(true);
Collider[] colliderComponents = GetComponentsInChildren<Collider>(true);
if (!isFirst) {
// Disable rendering:
foreach (Renderer component in rendererComponents)
{
component.enabled = false;
}
// Disable colliders:
foreach (Collider component in colliderComponents)
{
component.enabled = false;
}
}
else
{
isTuoKa = true;
house.transform.position = arempty.transform.position;//令house的位置等于arcamera下空物体的位置
housrTransform.SetParent(arempty.transform);//使父物体为arempet且位置与父物体一样
housrTransform.localEulerAngles = new Vector3(-90, 0, 0);//脱卡之后使之面对着你
housrTransform.localScale = new Vector3(0.2f, 0.2f, 0.2f);//脱卡之后固定物体大小
Tkreturn = true;
}
Debug.Log("Trackable " + mTrackableBehaviour.TrackableName + " lost");
}
#endregion // PRIVATE_METHODS
}
}