上一篇 (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 参考资料中的代码和注释。
注:以上基本是官方文档的东西,在启动和检测写的很详细,后面再开始关于各种功能操作等分析。