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

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

    Verilog语法 1 Register 组合逻辑-->寄存器-->组合逻辑-->寄存器 Register是一个变量,用于存储值,并不代表一个真正的硬件DFF. reg A,C; / ...

  2. win32com操作word API精讲 第六集 Range(四)对齐和缩进

    本课程<win32com操作word API精讲&项目实战>同步在B站.今日头条.视频号及本公众号发布.其中本公众号以发布文字教程为主. 今天是大年初二,一灯在此祝愿各位朋友兔年吉 ...

  3. 图文并茂基于阿里云linux服务器部署nodejs项目并添加pm2守护nodejs项目运行进程(Linux version 4.19.81-17.1.al7.x86_64)

    首先你要有一台LINIX服务器,登入以后按下面步骤执行命令,可查看系统版本以及配置 查看Linux 内核 通过 uname -a 命令查看系统位数是64位 x86_64表示64位系统, i686 i3 ...

  4. thinkphp无法访问man.php/index/login

    配置半天.user.ini,权限问题解决了,但是还是访问不了后台登陆界面(链接:域名/man.php/index/login),后来发现是伪静态thinkphp没设置好,设置好后重启nginx就好啦

  5. OpenMP For Construct dynamic 调度方式实现原理和源码分析

    OpenMP For Construct dynamic 调度方式实现原理和源码分析 前言 在本篇文章当中主要给大家介绍 OpenMp for construct 的实现原理,以及与他相关的动态库函数 ...

  6. spring in action day-06 JMS -ActiveMQ Artemi

    JMS -ActiveMQ Artemi JMS:它是一个规范,类似于jdbctemplate Spring提供了jmstemplate来发送和接收消息. 搭建JMS环境 1.引入依赖 我们要使用的消 ...

  7. 为K8S集群准备Ceph存储

    随着K8S存储接口逐渐成熟并顺势推出CSI接口规范后,原来"in-tree"(树内)模式的很多存储插件也逐步迁移到了"out-of-tree"(树外)模式的CS ...

  8. 学习Java Day22

    今天学习了如何在包中增加类,想要将包放入类中,就必须将包的名字放在源文件的开头,即放在定义这个包中各个类的代码之前

  9. SPI的 CLK_POL和CLK_PHA

    1.模式0(CPOL=0,CPHA=0) 模式0特性: CPOL = 0:空闲时是低电平,第1个跳变沿是上升沿,第2个跳变沿是下降沿 CPHA = 0:数据在第1个跳变沿(上升沿)采样 2.模式1(C ...

  10. 一文详解SpEL表达式注入漏洞

    摘要:本文介绍了SpEL表达式以及常见的SpEL注入攻击,详细地介绍了部分漏洞攻击实例以及常用的漏洞检测与防御手段. 本文分享自华为云社区<SpEL表达式注入漏洞分析.检查与防御>,作者: ...