方案1(使用Vuforia):

优缺点:

优点:使用简单。

缺点:移动时有时模型会出现倾斜和移动的不稳定情况。

具体操作:

  1. 使用Vuforia的 Extended Tracking;
  2. 在ARCamera的Vuforia Behaviour脚本中,设置World Center Mode为Device Tracking。
  3. 在DefaultTrackableEventHandler脚本中,注释掉OnTrackingLost()方法中不再显示那些Component的代码行。

如果想了解Vuforia中World Center Mode的设置解释,以及类似口袋妖怪AR游戏的Vuforia实现方式,可参见此处

 

 

方案2(使用Vuforia但不使用Extended Tracking):

优缺点:

优点:绕四周移动设备时,场景中模型的位置相对第一种方法更加稳定。

缺点:需要设置Button用于开启和关闭位置同步状态,否则将ImageTarget移出手机视野时容易模型位置突变为不正确方位。

 

具体操作:

  1. 关闭Vuforia的 Extended Tracking;
  2. 在ARCamera的Vuforia Behaviour脚本中,设置World Center Mode为Device Tracking。
  3. 需要展示的模型并不作为ImageTarget的子对象,而是直接放在Scene中。模型的父对象(一个空GameObject)上挂载一个UpdateTransformByTarget.cs脚本。用于根据ImageTarget的transform来同步模型的位置。
  4. 使用一个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位置)的实现方案

发表评论

电子邮件地址不会被公开。 必填项已用*标注

浙公网安备 33010602005964号