方案1(使用Vuforia):
优缺点:
优点:使用简单。
缺点:移动时有时模型会出现倾斜和移动的不稳定情况。
具体操作:
- 使用Vuforia的 Extended Tracking;
- 在ARCamera的Vuforia Behaviour脚本中,设置World Center Mode为Device Tracking。
- 在DefaultTrackableEventHandler脚本中,注释掉OnTrackingLost()方法中不再显示那些Component的代码行。
如果想了解Vuforia中World Center Mode的设置解释,以及类似口袋妖怪AR游戏的Vuforia实现方式,可参见此处。
方案2(使用Vuforia但不使用Extended Tracking):
优缺点:
优点:绕四周移动设备时,场景中模型的位置相对第一种方法更加稳定。
缺点:需要设置Button用于开启和关闭位置同步状态,否则将ImageTarget移出手机视野时容易模型位置突变为不正确方位。
具体操作:
- 关闭Vuforia的 Extended Tracking;
- 在ARCamera的Vuforia Behaviour脚本中,设置World Center Mode为Device Tracking。
- 需要展示的模型并不作为ImageTarget的子对象,而是直接放在Scene中。模型的父对象(一个空GameObject)上挂载一个UpdateTransformByTarget.cs脚本。用于根据ImageTarget的transform来同步模型的位置。
- 使用一个Button用来设置模型的父对象是否开启与ImageTarget进行同步状态。当用户认为已经识别准确,可以旋转手机朝向ImageTarget之外的方向时,点击Button结束位置同步状态。这时旋转手机,即可看到空间中模型的其他部分内容。如果需要重新扫描定位,则需要点击Button开启位置同步状态并重置模型位置(这里实际上是一个空GameObject中的子对象m_Pipes),进行ImageTarget识别和位置同步。
UpdateTransformByTarget.cs(被绑定在需要展示的模型的父对象上,这个父对象是一个空GameObject) 中主要代码:
namespace Will
{
public class UpdateTransformByTarget : MonoBehaviour
{
public GameObject m_ImageTarget;
public GameObject m_Pipes; //真正用于展示用的模型。
public Text m_ScanButtonText;
private DefaultTrackableEventHandler m_TrackHandler;
private bool m_EnableScanPosition = true;
//----------------------- Life Cycle -------------------------//
// Use this for initialization
void Start()
{
m_TrackHandler = m_ImageTarget.GetComponent();
}
// Update is called once per frame
void Update()
{
if (m_EnableScanPosition)
{
transform.rotation = m_ImageTarget.transform.rotation;
transform.position = m_ImageTarget.transform.position;
}
}
//----------------------- Interface -------------------------//
public void SwitchEnableScanState()
{
m_EnableScanPosition = !m_EnableScanPosition;
// 更新扫描按钮的文字显示
if (m_EnableScanPosition)
{
// 开启了扫描状态
m_ScanButtonText.text = "确定";
// 将AR物件的位置重置
m_Pipes.transform.position = transform.position;
m_Pipes.transform.rotation = transform.rotation;
}
else
{
// 结束了扫描状态
m_ScanButtonText.text = "扫描";
}
}
}
}
AR Extended Tracking (当视野移出target之后仍然记住target位置)的实现方案
