ARCore - 开发之旅

上一篇 (ARCore - AR初探)[https://www.jianshu.com/p/bc6c27ef5260]
开始之前,首先简单了解一下 描点,同时先搬运下官方文档

使用锚点可以让虚拟物体在 AR 场景中看起来待在原地不动。


为什么使用锚点?

由于 ARCore 的环境理解会在 AR 体验中更新,虚拟物体可能看起来远离放置位置。 这会影响您的应用的真实感和用户体验。

锚点可以确保物体在空间中看起来保持相同的位置和方向,从而帮助您维持现实世界中放置的虚拟物体的幻觉。

锚点的工作原理

如果您对锚点的使用不熟悉,查看现实世界空间和姿态会很有用。

现实世界空间

放置摄像头和物体的坐标空间
摄像头和物体在现实世界空间中的位置会在帧与帧之间更新
姿态
表示物体在现实世界空间中的位置和方向
创建锚点时,请使用能够描述锚点相对于当前帧现实世界估算的位置和方向的姿态。

您可以将一个或多个物体连接到此锚点。 锚点和连接到它上面的物体看起来会待在它们在现实世界中的放置位置。 随着锚点姿态在每个帧中进行调整以适应现实世界空间更新,锚点将相应地更新物体的姿态。

您可以向同一个锚点连接多个物体,确保这些物体能够保持它们的相对位置和方向,即使在锚点姿态调整的情况下也能如此。

在您的场景中使用锚点
要在您的场景中使用锚点,您的代码应当满足以下条件:

在可跟踪对象(例如平面)或 ARCore 会话的上下文中创建锚点。
将一个或多个物体连接到锚点。
锚点可以在场景的物体中支持不同的位置行为。

确定锚点上下文以及需要为场景物体使用多少锚点取决于您的 AR 场景所需的位置行为。
......

以上是官方文档的大致内容。

Android Studio 项目中启用 ARCore 功能。 为此,您需要做的是:

  • [向 manifest 添加 AR 必备或 AR 可选条目
  • 向您的项目添加构建依赖项
  • 执行运行时检查以确保 ARCore 受支持并且已安装

向 manifest 添加 AR 必备或 AR 可选条目

AR 应用有两种类型:AR 必备AR 可选

AR 可选

AR 可选是指您的应用包括的一项或多项 AR 功能会在用户的设备支持 ARCore 时启用。 但应用也可在不支持 ARCore 的设备上安装和运行。

当用户安装 AR 可选应用时,应用商店不会自动安装 ARCore

要将您的应用声明为 AR 可选,请修改您的应用 manifest,在其中加入下列条目:

<uses-sdk android:minSdkVersion="{14 or higher}" />
  ...

  <application>
    ...
        <meta-data android:name="com.google.ar.core" android:value="optional" />
    ...

AR 必备

AR 必备是指您的应用没有 AR 便无法使用。 应用商店只为支持 ARCore 的设备提供您的应用。 如需了解详细信息,请参阅在应用商店中发布 AR 应用

当用户安装 AR 必备应用时,应用商店会自动安装 ARCore。 但您的应用仍须执行额外的运行时检查,以防出现用户已卸载 ARCore 的情况。

要将您的应用声明为 AR 必备,请修改您的应用 manifest,在其中加入下列条目:

<uses-sdk android:minSdkVersion="{24 or higher}" />

  ...
  <uses-feature android:name="android.hardware.camera.ar" android:required="true" />

  <application>
    ...
        <meta-data android:name="com.google.ar.core" android:value="required" />

添加构建依赖项
执行以下步骤:

确保您的项目的 build.gradle 文件包括 Google 的 Maven 代码库:

allprojects {
repositories {
    google()
        ...

在您的应用的 build.gradle 文件中添加 ARCore 库作为依赖项。

dependencies {
    // ARCore library
    implementation 'com.google.ar:core:1.5.0' //这个可以看github的版本 https://github.com/google-ar/arcore-android-sdk
}
  • 注:Gradle 会自动将 ARCore 库中的附加标签合并到您应用的 manifest 内。 请勿删除这些标签。

  • (可选步骤)将 Sceneform 库添加到您应用的 build.gradle 文件:

// Sceneform libraries use language constructs from Java 8.
// Add these compile options if targeting a min API level less than 26.
android {
    compileOptions {
        sourceCompatibility 1.8
        targetCompatibility 1.8
    }
}

dependencies {
    implementation "com.google.ar.sceneform:core:1.0.0"
    implementation "com.google.ar.sceneform.ux:sceneform-ux:1.0.0"
}

执行运行时检查
检查是否支持 ARCore(仅限 AR 可选应用)
AR 可选应用可以利用 ArCoreApk.checkAvailability() 来确定当前设备是否支持 ARCore。 在不支持 ARCore 的设备上,应用应停用 AR 相关功能并隐藏关联的界面元素。

void maybeEnableArButton() {
  // Likely called from Activity.onCreate() of an activity with AR buttons.
  ArCoreApk.Availability availability = ArCoreApk.getInstance().checkAvailability(this);
  if (availability.isTransient()) {
    // re-query at 5Hz while we check compatibility.
    new Handler().postDelayed(new Runnable() {
      @Override
      public void run() {
        maybeEnableArButton();
      }
    }, 200);
  }
  if (availability.isSupported()) {
    mArButton.setVisibility(View.VISIBLE);
    mArButton.setEnabled(true);
    // indicator on the button.
  } else { // unsupported or unknown
    mArButton.setVisibility(View.INVISIBLE);
    mArButton.setEnabled(false);
  }
}

以下流程图说明了前面代码示例中的逻辑:


然后,当用户想使用 AR 功能时,您的应用应确保 ARCore 已安装。 可通过启动遵循上述 AR 必备模式的 Activity 来轻松实现这一目的。

注:checkAvailability() 可能需要查询网络资源来确定设备是否兼容。 在此期间,它将返回 UNKNOWN_CHECKING。 为缩短感知延迟时间和减少迸现,应用可在其生命周期早期调用一次 checkAvailability() 以启动查询,并忽略返回值。 这样一来,在可能显示进入 AR 的界面元素时,便可立即提供缓存的结果。

检查 ARCore 是否已安装

AR 必备和 AR 可选应用必须先调用 ArCoreApk.requestInstall(),然后再创建 ARCore 会话。 requestInstall()检查是否安装了兼容版本的 ARCore(该版本可能已过时或已由用户手动移除)并在不存在兼容版本的 ARCore 时提示用户安装。

注:如果您使用 Sceneform,ArFragment 会自动为您执行这些检查并创建会话

// Set to true ensures requestInstall() triggers installation if necessary.
private boolean mUserRequestedInstall = true;

// in onResume:
try {
  if (mSession == null) {
    switch (ArCoreApk.getInstance().requestInstall(this, mUserRequestedInstall)) {
      case INSTALLED:
        mSession = new Session(this);
        // Success.
        break;
      case INSTALL_REQUESTED:
        // Ensures next invocation of requestInstall() will either return
        // INSTALLED or throw an exception.
        mUserRequestedInstall = false;
        return;
    }
  }
} catch (UnavailableUserDeclinedInstallationException e) {
  // Display an appropriate message to the user and return gracefully.
  return;
} catch (...) {  // current catch statements
  ...
  return;  // mSession is still null
}

以下流程图说明了前面代码示例中的逻辑:



如果 requestInstall() 返回 INSTALL_REQUESTED,则当前 Activity 暂停,并提示用户安装或更新 ARCore。 当用户返回 Activity 时,Activity 的 onResume() 会再次执行。

后续步骤

阅读示例应用以及 Java API 参考资料中的代码和注释。

注:以上基本是官方文档的东西,在启动和检测写的很详细,后面再开始关于各种功能操作等分析。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,921评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,635评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,393评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,836评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,833评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,685评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,043评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,694评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,671评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,670评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,779评论 1 332
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,424评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,027评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,984评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,214评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,108评论 2 351
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,517评论 2 343

推荐阅读更多精彩内容

  • ARCore 是 Google 的增强现实体验构建平台。 ARCore 利用不同的 API 让您的手机能够感知其环...
    NullBugs阅读 4,926评论 0 50
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,464评论 25 707
  • 听说你也想有个能称之为哥哥的亲人,嗯......我就有啊,然而好像并没有什么用.哥哥,这个词引发了我的无限遐想,黄...
    碎碎片片阅读 348评论 0 0
  • 五险: 1)养老保险 2)医疗保险 3)生育保险 4)失业保险 5)工伤保险 一金:住房公积金 其中工伤保险和生育...
    一诺0001阅读 451评论 0 0