首页 > 其他分享 >AR设备使用Vuforia的优化

AR设备使用Vuforia的优化

时间:2022-09-28 15:45:07浏览次数:48  
标签:num private public Instance targetObj position 优化 Vuforia AR

  主要是设置识别的范围,在应用内检测当前识别图和我的距离,以及识别图和我的角度,当进入了规定的范围和角度后,

在进行定位功能。我目前用的是距离在两米内 摄像机和识别图的角度正负不超过30度的范围

       VuforiaManager 管理

       VuforialFindImageAction 识别图上,设置对应管理里的第几个VuforiaAnchor

       VuforiaAnchor  定位的物体,注意旋转,Z轴要和Camera 看向物体的方向一致(反正180 自己测一下)

  

/****************************
  summary:

****************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.UI;

public class VuforiaManager : MonoSingleton<VuforiaManager>
{
    /// <summary>
    /// 当前生成的场景
    /// </summary>
    public Transform sceneMap;
    //[SerializeField]
    //private List<Transform> list_ImageTargetObj;
    [SerializeField]
    public List<VuforiaAnchor> list_Anchor;
    private VuforiaAnchor oldAnchor;

    public Text text;
    public bool isCorrect;
    private void Start()
    {
        oldAnchor = null;

        StartCoroutine(LoadARCamera());
        isCorrect = false;
    }

    //private void Update()
    //{
    //    if (oldAnchor != null)
    //        text.text = oldAnchor.transform.eulerAngles.x + "  " + oldAnchor.transform.eulerAngles.y + "  " + oldAnchor.transform.eulerAngles.z;
    //}
    public void TrackingFound(Transform targetObj , int num)
    {
        try
        {
            if (list_Anchor.Count < (num+1) || list_Anchor.Count < 1)
                return;
            SelectSceneAnchor(targetObj, num);
        }
        catch (System.Exception e)
        {
            Debug.LogError(e.Message);
        }
    }

    public void TrackingLost(int num)
    {
        if (list_Anchor.Count < (num+1) || list_Anchor.Count < 1)
            return;
        list_Anchor[num].Close();
    }

    public void SelectSceneAnchor(Transform targetObj, int num)
    {
        if (oldAnchor == null)
        {
            oldAnchor = list_Anchor[num];
            oldAnchor.Show(targetObj);
        }
        else if (oldAnchor == list_Anchor[num])
        {
            // oldTarget.DirectClose();
            oldAnchor.ReplaceShow();
        }
        else if (oldAnchor != list_Anchor[num])
        {
            oldAnchor.DirectClose();
            oldAnchor = list_Anchor[num];
            oldAnchor.Show(targetObj);

           // if(oldAnchor!=list_Anchor[num].gameObject)
        }
    }

    public void ARCameraLoad()
    {
      //  StartCoroutine(LoadARCamera());
    }

     IEnumerator LoadARCamera()
    {
       // yield return API_GSXR_Slam.SlamManager.IsRunning;

        yield return new WaitForSeconds(2f);
       GameObject.Instantiate(Resources.Load<GameObject>("ARCamera"));
    }

   
}

  

/****************************
  summary: 计算锚点差值,定位场景

****************************/
using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class VuforiaAnchor : MonoBehaviour
{
    private Transform targetObj = null;

    private bool state = false;
    private bool onlySet = true;
  //  private Collider[] coliders;
    public Transform player;
   
    private float y;
    private Vector3 disPos;
    private float dic;
    private Vector3 dir;
    private Vector3 cross;
    private float dot;
    private float deg;
    private void Start()
    {
     //   player = API_SVR.GetHead();
    }

    private void FixedUpdate()
    {    
        /*
         *  1.首次定位时直接整体 移动选择
         *  2.后续矫正判断识别图和Player的公积和距离,在范围内再进行移动
         *  
         */
        if (state && VuforiaManager.Instance.isCorrect)
        {
            if (player == null)
                return;

            if (onlySet)
            {
                onlySet = false;

                y = targetObj.eulerAngles.y - transform.eulerAngles.y;
                VuforiaManager.Instance.sceneMap.eulerAngles += new Vector3(0, y, 0);
                disPos = targetObj.position - transform.position;
                //Debug.Log(transform.position + "  " + targetObj.position);
                //Debug.Log(VuforiaManager.Instance.sceneMap.position);
                //Debug.Log(" DisPos   " + disPos);
                VuforiaManager.Instance.sceneMap.position += disPos;
            }
            else
            {

                Vector3 disPos = targetObj.position - transform.position;
                disPos = VuforiaManager.Instance.sceneMap.position + disPos;
                VuforiaManager.Instance.sceneMap.position = Vector3.Lerp(VuforiaManager.Instance.sceneMap.position, disPos, Time.deltaTime * 10f);
              
            }
        }
    }
    // 首次定位
    public void Show( Transform targetObj)
    {
        Debug.Log("  Show    ");
        this.targetObj = targetObj;
        // StartCoroutine(Show(1));
        state = true;
        onlySet = true;
    }


    //再次定位
    public void ReplaceShow()
    {
        state = true;
       // onlySet = true;
        //  StartCoroutine(Show(1));
    }
    // 关闭
    public void Close()
    {
        state = false;
    }
    // 强制关闭
    public void DirectClose()
    {
        state = false;
    }

    public void PhysicsCollider()
    {
        //coliders = Physics.OverlapSphere(transform.position, 2.5f, 8);
        //player = coliders[0].transform;
        //if (coliders.Length>1)
        //{
        //    Debug.LogError(" 检测玩家个数设置错误 ");
        //    return;
        //}

      
    }

    IEnumerator Show(float timer)
    {
        yield return new WaitForSeconds(timer);

        float y = targetObj.eulerAngles.y - transform.eulerAngles.y;
        VuforiaManager.Instance.sceneMap.eulerAngles += new Vector3(0, y, 0);

        Vector3 disPos = targetObj.position - transform.position;
        Debug.Log(transform.position + "  " + targetObj.position);
        Debug.Log(VuforiaManager.Instance.sceneMap.position);
        Debug.Log(" DisPos   " + disPos);

        VuforiaManager.Instance.sceneMap.position += disPos;
    }


}

  

using System.Collections;
using System.Collections.Generic;
using UnityEngine;

public class VuforialFindImageAction : DefaultTrackableEventHandler
{
    public string Name;
   // [HideInInspector]
    public TargetObjDeg targetObj;
  //  [HideInInspector]
    public int num;
    [HideInInspector]
    public int pointObj;
    protected override void OnTrackingFound()
    {
        
        //if (VuforialMap.Instance != null)
        //    VuforialMap.Instance.TargetPointShow(this);
        if (VuforiaManager.Instance != null)
        {
            Debug.Log(num);
            //  VuforialControl.Instance.TrackingFound(targetObj, num, pointObj);
            VuforiaManager.Instance.TrackingFound(targetObj.transform, num);
            targetObj.state = true;
        }
        base.OnTrackingFound();

       
    }

    protected override void OnTrackingLost()
    {

        //  VuforialControl.Instance.TrackingLost(num);
        if(VuforiaManager.Instance!=null)
        {
            Debug.Log(num);
            VuforiaManager.Instance.TrackingLost(num);
            targetObj.state = false;
        }
        
        //if (VuforialMap.Instance != null)
        //    VuforialMap.Instance.TargetPointClose(this);
        base.OnTrackingLost();      
    }
}

public enum ShowObj
{
    ScenicSpot = 0,
    Rotue = 1,
    obj3D = 2
}

  

标签:num,private,public,Instance,targetObj,position,优化,Vuforia,AR
From: https://www.cnblogs.com/DGJS/p/16738255.html

相关文章

  • echarts文字颜色自定义修改
    1、改变坐标轴文字颜色:在xAxis,yAxis中添加以下代码即可 axisLabel:{      show:true,      textStyle:{         color......
  • barManager的设置
    Devexpress之barManager隐藏菜单栏左边的竖线和右边的箭头?1、隐藏菜单栏上右边的箭头属性设置:OptionsBar=>>AllowQuickCustomization=False2、隐藏菜单栏左边的竖线属......
  • DevExpress中barManager下的toolbar如何在panel中显示
    如题,我的DevToolbar需要在一个pannel中显示,并且居于最顶部。可是好像默认情况下toolbar都是在窗体的最顶部的,如何设置才能使其位于一个panel的最顶部呢?解决方案:经过测......
  • maven 拉取的 jar 包 功能逻辑 与 实际逻辑不同
    20220921sdk服务有一段根据url是否带参数的判断的实际代码:maven加载jar包后,运行都有报错,查看源码:直接省略了对url的判断,导致url没有加参数的场景都会抛数组......
  • windows下启动elasticsearch以及注册为服务启动
    安装ES后,所有对ES的操作命令都在bin目录下,elasticsearch.bat 控制台启动ES,控制台关闭则ES关闭elasticsearch-service.bat服务管理 有几个参数可以传,install,start,......
  • 什么是docker swarm configs?及其在service中的使用?
    今天,来说一个在service中非常高级的知识点,configs. 然后,通过一些示例,来一步一步的演示,如何在service中使用,有什么关键的注意事项。什么是configs? configs的准确说......
  • 国产GP232RL兼容FT232RL USB转UART 采用两线SPI 可节省IO资源
    GP232RL是一款高度集成的USB到UART桥接控制器,提供了一种简单的解决方案,可以使用极少的元器件和PCB空间,将RS232接口转换为USB接口。GP232R包括一个USB2.......
  • Linux系统替换War包中的Jar包,并重新打包成War包。
    步骤流程-解压-替换-打包解压1丶创建一个新目录[root@localhostwar-test]#pwd/war-test[root@localhostwar-test]#ls1.war[root@localhostwar-test]#unzip1.war......
  • 11、Android Studio的ARM Neon学习笔记
    基本思想:先深入的学习一下ARMNeon的基本原理,在开始测试NCNN大佬&ZZ大佬贡献的源码~学习大佬博客:​​https://www.yuque.com/docs/share/3eff70c4-c70f-40df-b0af-df9fa7365......
  • NSDictionary类使用(转)
    字典:NSDictionary 字典就是关键字及其定义(描述)的集合。Cocoa中的实现字典的集合NSDictionary在给定的关键字(通常是一个NSString)下存储一个数值(可以是任何类型的对象)。然后......