如何使用 ARCore 及无障碍性功能开发 AR 应用

前言

AR(增强现实)应用是近年来越来越流行的技术,它为我们提供了一种全新的交互方式。ARCore 是 Google 开发的用于 Android 平台的增强现实框架,它用于建立基于移动设备的 AR 应用程序。本文将介绍如何使用 ARCore 及无障碍性功能开发 AR 应用,并提供一些示例代码帮助您更好地理解。

开始

首先,我们需要确定我们的 Android 设备支持 ARCore。您可以去官网查看是否支持。如果支持的话,需要在 Gradle 依赖中添加以下代码:

dependencies {
implementation 'com.google.ar:core:1.23.0'
}

接下来我们需要创建一个 ARCore session:

class MainActivity : AppCompatActivity(),ArFragment.OnTapArPlaneListener {
private lateinit var arFragment:ArFragment
private lateinit var arSession:Session

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)
    arFragment = supportFragmentManager.findFragmentById(R.id.ar_fragment) as ArFragment
    arFragment.setOnTapArPlaneListener(this)
}

override fun onTapPlane(hitResult: HitResult?, plane: Plane?, motionEvent: MotionEvent?) {
    //创建Anchor节点
}

override fun onResume() {
    super.onResume()
    if(!ArCoreApk.getInstance().checkAvailability(this)){
        Toast.makeText(this,"当前设备不支持ARCore",Toast.LENGTH_SHORT).show()
        finish()
    }
    try {
        arSession.resume()
    }catch (e:Throwable){
        Log.e("ARSession","Session resume error",e)
    }
}

override fun onPause() {
    super.onPause()
    arSession.pause()
}

}

在 onTapPlane 回调中创建 Anchor 节点,Anchor 有一个特定的位置和方向,并保留在场景中,作为用户以后在场景中移动时可以跟随的锚点。这是 AR 应用程序中的基本概念之一。

添加模型和纹理

下一步,我们需要添加模型和纹理。我们可以使用 Google Poly 或者其他3D模型库。在这里我们以使用 Google 提供的 Poly 模型库为例。

private fun loadModel(modelID: String, modelPos: FloatArray, modelRotation: FloatArray, textureID: String) {
val sceneView = arFragment.arSceneView
ModelRenderable.builder()
    .setSource(sceneView.context, Uri.parse(modelID))
    .build()
    .thenAccept { renderableObject ->
        renderableObject.isShadowReceiver = true
        renderableObject.isShadowCaster = true
        val node = Node()
        node.renderable = renderableObject
        node.worldPosition = Vector3(*modelPos)
        node.worldRotation = Quaternion.axisAngle(Vector3(1f, 0f, 0f), modelRotation[0])
            .multiply(Quaternion.axisAngle(Vector3(0f, 1f, 0f), modelRotation[1]))
            .multiply(Quaternion.axisAngle(Vector3(0f, 0f, 1f), modelRotation[2]))
        val texture = Texture.builder().setSource(
            sceneView.context,
            Uri.parse(textureID)
        ).build()
        renderableObject.material.setTexture(0, texture)

        sceneView.scene.addChild(node)
    }
    .exceptionally { throwable ->
        Toast.makeText(this, "Unable to load 3D model", Toast.LENGTH_SHORT).show()
        null
    }
}

在 loadModel 中我们加载了模型和纹理,并在场景中添加了一个 Node。

添加无障碍性功能

现在我们来添加一些无障碍性功能。虽然 AR 应用程序已经让用户能够与虚拟世界中的对象进行交互,但并不是所有用户都能够完全体验这一功能。由于 AR 应用程序通常涉及到用户与虚拟世界的交互,因此特别需要注意无障碍性。

首先,我们可以在屏幕上显示一些文本来帮助用户明确他们在 AR 应用程序中所看到的内容。我们可以在 build.gradle 中引入以下依赖来实现:

dependencies {
    implementation 'androidx.core:core-ktx:1.3.1'
    implementation 'com.google.android.material:material:1.3.0-alpha04'
}

然后我们添加一个 TextView 并设置其属性:

val floatingPanel = TextInfoView(this)
sceneView.overlay.add(floatingPanel)
val params = FrameLayout.LayoutParams(
    FrameLayout.LayoutParams.WRAP_CONTENT,
    FrameLayout.LayoutParams.WRAP_CONTENT,
    Gravity.TOP or Gravity.CENTER_HORIZONTAL
)
params.marginTop = resources.getDimensionPixelSize(R.dimen.spacing_normal)
params.gravity = Gravity.CENTER_HORIZONTAL

floatingPanel.indicateText(getString(R.string.look_for_surface))

floatingPanel.layoutParams = params

TextInfoView 是我们自己实现的一个 View,它可以接收 show 和 hide 操作。

我们还可以添加一些配音来帮助听觉障碍的用户。使用 MediaPlayer 播放声音:

private var mediaPlayer: MediaPlayer = MediaPlayer()
private fun initMediaPlayer() {
mediaPlayer = MediaPlayer.create(this, R.raw.notice_place_surface)
mediaPlayer.start()
mediaPlayer.setOnCompletionListener {
    mediaPlayer.release()
}
}

总结

到此,我们已经完成了如何使用 ARCore 及无障碍性功能开发 AR 应用的介绍。我们先创建了一个 ARCore session,然后在其中添加模型和纹理,并介绍了如何添加无障碍性功能。希望这篇文章对您的 AR 开发学习有所帮助。

示例代码

完整的代码示例请查看GitHub

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65ab56e5add4f0e0ff4f90c6


纠错反馈