ARCore:ARCore开发的起步

2023-11-04

已经是第7章节了,终于可以开始正式接触到我们梦寐以求的ARCore了,相信大家应该都有一点点小激动了吧。那么下面我们就开始讲解如何进行ARCore的开发。

一、Session简介


初看到Session,大家都摸不到头脑。最直接的解释,它是ARCore API的一个类com.google.ar.core.Session。它管理了AR系统的状态,有自己的生命周期,开始和停止访问摄像头图像帧的获取。

所管理AR系统状态,包含跟踪的Anchor信息、通过session.add(Pose)和session.removeAnchor(anchors)保存和删除。session.getAllPlanes()返回被检测到的平面、当前投影矩阵等。

当ARCore App退至后台,Activity调用onPause()方法时,也需要通过session.pause()暂停Session,来停止摄像机的图像获取并获取资源。在App呈现在前台的时候,onResume()方法中调用session.resume(Config)可以重新启用Session,获取摄像机图像等。

有了平面和虚拟内容位置等信息进行渲染。但是当手机的位置移动的时候,我们是如何保持绘制内容的“位置不变”的呢?这都是基于ARCore系统不断返回的图像帧、设备位置和朝向等信息。调用session.update()方法来获取最新的相机帧,更新设备的位置,更新被跟踪的Anchor信息,更新被检查的平面。

二、Config简介


Config,即ARCore API中com.google.ar.core.Config,保存了用于配置Session的设置。那么这个配置中都包含了什么呢?

  1. 光线评估子系统的行为Config.LightingMode,包含开启或者禁止光线评估。
  2. 平面检测子系统的行为Config.PlaneFindingMode,包含开启和禁止平面检测。
  3. update()的行为Config.UpdateMode。在大多数设备中,摄像头被配置每秒捕捉30帧。当调用update()从摄像机获取帧的时,没有新的相机图片包含两种行为:立即分会和阻塞等待。

另外前面提到过目前并不是所有设备都支持ARCore,session.isSupport(config)方法就能完成当前设备是否支持该ARCore的配置。

三、ARCore开发起步


了解了Config和Session的意义之后,正式开始ARCore开发。我们需要处理这么几件事情:

  1. ARCore设备支持检测:自定义或者创建默认Config,然后通过Session来检测当前设备是否支持当前ARCore配置。
  2. 处理Session生命周期和视图变化:

    • 在Activity的onPause()和onResume()生命周期回调中,处理Session生命周期。正确的开始和暂停相机获取图像,释放资源等。
    • 当手机屏幕变化等情况发生,导致GLSurfaceView大小变化。需要适当调整透视图矩阵和背景,设置纵横比和坐标缩放,用于UV坐标系和投影矩阵生成。保证变化后虚拟内容的正常渲染。

四、案例源码分析


了解了基本的概念和步骤后,我们来看看在Google的ARCore Demo中是如何处理的。
1. ARCore设备支持检测
com\google\ar\core\examples\java\helloar\HelloArActivity.java

public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer {
    ... ...
    private Session mSession;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ... ... 
        //Sessoin类是ARCore API的主要入口,管理AR系统状态和处理Session生命周期,接收帧允许访问摄像头的图片和设备的Pose
        mSession = new Session(/this);
        //创建默认的Config,平面检测,光线评估被启动,并且阻塞更新被选中。检查当前的设备是否支持ARCore,从这个Config创建Session
        mDefaultConfig = Config.createDefaultConfig();
        if (!mSession.isSupported(mDefaultConfig)) {
            Toast.makeText(this, "This device does not support AR", Toast.LENGTH_LONG).show();
            finish();
            return;
        }
        ... ...
    }
}

2.处理Session生命周期和视图变化
com\google\ar\core\examples\java\helloar\HelloArActivity.java

public class HelloArActivity extends AppCompatActivity implements GLSurfaceView.Renderer {
    ... ...
    private Session mSession;

    @Override
    protected void onResume() {
        super.onResume();
        //ARCore需要摄像机权限来操作。如果我们还没有Android M及以上得到运行时的权限,现在是一个向用户请求它的好时机
        if (CameraPermissionHelper.hasCameraPermission(this)) {
            showLoadingMessage();

            //使用默认配置恢复Session,如果Session没有开始或者被暂停,这个方法必须在App的UI线程中被调用。它将会启动Session,初始化相机和运动跟踪,当update()被调用的时候,将会产生帧。注意这个顺序很重要 - 在onPause()中看到该说明,相反的在这里也同样适用。
            mSession.resume(mDefaultConfig);

            //恢复渲染线程,如果有必要的话重新创建OpenGL上下文,它和onPause对应
            mSurfaceView.onResume();
        } else {
            CameraPermissionHelper.requestCameraPermission(this);
        }
    }

    @Override
    public void onPause() {
        super.onPause();
        //注意这个顺序很重要 - GLSurfaceView首先暂停所以它不会再尝试查询Session。如果Session在GLSurfaceView。前被暂停,GLSurfaceView可能一直调用mSession.update()并且获取一个SessionPauseException
        mSurfaceView.onPause();

        //暂停当前Session,这个方法将会停止相机反馈和释放资源
        mSession.pause();
    } 

        @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
        GLES20.glViewport(0, 0, width, height);

        //通知ARCore Session视图大小被改变,所以透视矩阵和视频背景可以适当的调整。设置纵横比和坐标缩放,这个数据将会被使用UV坐标系,生成投影矩阵
        mSession.setDisplayGeometry(width, height);
    }
}

1.新技术,新未来!尽在1024工场。时刻关注最前沿技术资讯,发布最棒技术博文!(甭客气!尽情的扫描或者长按!)
1024工场服务号

2.完整和持续更新的《使用Android打开AR的开发大门—ARCore》文档,欢迎大家阅读!
https://www.kancloud.cn/p3243986735/arcore_develop/457951
这里写图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ARCore:ARCore开发的起步 的相关文章

  • 如何使用 JSESSIONID 手动加载 Java 会话?

    我有一个处理多部分表单帖子的 servlet 该帖子实际上是由嵌入在页面中的 Flash 文件上传组件制作的 在某些浏览器中 Flash 生成的 POST 不包含 JSESSIONID 这使得我无法在发布期间从会话加载某些信息 Flash
  • Php 会话标头已经发送错误[重复]

    这个问题在这里已经有答案了 可能的重复 php 标头已发送错误 https stackoverflow com questions 3319207 php headers already sent error 我已附上我的代码 该代码用于
  • PHP7.1上读取会话数据失败

    分享一个我遇到的问题 现已解决 在我的开发机器上 我使用 PHP 运行 IIS 我升级到 PHP7 突然我的代码不再工作 返回此错误 session start 读取会话数据失败 用户 路径 C WINDOWS temp 看起来像是权限问题
  • Rails 中的会话、子域和 authlogic 问题

    我有一个带有 authlogic 身份验证的 Rails 应用程序和一个使用 subdomain fu 构建的 username domain com 结构 但是当从domain com转到username domain com时 我的会话
  • Firebase 3.0 会话持久性

    在 firebase 3 0 中使用会话持久性似乎是不可能的 这在以前的版本中是可能的 https www firebase com docs web guide login password html https www firebase
  • 如何使用python登录页面,该页面需要服务器在第一次请求时响应会话ID?

    我正在编写一个脚本来登录某个网页 我使用 request 和 request session 模块来实现此目的 在使用登录参数的第一个请求时 服务器响应一个会话 ID 如何设置该会话 ID 以进一步登录到同一页面 url some url
  • 如何在 Jersey RESTful Web 服务中放置 cookie?

    我想通过 Jersey API 将 cookie 从 PUT webservice result 放置到 POST webservice 这是我的代码 WebResource service1 client resource http te
  • PHP 自定义会话处理程序问题 (PHP 7.1)

    我刚刚在计算机上从 PHP 7 0 迁移到 PHP 7 1 当前版本的 WAMP 的全新 全新安装 它似乎破坏了自定义会话处理程序中的某些内容 该处理程序应该将会话保存到数据库而不是使用文件系统 自定义处理程序类是 class db ses
  • SESSION 中存储的数组后面出现数字

    我正在对存储在会话变量上的数组执行 print r 由于某种未知的原因 它在数组打印后添加了一个数字 Example Array 0 gt 868 userid gt 868 1 如果我直接在函数本身中执行 print r 并且在变量存储在
  • Session_set_save_handler 未设置

    我在设置 session set save handler 时遇到问题 我将 php ini 配置为 session handler user 这个简单的测试失败了 Define custom session handler if sess
  • 会话劫持和 PHP

    让我们只考虑服务器对用户的信任 会话固定 为了避免我使用的固定session regenerate id 仅在身份验证中 login php 会话侧劫持 整个站点的 SSL 加密 我安全吗 阅读 OWASPA3 破坏的身份验证和会话管理 h
  • 有没有办法清除所有会话中的一些会话数据?

    一般来说 我有以下场景 从数据库中获取产品及其相关数据 将获取的数据转换为 php product 对象 在会话中缓存产品对象 缓存是只读的 即客户在网站上查看产品 但也有类似的电话getProductIdsByCategory categ
  • Rails 会话间歇性重置

    我知道这个主题已经被讨论了很多 但我相信我已经找到了它的一个新变体 我有一个 Rails 4 应用程序 它是从 Rails 3 升级的 并且具有rails ujs and csrf meta tags设置正确 一旦root url在浏览器中
  • PDO 静默准备失败[重复]

    这个问题在这里已经有答案了 我正在尝试 PHPsession set save handler我想使用 PDO 连接来存储会话数据 我有这个函数作为写入操作的回调 function write id data logger WRITE id
  • Tomcat 如何保持会话完整性?

    HttpServletRequest s 获取会话 布尔值 http download oracle com javaee 6 api javax servlet http HttpServletRequest html getSessio
  • Symfony2:间歇性高响应时间/缓慢 SessionHandlerProxy::read() 完成

    我看到来自 Symfony2 会话管理器组件的非常奇怪的行为 特别是 SessionHandlerProxy read 函数在我的生产环境中有时会非常慢 Symfony Component HttpFoundation Session St
  • WebSphere 中跨 JVM 的会话复制

    我们建立了一个基础设施 其中网络服务器是集群的 而应用程序服务器不是 Web 服务器根据循环策略将请求路由到应用程序服务器 在这种情况下 一个应用程序服务器中可用的会话数据在另一应用程序服务器中不可用 无论如何 是否可以使来自第一个应用程序
  • 使用 servicestack 如何防止 cookie 添加到响应中?

    我可以在事后删除cookie 方法如下 public override void Configure Funq Container container ResponseFilters Add req res dto gt HttpListe
  • Flask 会话变量

    我正在用 Flask 编写一个小型网络应用程序 当两个用户 在同一网络下 尝试使用应用程序时 我遇到会话变量问题 这是代码 import os from flask import Flask request render template
  • PHP session_regenerate_id 和黑莓浏览器

    问候 我正在开发一个登录系统 并陷入了黑莓浏览器身份验证的困境 他们似乎对 PHP 的 session regenerate id 有问题 有人可以建议替代方案吗 以下是身份验证和登录脚本 UPDATE看来会话一般都不起作用 拿出 sess

随机推荐

  • 为Linux安装软件包时后面标注的arm,aarch到底是什么玩意儿以二进制安装docker-compose为例

    引言 装docker compose装不上 去github找二进制 看到这些版本人傻了 记录一下 如何确定自己的服务器应该安装哪个 Arch命令 arch 这个最简单 直接输出架构方式 aarch64 就是 ARM 架构 x86 64 就是
  • C语言 有八层灯塔,每层的灯塔灯数都是上一层的两倍,共有765盏灯,求最上层和最下层的灯数。...

    int top 1 bottom i sum while 1 bottom top 把最上层的数赋给其下一层 作为下一层是上一层的两倍数的计算基数 sum 0 for i 1 i lt 8 i bottom 2 使得bottom从第七层开始
  • shell 脚本的一些常用命令 set, export, shell数组,esac, tee,time

    1 set Linux set命令用来设置 shell 设置使用shell的执行方式 参数说明 a 标示已修改的变量 以供输出至环境变量 b 使被中止的后台程序立刻回报执行状态 C 转向所产生的文件无法覆盖已存在的文件 d Shell预设会
  • 点云地图PCL转换成为八叉树地图octomap

    TODO 完成离线点云地图到八叉树地图的转换 进一步在线实时完成点云地图到八叉树地图的转换 转载自高翔的博客 SLAM拾萃 1 octomap 我是萌萌哒的分割线 大家好 时隔多年之后 我又开始了博客旅程 经历了很多事情之后呢 我发现自己的
  • CodeBlocks 的安装以及编译器的配置

    截止到我安装的今天 Code Blocks的最新版本为16 01 建议官网下载 下载地址http www codeblocks org downloads 下载下来之后是一个可执行文件 然后点击安装就可以了 安装完成之后显示的界面如下 注意
  • unity使用PhotonEngine实现多人联机游戏开发(一)

    unity使用PhotonEngine实现多人联机游戏开发 一 先来了解一下PhotonEngine 光子引擎 这是德国ExitGame公司开发的网络引擎 photonengine简单易上手 很多游戏公司开发的网络游戏都是使用的这个 这个网
  • 记录springboot+vue+fastdfs实现简易的文件(上传、下载、删除、预览)操作

    前言说明 springboot vue FastDFS实现文件上传 支持预览 升级版 FASTDFS部分 FASTDFS安装过程 基于centos 7安装FastDFS文件服务器 SpringBoot部分 springboot源码实现 pa
  • 何以解忧,唯有程序员硬核段子

    大家好 我是五月 前言 程序员应该是最喜欢自黑的职业了 因为黑程序员这个门槛有点高 外行人根本黑不到点子上 程序员们看不下去了 只好提起裤子自己上了 而且程序员的段子大多比较硬核 一般人可能会有点难以理解其笑点 下面找了几个程序员专属的段子
  • RDP远程桌面协议

    1 概况 目前常用的远程桌面协议有VNC SPICE RDP三种 2 RDP Remote Desktop Protocol 远程桌面协议 是一个多通道 multi channel 的协议 让用户 客户端或称 本地电脑 连上提供微软终端机服
  • IT网络时代文章读后感2011年3月10日星期四 晴 【大明原创,转载必须标明出处】

    我宿舍规矩开学来的第一天基本都是座谈会 是坐在一起说说各自的新鲜事 和老金侃侃而谈说点保定的新鲜事 和晨阳吹吹牛 和小新说说家里的热闹事 和老刘交流一下NBA赛事 和小白调侃一下 逗乐一下 然后就是老金和晨阳说起了网络游戏情节 就表示散会了
  • taro发版的时候,微信提示wx.getLocation 接口未配置在app.json文件中

    如何解决这个问题呢 taro的开发者找到app config ts文件 原生小程序的开发者找到app json文件就可以 uinapp的开发这找到manifest json文件 找到文件了以后呢 在window的同级添加requiredPr
  • 什么都不懂的人怎么样可以建立自己的网站

    网站建设教程 新手如何自己建网站 很多从来没有做过网站的新手都很想知道 如何建设自己的网站 需要准备什么 步骤有哪些 在讲解之前 需要先明白网站主要由什么组成 一个完整的网站必须具备三元素 域名 网站空间 服务器 网站程序 域名就是网址 空
  • 牛逼了,这21款游戏项目,只一行代码即可上手—开玩【附源码】

    导语 随着时代的不同 社会的改变 伴随着一起长大的游戏 逐渐淡出我们的视线 却一直铭刻在我们心中 还记得你小时候都玩过什么游戏吗 超级玛丽 坦克大战 魂斗罗 贪吃蛇 植物大战僵尸 咳咳咳 有点儿暴露年龄了哈 今天就分享一个私藏的项目 fre
  • JS判断时间上传格式

    MimeType 文件类型 application msword word doc application vnd ms powerpoint powerpoint ppt application vnd ms excel
  • 链表——一种线性数据结构

    链表 链表中的每个元素实际上是一个单独的对象 而所有对象都通过每个元素中的引用字段链接在一起 线性数据结构 与数组一样 链表也是线性数据结构 他们的区别在于存储方式不同 顺序存储结构 数组 快速的存和取 逻辑上相邻 物理上也相邻 链式存储结
  • 深入leveldb-初步认识leveldb

    文章参考http blog chinaunix net uid 26575352 id 3245476 html 1 leveldb简介 leveldb是google两位工程师实现的单机版k v存储系统 具有以下几个特点 1 key和val
  • 数组环形队列(FIFO)

    数组环形队列 FIFO 一 说明 环形队列的关键是判断队列为空 还是为满 当tail追上head时 队列为满 当head追上tail时 队列为空 二 代码实现 define ElemType uint8 t 定义数据类型 define Qu
  • python的小作业

    目录 python安装 2 打印0 100 遇到19的时候跳出循环 3 只打印90以内的奇数 4 对发送邮件代码进行修改 换成自己的邮箱并截图保存 5 对指导书中海龟画图和TCP UDP的案例进行学习并运行结果 python小项目 pyth
  • 高德地图-根据IP定位显示当前所在城市

    1 绘制地图 构造参数中的container为添加的地图容器的id let map new AMap Map container 2 IP定位 高德地图定位文档 自建图层 参考手册 地图 JS API 高德地图API 创建AMap Map对
  • ARCore:ARCore开发的起步

    已经是第7章节了 终于可以开始正式接触到我们梦寐以求的ARCore了 相信大家应该都有一点点小激动了吧 那么下面我们就开始讲解如何进行ARCore的开发 一 Session简介 初看到Session 大家都摸不到头脑 最直接的解释 它是AR