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

在进行定位功能。我目前用的是距离在两米内 摄像机和识别图的角度正负不超过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
}

  

AR设备使用Vuforia的优化的更多相关文章

  1. UNITY3d在移动设备上的一些优化实战(一)-概述

    转自:UNITY3d在移动设备上的一些优化实战(一)-概述 http://blog.csdn.net/leonwei/article/details/39233921 项目进入了中期之后,就需要对程序 ...

  2. [AR]高通Vuforia Getting Started

    Vuforia Getting Started 简介 ​ Vuforia创建增强现实应用程序是一个软件平台.开发人员可以轻松地将先进的计算机视觉功能添加到任何应用程序中,允许它识别图像和对象,或在现实 ...

  3. UNITY3d在移动设备上的一些优化实战

    项目进入了中期之后,就需要对程序在移动设备上的表现做分析评估和针对性的优化了,首先前期做优化,很多瓶颈没表现出来,能做的东西不多,而且很多指标会凭预想,如果太后期做优化又会太晚,到时发现一些问题改起来 ...

  4. [AR]高通Vuforia之Frame Markers

    软件环境 SDK:FrameMarkers-6-0-112.unitypackage(从官网 -> Download -> Samples -> Core Features 下载 ) ...

  5. 与下位机或设备的通信解析优化的一点功能:T4+动态编译

        去年接触的一个项目中,需要通过TCP与设备进行对接的,传的是Modbus协议的数据,然后后台需要可以动态配置协议解析的方式,即寄存器的解析方式,,配置信息有:Key,数据Index,源数据类型 ...

  6. 【Unity]】AR小工具-Vuforia

    很有意思的增强现实玩具,六分钟应用. https://www.youtube.com/watch?v=khavGQ7Dy3c

  7. AR中的SLAM(一)

    写在前面 本系列打算讲讲个人对AR行业和AR中的SLAM算法的一点浅显的看法.才疏学浅,文中必然有很多疏漏和不足,还望能和大家多多讨论.今天先讲讲我对AR的一些认识. AR的一点理解 AR是什么 AR ...

  8. 关于AR,你想要的全在这儿了

    定义 增强现实(Augmented Reality,简称AR),是一种实时地计算摄影机影像的位置及角度并加上相应图像的技术,这种技术的目标是在屏幕上把虚拟世界套在现实世界并进行互动.这种技术估计由19 ...

  9. Vuforia开发完全指南---Vuforia概述

    Vuforia概述 AR(Augmented Reality)增强现实,想必大家都已经很熟悉了.这是当下最热的技术之一,是利用计算机视觉和计算机图像学领域的相关知识将虚拟世界融入到现实生活当中.AR和 ...

  10. VR与AR的发展趋势分析

    概要 你是否想象过与神秘的深海生物近距离接触?你是否梦想过穿戴钢铁侠那样的超先进科技装备成为超级英雄?你又是否幻想过与梦中的女神面对面的交流?这些可能在以前都只能是存在于脑海中的幻想,可是在如今有一项 ...

随机推荐

  1. [cocos2d-x]关于坐标系

    本文从cocos2dx官网看到,搬运过来学习一下. cocos2d-x3.X的坐标系 Cocos2d-x坐标系和OpenGL坐标系相同,都是起源于笛卡尔坐标系. 笛卡尔坐标系中定义右手系原点在左下角, ...

  2. [1]SpinalHDL安装环境

    [1]SpinalHDL安装环境 最好的教程是官方文档!不过推荐英文文档 英文版 中文版 一.安装java环境 SpinalHDL相当于是scala的一个包,而scala是运行在jvm上的.所以我们先 ...

  3. CSS 3 所有的选择器整理(2023.2)

    你知道的和你不知道的所有选择器.不包含尚未广泛实现的,也不包含已弃用的. 基本的选择器规则(Selector) 类型(Type)选择器 直接用标签匹配特定的元素 span { ... } p { .. ...

  4. Typora下载与安装 0.9.75版本

    Typora下载与安装 效果图 一.简介 一款 Markdown 编辑器和阅读器 (0.9.75 版本 不需购买) 二.下载 下载地址:Typora 三.安装 1.下载文件后双击安装 2. 选择存放的 ...

  5. Windows 10 企业版 LSTC 激活秘钥及方法

    Windows 10 企业版 LSTC 秘钥:M7XTQ-FN8P6-TTKYV-9D4CC-J462D 同时按下Win键+X,然后选择Windows PowerShell(管理员)按顺序输入下面的字 ...

  6. CMAKE添加库

    1.因为pthread不是C标准库,需要链接 2.在CMakeLists.txt里添加: FIND_PACKAGE(Threads  REQUIRED) TARGET_LINK_LIBRARIES($ ...

  7. JZOJ 4253.QYQ在艾泽拉斯

    \(\text{Problem}\) 有向不联通图,求每个子图至多选出一条最大权值和的路径,求前 \(k+1\) 个 \(\text{Solution}\) 显然将每个子图缩点后 \(dp\),排序 ...

  8. Jetpack Compose学习(11)——Navigation页面导航的使用

    原文:Jetpack Compose学习(11)--Navigation页面导航的使用 - Stars-One的杂货小窝 在Android原生的View开发中的,也是有Navigation,原生我之后 ...

  9. vue2和vue3区别

    1. vue2和vue3双向数据绑定原理发生了改变 vue2的双向数据绑定是利用了es5 的一个API Object.definepropert() 对数据进行劫持 结合发布订阅模式来实现的.vue3 ...

  10. Postgresql CTE解析

    一.简介 WITH提供了一种方式来书写在一个大型查询中使用的辅助语句.这些语句通常被称为公共表表达式或CTE(Common Table Expressions),它们可以被看成是定义只在一个查询中存在 ...