《网易戏精》是网易人工智能事业部旗下一款AI短视频产品,用户可以随手拍出自己的特效视频,其中包含数十个有趣的奇幻道具,其中放置类的道具只需要扫一下平面,即可摆放进现实世界中进行互动,既有充满霓虹灯的旺角街头、会随音乐抖动的DJ打碟台、迪厅球,也有烟雾缭绕的迷幻场景等等。

(会随音乐抖动的DJ打碟台)

此类放置类道具在安卓端基于Google的ARCore技术实现。本文整理归纳项目研发中ARCore的使用及研发历程,与大家一起分享在AR应用开发中遇到的问题及实践。主要分为以下几个方面,已有相关经验的ARCore开发者可以选择性跳过。

  1. ARCore简述
  2. ARCore原理的进一步理解
  3. ARCore和ARKit的功能性对比
  4. ARCore API架构梳理
  5. ARCore的兼容性及解决方案
  6. 开发者可能会遇到的Troubleshoot

ARCore简述

ARCore SDK主要由三大模块构成:运动跟踪、环境理解、光照估计。

  1. 运动跟踪可以让手机理解和跟踪它相对于现实世界的位置。
  2. 环境理解让手机可以检测各类表面(例如地面、咖啡桌或墙壁等水平、垂直表面)的大小和位置。
  3. 光估计让手机可以估测环境当前的光照条件。

ARCore原理的进一步理解

对ARCore底层原理的了解可以帮助我们了解计算的过程以及解决一些问题。

首先,ARCore使用视觉惯性测距系统(Visual Inertial Odometry,简称 VIO)的算法来实现运动跟踪。VIO将从设备的摄像机中识别图像特征与内部运动传感器结合起来,以获得设备的6DOF(6 Degree Of Freedom,6度自由度)信息。我们常说的6DOF指的是三维的位置与三维的旋转,而3DOF常指三维的旋转(直接通过陀螺仪即可获得,比起6DOF计算较为简单)。


  (上图即是6DoF的图示)

惯性测量单元(Inertial measurement unit,简称 IMU)的读数大约为1000次每秒并且是基于加速度的(用户的移动)。航迹推算法(Dead Reckoning)用于测量 IMU 读数之间的设备移动,但这种方法推算是一种估算,就像如果我让你向前走一步,然后猜测走了多远一样,此时会用航迹推算法来估计距离。但惯导系统中的误差会随时间累积,所以 IMU 帧率越长,惯导系统从视觉系统中复位后的时间越长,追踪位置距离真实位置偏差就越多。

视觉/光学测量使用的是摄像机来采集视觉信息,设备帧率通常为 30fps 并且依赖距离(不同的场景帧率也有所不同)。光学系统通常随着距离的增大误差也不断的增大(时间也会有轻度影响),所以用户运动得越远,误差就越大。

惯性导航系统与视觉测量系统各有各的优势和不足。并且视觉和惯性跟踪系统是基于完全不同的测量系统,他们之间并没有相互依赖,所以他们整合在一起可以互相弥补缺陷。这意味着可以盖住摄像机或者只看到一个具有很少光学特征的场景(比如白墙),而惯性系统照样可以正常工作,或者设备在完全静止的条件下,视觉系统可以呈现出一个比惯性系统更加稳定的姿态。在此之上这个算法使用卡尔曼滤波器不断地选择最佳姿态,从而实现稳定跟踪。

与ARKit的功能上的对比

为了尽可能保证Android用户和iOS用户的功能一致性,我们整理了ARKit和ARCore在各个版本上的功能。版本上需要注意的是,ARKit的版本取决与手机的操作系统级别,ARCore的运行版本取决于手机上安装的ARCore Runtime Apk,Runtime对SDK采取向下兼容机制,并且用户如首次安装ARCore Runtime Apk后,之后作为内核服务自动更新。

ARKit ARCore
6DOF追踪 支持(1.0)(iOS11) 支持(1.0)
相机分辨率、自动对焦 支持(1.5)(iOS11.3) 支持(1.4)
图片扫描 支持(1.5)(iOS11.3) 支持(1.2)
云锚点 支持(2.0)(iOS12) 支持(1.2)

ARCore API架构梳理

ARCore SDK模块设计易于理解,开发者可以很简单地找到相应的API,简单列了一张重要/常用API的对应概念:

Session: 负责整个AR算法的生命周期和算法配置文件选项,主要有Start\\Pause\\Resume\\Stop,配置文件可配置是否开启位置追踪、2D图片识别、环境光检测等功能,多余的配置涉及到可观的性能开销,并且在切换配置的过程中会涉及到相机画面的重启,建议产品根据各自情况进行选择。

运动追踪相关

Frame.CameraImage.Texture Frame.CameraImage.DisplayUvCoords 相机纹理ID,对应于OpenGL中一张Texture中的Gluint,注意此Texture为一张旋转的External OES Texture,必须搭配DisplayUvCoords信息才能正确渲染(OES Texture与普通纹理有所区别,下文会举例一个实战issue)
Frame.CameraBuffer.AcquireCameraImageBytes 可获得Camera的原始相机数据,格式为YUV420_888,此格式为Android Camera2的默认格式(注意此格式将YUV分离为3个Stride,与Camera1的NV21有所不同)。获得原始数据一般用于进一步的图像处理或CV算法
Frame.Pose.position Frame.Pose.rotation 包含了运动追踪的结构体,包括相机当前位置、旋转等

环境理解相关

Session.GetTrackable 可以获得已经被AR算法重建的平面
Frame.Raycast 从三维世界一个点沿一个方向发射出一条无限长的射线,在射线的方向上,一旦与现实世界的特征点、平面产生碰撞,则返回碰撞对象包含的位置、方向及其他相关属性

光估计相关

ARCore兼容性及解决方案

目前ARCore支持的机型主要为17年、18年发布的旗舰机,下图列了支持的国内主流设备列表,观察到表中支持的设备主要为高通芯片和ARM芯片,据官方所述后续还会支持联发科芯片的机型。

OEM Model
小米 Mi Mix 2S, Mi Mix 3 Mi 8, Mi 8 SE
华为 Honor 10, Honor Magic 2, Maimang 7 Mate 20, Mate 20 Pro, Mate 20 X nova 3, nava 3i P20, P20 Pro Porsche Design Mate RS Porsche Design Mate 20 RS
三星 Galaxy Note9 Galaxy S9, Galaxy S9+

值得一提的是Google官方考虑到国内用户无法在Google Play安装/更新ARCore Runtime,提供了小米、华为和三星应用商店作为国内安装跳转链接。

用于保证机型覆盖率,我们选用了网易的InsightSDK 作为ARCore的fallback的方案,开发的时候可以通过官网的ARCore设备白名单或者Session.CheckApkAvailability的方式进行自动选择SDK。

开发者可能会遇到的问题

1. 运动中做运动跟踪

例如,如果用户是在火车上使用ARCore,这时IMU(Inertial Measurement Unit)获取的数据不仅包括用户的移动(实际是加速度),也包括火车的移动数据(实际是加速度),这样将导致跟踪失败。

2. 跟踪动态的环境

例如,如果用户对着一面大白墙、波光粼粼的湖面,这时从摄像机获取到的图像信息是不稳定的,这将导致特征点提取出错进而导致跟踪失败。

3. 热飘移

相机与 IMU 都是对温度敏感的元器件,之前我们说过相机和IMU的OEM校准,但这个校准通常都会在某一个或者几个特定温度下进行,但在用户设备使用过程中,随着时长的延长会导致设备发热,发热就会影响到相机获取的图像的颜色信息和IMU测量的加速度信息准确性,表现出来就是跟踪的物体会飘移。

4. CPU抢占

从上面的ARCore算法中发现AR算法对CPU要求较高。如果你的App占用了过多的CPU,依然会导致ARCore的效果不稳。可以使用类似SnapDragon Profiler的工具进行一个性能排查。

5. 使用Linear渲染模式

为了追求正确的光照计算,我们使用了Linear渲染模式,但是ARCore并没有提供Linear模式下相关的shader。可以使用以下函数对颜色空间进行转换:

pow(gl_FragColor.rgb,vec3(2.2));

6. External OES Texture的特殊性

将Camera Texture渲染到屏幕的shader使用的是External OES Texture,在实际的使用过程中发现单独使用External OES Texture没有问题,但是结合一张正常Texture会渲染成黑色,经过排查问题发现External OES Texture的底层实现是多个单通道Texture的打包,所以在External OES Texture之后Bind的正常GLuint可能会错误的绑定,这个时候可以将External OES Texture放在最后即可解决。

7. 结合计算机视觉

因为需要将Camera的相机数据做进一步数字图像处理或者CV检测,除了直接获得TextureID,还需要获得相机Buffer,但是小米手机调用Frame.acquireCameraImage() API会抛出NotYetAvailableException,官方文档有在小米的手机上说明这个问题,所以使用这个API还不能做到完全统一兼容。

总的来说,尽管ARCore推出的时间较ARKit迟,但功能上基本与ARKit持平。并且回顾ARCore近一年的发展上看,ARCore也在率先提出一些行业标准,像Cloud Anchor这样的新feature就是由ARCore率先提出,由此可见Google对ARCore的投入和在AR领域决心。同样,社交化的应用方式也是AR技术落地的重要场景。预计未来几年AR的开发生态会逐步完善并标准化,对开发者来说是十分值得期待的。

本文作者:邓志鹏,网易人工智能事业部资深技术美术专家,《Unity5.x从入门到精通》作者之一,主要关注于将AI、AR等前沿技术用于图形、交互领域。

网易戏精ARCore短视频新玩法实践相关推荐

  1. 新媒体短视频营销玩法

    目前短视频用户需求正在进一步释放.短视频活跃用户规模增势强劲,让新媒体短视频的商业价值展示得淋漓尽致.想要将短视频背后的巨大流量转化为实实在在的商业价值,更好地发挥新媒体短视频没有完全发挥出来的商业潜 ...

  2. 无水印视频免费素材 抖音短视频特效玩法技巧

             无水印视频免费素材 抖音短视频特效玩法技巧          人尽皆知,抖音是年轻化的,而作为"很皮"的90后.00后们,要想获得他们的青睐,那你的产品就要是有趣 ...

  3. 短视频种草玩法,月入3W一点也不难丨国仁网络资讯

    做短视频怎么样变现最快?是广告.是小黄车.是直播带货?这些答案对也不对,因为它们都是可以变现的方式,但最快的却一定是做短视频种草号. 种草号,一开始就是奔着某一领域产品做垂直类种草变现的目的而去,它不 ...

  4. 抖音短视频KOL玩法.优质抖音KOL

    在这个'刷的停不下来'的平台,每天都能发现许多好玩的.有趣的.有用的内容,然后不自觉地花费时间,不自禁地带入生活.各种网红系列玩法.网红吃法.网红生活-等系列有着"抖音元素"的内容 ...

  5. 【寻找最佳小程序】05期:腾讯视频——与App优势互补,探索视频新玩法

    专栏记者:陈秋歌 如果您希望将本人或团队开发的小程序介绍给更多人了解.使用,十分欢迎联系本专栏记者陈秋歌(chenqg#csdn.net.微信:Rachel_qg),获得CSDN的采访报道及宣传推广机 ...

  6. 不要再被别人忽悠了,短视频的玩法真的不是他慢的说的那样,不要走弯路了

    抖音运营干货:如何提高点赞.播放.转发量,获得更多推荐 做过抖音运营的小伙伴都知道,一个视频上热门后,可以帮你快速引流变现.那么抖音应该如何提高点赞.播放量,获得更多的推荐?怎样防止引流时被降权限流? ...

  7. 沉睡者IT:零基础学习短视频与+玩转抖音快手

    零基础学习短视频与+玩转抖音快手 一.正常活跃账号 新号前期别刷粉.别刷赞.别刷任何量,千万别刷!养成一个良好的习惯,去观看作品, 把内容好的作品点赞收藏评论. 权重 权重是一个内在的数值,查看方式是 ...

  8. 数据与智能武装营销飞轮,网易探索C2B时代营销新玩法

    新科技.新商业.新模式,电商行业历经多年的发展,已经不止于单一的线上交易模式了.在新技术大量应用于电商,催生新商业模式.新交互体验的环境下,电商竞争日趋激烈,新玩法层出不穷.如何借助数据与AI技术,找 ...

  9. 【网易MCTalk】除了低价促销、丰富品类,电商就没有新玩法了?

     MCTalk介绍 ---------- 网易发起,网易云通信与视频(Netease Multi-media Communication)主导的科技活动品牌,包含线下沙龙.城市论坛.视频访谈等形式. ...

最新文章

  1. NanoDet:轻量级(1.8MB)、超快速(移动端97fps)目标检测项目
  2. 个人管理 - 目标管理之前,你会时间管理吗
  3. poj 2346(DP)
  4. python自动答题软件_广东开放大学(广开)线上作业自动答题python-selenium
  5. 一文读懂最强中文NLP预训练模型ERNIE
  6. psycopg2.errors.UndefinedTable: relation “xxxx“ does not exist
  7. js中==和===的区别
  8. Vue教程:简介(一)
  9. javascript getBoundingClientRect()获取元素四个边相对于窗口或文档的位置
  10. 假设检验方法-T检验、Z检验、F检验、卡方检验
  11. 外卖cps返利定制开发源码平台小程序美团饿了么红包电影票券分销
  12. Cors跨域(一):深入理解跨域请求概念及其根因
  13. 独步天下的创业历险记6-一叶知秋
  14. 电磁攻击方法与能量攻击方法的对比
  15. 十个Chatbot框架介绍
  16. 苹果鼠标怎么充电_“智能”还是“多功能”?米物智能鼠标垫测评
  17. 上海-亚马逊AWS联合创新中心正式启用
  18. 什么是企业管理系统,应如何选择?
  19. 递归求二叉排序树ASL值
  20. 毕业设计 Spring Boot的垃圾分类管理系统(含源码+论文)

热门文章

  1. 微信小程序wx.showModal中content换行
  2. Win11的两个实用技巧系列之nvidia控制面板没反应和闪退解决方法
  3. html中let函数,JavaScript中var、let、const的区别是什么?
  4. 服务好“最后一公里”,高效CDN架构经验
  5. Windows桌面小程序+谷歌浏览器+人工智能算法 = 100+职位一键投递
  6. 【从零开始的Java开发】2-9-3 油画商城静态网页案例
  7. c语言综合设计题带答案,c语言程序设计题目及答案
  8. 怎么对接NODE.JS语言短信验证码接口?
  9. java怎么上传文件到虚拟主机,购买虚拟主机如何部署java项目
  10. ffmpeg 同宽度 画中画_ffmpeg画中画效果