有时在识别目标丢失后我们仍希望虚拟物体能够出现在摄像机前,或者到一个特定的位置,我们能对其进行操作,这就是脱卡功能。
自带的脱卡功能应该是ExtendedTracking:允许模型在识别图丢失的时候还存在,位置不变(在丢失的时候的位置,这样也就允许了可以近距离观看模型,就算是丢是识别图也不要紧。
如果要使用ExtendedTracKing,在ImageTarget下的ImageTargetBehaviour 勾选Enable Extended Tracking
这次介绍的脱卡功能和ExtendedTracking有区别,这次的脱卡功能是,识别图丢失后,模型到摄像机前面一个固定的位置,可以对模型做一些操作,单击旋转等。
注:下文介绍的脱卡功能和ExtendedTracking 最好不要同时使用。
下文介绍的脱卡实现的原理,是在识别丢失后,将3D模型从ImageTarget的子物体变成ARCamera的子物体,在识别图识别到后再将3D模型的父物体变成ImageTarget。
这里使用的Vuforia6.2的版本,Unity2017.1.0f3。
1.设置ARCamera和ImageTarget,到能够合适的显示3D模型的位置,如果识别图是白色的,则需要在
Assets-Editor-Vuforia-ImageTargetTextures-xx(DatabaseName) 中,找到识别图,将其TextureShape改成2D即可。
2.修改脚本,将ImageTarget自身的DefaultTrackableEventHandler移除,并复制成一个新的脚本,然后将新的脚本拖到ImageTarget下替代原来的DefaultTrackableEventHandler。(我这里的名字叫My_DefaultTrackableEventHandler)
3.void OnTrackingFound() 和 void OnTrackingLost()
这两个函数就是,在识别图识别出来时调用的函数 和 在识别图丢失时调用的函数。
有好几中方法去实现脱卡功能,可以在识别出目标时销毁之前的内容,重新加载,然后再目标丢失后用另一个值渲染一个层的摄像机去渲染脱卡之后的模型;也可以记录位置,然后进行移动。这里用后一种方法。
最终实现:脱卡后模型移动到一个位置并朝着用户,移动到特定位置后,单击模型会将模型散开,再次单击模型会拼起来。
核心函数:OnTrackingLost() 在识别图丢失后的执行函数(执行一次)
OnTrackingFound() 在识别图找到后执行的函数(执行一次)
Ray ray = Camera.main.ScreenPointToRay(Input.mousePosition);
(射线检测函数,需要碰撞)
由于需要获得模型的初始和结束位置,以及要判断是否是第一次识别出来买模型,需要添加以下代码:
#region PUBLIC_MEMBER_VARIABLES
public GameObject Robot; //机器人
public GameObject AimObject; // 脱卡之后的模型位置的空物体
#endregion
#region PRIVATE_MEMBER_VARIABLES
private TrackableBehaviour mTrackableBehaviour;
private bool hasFirstLoad = false; //是否是第一次识别到物体
#endregion // PRIVATE_MEMBER_VARIABLES
void Update()
{
//Update中执行一些逻辑
}
由于在启动以后OnTrackingLost()会调用(由于一开始没有找到识别图),而且这时是没有模型的,所以在O