基于unity+高通AR项目的一些总结

2023-10-31

今天,公司做的第一款AR项目终于在苹果appstore上架了。将近三个多月的踩坑和摸索也终于告一段落了,接下来就是不断的进行版本优化和更新,这将是一个漫长的过程。在此,对自己三个多月的开发做一个阶段性的总结,也希望能够帮到一些正在用unity开发AR应用的朋友。


开发环境:

    因为考虑到后期IOS打包的问题,为了避免尽量少出错,基本所有的开发全在一部21寸的IMAC上,用的自然是OSX系统(不能用VS真的好痛苦啊快哭了)。

    暂时只能配置了VSCode进行脚本的编写(想要用unity3d代码补全功能,除了官网所需要安装的插件之外 还需要brew install mono)。

    unity版本最初使用的是5.3.4版本,后来升级成了5.3.6版本,原因会在后面详述。高通SDK 也就是Vuforia用的版本是vuforia-unity-5-5-9(截止目前为止 最新的版本在6.0以上)。

    安卓打包环境通过下载android studio轻松配置完毕。Xcode从7.3版-8.0版本。



学习:

    之前从未接触过任何有关于AR开发的领域 ,只是隐约记得unity可以用来开发AR应用。这里建议各位AR开发者一定要下载ARSDK提供商的开发案例,直接看官方所提供的应用案例源码无疑是学习的最佳入口。由于Vuforia封装了上层的AR实现源码,将其打包成了DLL,开发者只要实现相对应的接口即可,并不需要过多的深入AR底层,对于底层比较感兴趣的朋友可以去github上搜寻AR底层实现的源代码,当然至今效果最好的还是高通的SDK,只是暂时看不到源码,无法深入学习。


遇坑:

    1.AR识别后的模型物体出现不稳定的情况,这一点实际上跟AR识别图有很大的关系,识别图的明暗对比,材质都将对此产生影响。一定要记得将画好的识别图上传到高通的开发中心,高通提供了对识别图的图集打包和识别图的识别点的显示。识别点越多,识别图越容易被显示,相应的识别星级也就越高。
    
    2.现在我的项目中模型摆放的方式是:在场景中摆入所要识别的imagertarget(有多少张就必须在场景中放多少个imagertarget,动态加载是没用的),将所要识别的模型作为子物体分别放在相应的imagertarget下,只要识别图一旦被识别 就会连同模型一起被激活显示,跃然纸上。一开始这种方式是非常好的,但却有一个致命的缺陷,因为要在场景中要摆放所有的模型,那么进入该场景时,就会占用大量的内存(因为要加载场景中所有的模型),这样移动端的配置越低进入的时间就越长,普遍在15秒以上,用户体验非常的不好。这是在项目的后期才发现的 ,为时已晚,不由有些遗憾。而一个我想到一个正确的思路是没必要将模型放在场景中,而是在imagertarget被识别时,以Resource的方式加载模型进场景中,并跟踪imagertarget的位置信息,然后以对象池的方式管理这些模型。这样在进入场景时,就不会因为加载过慢 影响用户体验。
   3.每个模型被识别后都会在UI上显示对应的名字(儿童百科全书~)还会播放对应的读音。对此,我才用json配表的方式做了一个对应的配置加载类。所有的数据只需要添表即可。当然,这样每个模型上都必须手动给予一个对应的数据加载唯一标识数。因为模型只有99个,故而用手动的方式给予还算方便,也许还有更好的方式,我暂时没想到。
   4.AR模型在多图识别的情况,会出现角度偏移的情况,这个问题非常让人抓狂,经过无数次的debug发现根本不是模型本身出现了角度偏移,而是父物体imagertarget出现了角度偏移,故而只需要在每次失去识别的事件接口中将其复位至原始位置即可。
   5.应用中接入了语音识别sdk,很不巧的发现unity5.3.4的一个bug,那便是调用麦克风识别之后,场景中的所有声音全部失效,再也没有任何的声音。这点唯独在unity5.3.4版本下有这样的bug,升级至5.3.6版本后就得以解决。
   6.在代码构造上,说实话实在过于凌乱,一方面是因为自己实在是经验不足,对逻辑的把控十分不清,因此在此阶段恶补了面向对象的编程思想和设计模式,才发现自己写的代码实在太难看了,难以扩展和修改,不过好在项目正常的运行起来,希望在将来能将代码构造的更加干净,写出真正优雅的代码。 奋斗
2016.11.24更新
    7.IOS手机屏幕的边框地带出现了诡异的残影,一开始以为是opengles的问题,试过切换图形库结果还是不行,最后发现是AR摄像机的刷新设置为根据深度进行刷新,后来设为soild color  黑色后 就一切正常了,完美解决。 
   
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于unity+高通AR项目的一些总结 的相关文章

  • Unity中按钮检测鼠标状态

    改方法主要是用于按钮检测鼠标的进入 滑出 点击 抬起 长按 长按停止 1 先将下面这个脚本挂载到需要检测鼠标状态的按钮上 using System Collections using System Collections Generic u
  • Unity动画系统详解

    目录 动画编辑器 编辑器面板 动画复用 前言 人形重定向动画 Humanoid 通用动画 Generic 旧版本动画 Legacy 动画控制器 系统状态 切换条件 状态机脚本 IK动画 反向动力学 BlendTree 混合树 Animato
  • Unity学习笔记(一)—— 基础知识

    一 基础知识 1 开发团队组成 2 unity特点 图形界面 所见即所得 入门简单 支持C 比OC C 更友好 js 国内外资源丰富 因为使用的人多 跨平台性好 PC端 移动端等 对VR AR的支持最完善 3 成功案例 游戏 炉石传说 神庙
  • unity工程崩溃资源找回

    1 Unity死机未保存场景 当你在Unity中编辑场景 突然死机时 可以在项目文件目录中找到Temp文件夹 双击文件夹 找到 Backupscenes文件夹 把后缀为 backup的文件后缀改为 unity 然后拖进Unity的Proje
  • Unity 键盘控制人物移动——之输入方式代码的编写

    键盘输入 控制人物移动 在我们制作游戏中最常见的需求之一就是使用键盘移动游戏角色 那么我们首先需要获取键盘输入 以下提供两种方法获取键盘 这里尽量通过截图解释让大家理解代码的含义 GetInput void FixedUpdate Move
  • VLC for unity 插件如何使用

    VLC for unity 插件如何使用 先去下载一个VLC播放器 安装完成后 然后导入插件链接https download csdn net my 这个插件我的另一个上传资源里有 或者到商店去下载 这个插件链接下载完是一个txt文档 里面
  • Mecanim Any State

    Any State表示任意状态 任意状态是 一个一直存在的特殊状态 他的存在是为了保证你在无意转移至某个你当前正处于的特殊状态而准备的 为你的状态机中的每个状态设置相同的对外转移是一个快捷的方式 假如有Walk Run Fly Die这四个
  • java中Keytool的使用总结

    java中Keytool的使用总结 2011 02 26 15 30 15 分类 在申请Android Map API Key的时候使用到了java中Keytool 下面转一篇介绍java中Keytool的文章 http blog csdn
  • Unity旋转以及万向锁问题

    我之前研读了一些关于unity旋转相关的博客 一直想抽个时间写个总结 但是由于实习太忙一直没有写 趁着今天请了假晚上有时间把这段时间一些学习心得写出来 Unity inspector面板中的Rotation 在unity中 想必大家最先接触
  • 【原神游戏开发日志1】缘起

    原神游戏开发日志1 缘起 版权声明 本文为 优梦创客 原创文章 您可以自由转载 但必须加入完整的版权声明 文章内容不得删减 修改 演绎 相关学习资源见文末 大家好 最近看到原神在TGA上频频获奖 作为一个14年经验的游戏开发行业的老兵 我就
  • 【转载】【Unity】WebSocket通信

    1 前言 Unity客户端常用的与服务器通信的方式有socket http webSocket 本文主要实现一个简单的WebSocket通信案例 包含客户端 服务器 实现了两端的通信以及客户端向服务器发送关闭连接请求的功能 实现上没有使用U
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Unity学习笔记

    一 旋转欧拉角 四元数 Vector3 rotate new Vector3 0 30 0 Quaternion quaternion Quaternion identity quaternion Quaternion Euler rota
  • Xcode 4.2 中的未知类型名称“命名空间”

    我正在编译QCAR SDK 但是当我向项目中添加更多框架后 它提示错误 Matrices h ifndef QCAR MATRIX H define QCAR MATRIX H namespace QCAR Matrix with 3 ro
  • U3D游戏开发中摇杆的制作(UGUI版)

    在PC端模拟摇杆 实现玩家通过控制摇杆让玩家移动 以下是完整代码 using System Collections using System Collections Generic using UnityEngine using Unity
  • 游戏开发创建操作之玩家信息系统的建立

    游戏一般都需要玩家信息系统 那么我们应该如何搭建玩家信息系统 接下来我将展示一种简单的方法 完整代码如下 using System Collections using System Collections Generic using Uni
  • 游戏开发常见操作梳理之小地图的制作

    游戏中一般存在小地图系统 实际上就是设置一个新的摄像机放置在玩家的正上方 然后在小地图上显示新摄像机看见的东西就可以了 在小地图上一般存在放大地图和缩小地图的按钮可以方便放大和缩小地图 这些操作是如何实现的呢 接下来直接上核心代码 usin
  • 游戏开发常见操作梳理之角色选择一

    进入游戏后 我们经常会进入角色选择的界面 通常是左右两个按钮可以更改角色供玩家选择 对于这种界面我们通常使用数据持久化将角色信息存储起来 接下来的笔记中 我将使用自带的数据持久化系统对其进行操作 实现角色的选择页面 后续会更新xml系列的文
  • 游戏开发中常见系统梳理之背包系统的实现一

    游戏中几乎都存在大大小小的背包系统 接下来我将讲述背包系统具体是如何实现的 完整源码 以下是使用unity NGUI实现 使用txt配置的方法 后续更新UGUI Json实现的背包系统敬请期待 背包中的物品我们常常将其制作成预设体 通过改变
  • 在 unity 和 vuforia 中重置图像目标中模型的缩放比例

    I m using Vuforia and unity for my AR App which has more than 2 models image targets To zoom in and out I used Lean Touc

随机推荐

  • 合并两个有序数组 java_Leetcode.合并两个有序数组(Java实现)

    合并两个有序数组 给定两个有序整数数组 nums1 和 nums2 将 nums2 合并到 nums1 中 使得 num1 成为一个有序数组 说明 初始化 nums1 和 nums2 的元素数量分别为 m 和 n 你可以假设 nums1 有
  • 最强自动化测试框架Playwright(32)-定位器

    定位器是playwright自动等待和重试能力的核心部分 代表了一种随时在页面上查找元素的方法 Locator Playwright Python 方法 all 当locator指向一组元素时 这个方法返回locator对应的数组 指向它们
  • 无刷电机驱动器

    0 0参考 FOC 看这篇文章就够了 志辉君 自制FOC驱动器 深入浅出讲解FOC算法与SVPWM技术 SPWM基本原理详解 图文并茂 公式推导 C程序实现 1 开源的FOC方案 1 SmipleFOC是比较常见的无刷驱动方案 因为其便宜的
  • 我的DDK学习经验(转载)

    这篇文章在无数技术网站都找的到 我在这里发这篇文章的原因 1 这篇文章实在很好 别说作者倾情的介绍了自己的经验和感想 尤其是关于 钱途 的感想 里面介绍的一些书 真够有志开发驱动程序的同志看半辈子了 2 我搜索了文档中心 没有发现这篇文章
  • Ubuntu 分辨率更改 xrandr Failed to get size of gamma for output default

    sudo vim etc xorg conf copy Section Monitor Identifier Monitor0 VendorName Monitor Vendor ModelName Monitor Model HorizS
  • Shell脚本攻略:循环语句while、until

    目录 一 理论 1 while 2 until 3 break 4 continue 二 实验 1 实验一 2 实验二 3 实验三 4 实验四 5 实验五 6 实验六 一 理论 1 while 1 while用法 while循环满足条件执行
  • C++ 构造函数初始化调用顺序及类函数内部嵌套函数情况

    一 C 构造函数初始化顺序 C 构造函数按下列顺序被调用 1 2 3 4是按照优先级顺序来的 1 任何虚拟基类的构造函数按照它们被继承的顺序构造 2 任何非虚拟基类的构造函数按照它们被继承的顺序构造 3 任何成员对象的构造函数按照它们声明的
  • Apex类格式

    例子
  • 自动化测试之Selenium

    https www cnblogs com ldd215 p 5549984 html 文章目录 python常用操作 0 1 获取Excel中的数据 0 2 截取图片 第一章 第一讲 自动化测试概述 1 1什么是软件测试 1 2什么是自动
  • 【 力扣(LeetCode)刷题详细介绍】

    转载于 东心十 关于leetcode刷题详细介绍 虽然刷题一直饱受诟病 不过不可否认刷题确实能锻炼我们的编程能力 相信每个认真刷题的人都会有体会 现在提供在线编程评测的平台有很多 比较有名的有 hihocoder LintCode 以及这里
  • Google浏览器安装插件

    以安装 沙拉查词 插件为例 1 先点击Google浏览器右上方三个小点 找到 设置 将搜索引擎改为Bing 2 然后就可以使用新建页面了 在新建页面搜索 极简插件 或 扩展迷 搜索 沙拉查词 并下载 下载下来是一个压缩包 解压之后可以找到里
  • dnf安徒恩服务器不稳定,DNF安徒恩开团后掉线那些事 网友:这时才体会到混子的重要性...

    原标题 DNF安徒恩开团后掉线那些事 网友 这时才体会到混子的重要性 DNF安徒恩副本难度对于目前的玩家来说并不难 所以很多人追求极限人数开团 有时是12人 有时甚至是10人 于是问题来了 有人掉线怎么办 一起来看看大家在安徒恩的遭遇 玩家
  • 华为2018秋招笔试——将一段压缩后的字符串解压缩,并且排序输出

    题目描述 将一段压缩后的字符串解压缩 并且排序输出 解压规则 每个字符串后面跟随一个数字 表示这个字符串的重复次数 例如 a5 解压缩的结果为 aaaaa abc3 解压缩后的结果为 abcabcabc 排序规则 1 根据每个字符串的重复次
  • 详解拷贝构造函数

    基本规则 拷贝构造函数是一种特殊的构造函数 函数的名称必须和类名称一致 它必须的一个参数是本类型的一个引用变量 所以类中可以存在多个拷贝构造函数 编译器会自动生成默认构造函数 这个构造函数很简单 仅仅使用 老对象 的数据成员的值对 新对象
  • PyTorch(Python)训练MNIST模型移动端IOS上使用Swift实时数字识别

    识别手写数字是计算机视觉的基石问题 可以通过神经网络来解决 在此 我不会重复有关模型构建和训练的细节 本文中 我的目的是将经过训练的模型移植到移动环境中 我使用 pytorch 构建模型 因为我想尝试一下 torchscript 对于 io
  • 山东大学项目实训开发日志——基于vue+springboot的医院耗材管理系统(14)

    我们解决了一个逻辑上的问题 1 医院向供货商下单 如果供货商一时不能提供足够的数量 应该怎么办 2 科室库向中心库提交申请 如果中心库库存不满足申请的数量 应该怎么办 经过一番讨论 对于第一个问题 后端的负责人表示 应该有一个功能 允许供货
  • ESP8266-01S系列学习笔记-01模块基本知识

    1 产品概述 ESP8266是乐鑫科技生产的一款内置WiFi功能的单片机 它有很多种型号 这些型号分别对应了不同的封装 ESP8266是一款超低功耗的UART WiFi 透传模块 拥有业内极富竞争力的封装尺寸和超低能耗技术 专为移动设备和物
  • 【实战教程】在小程序中快速生成分享海报

    在小程序中生成分享海报是一个很常见的需求 目前主要有以下两种做法 直接由前端生成 使用小程序提供的 canvas API 由后端知晓云 云函数 生成 前端再获取 本文将介绍通过知晓云 云函数 来生成分享海报的功能 并使用 webpack 和
  • ElasticSearch学习笔记(4)· ES IK分词器

    目录 九 IK中文分词器 1 在线安装IK中文分词器 2 本地安装IK中文分词器 3 扩展词 4 停用词 5 配置远程词典 6 分词器总结 九 IK中文分词器 NOTE 默认ES中采用标准分词器进行分词 这种方式并不适用于中文网站 因此需要
  • 基于unity+高通AR项目的一些总结

    今天 公司做的第一款AR项目终于在苹果appstore上架了 将近三个多月的踩坑和摸索也终于告一段落了 接下来就是不断的进行版本优化和更新 这将是一个漫长的过程 在此 对自己三个多月的开发做一个阶段性的总结 也希望能够帮到一些正在用unit