アプリに 3D モデルを追加する

対応する XR デバイス
このガイダンスは、次のようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
[
XR Headsets
]
有線 XR グラス

3D モデルを操作する場合、Jetpack XR SDK は glTF 2.0 オープン スタンダードをサポートしています。Android XR が Jetpack XR SDK で構築されたアプリをレンダリングすると、3D モデルは 物理ベース レンダリング(PBR)手法(サポートされている拡張機能を含む)でレンダリングされます。ほとんどのデジタル コンテンツ作成(dcc) ツール(Autodesk MayaMaxon ZBrushBlenderSpline など)は、3D モデルを glTF 形式(.gltf ファイルまたは .glb ファイル)でエクスポートできます。

ユーザーまたはアプリによって SpatialEnvironment スカイボックスが指定されている場合、3D モデルは環境 スカイボックスから提供される照明情報で照らされます。反射素材とスペキュラ ハイライトも環境スカイボックスを反映します。パススルーが有効になっている場合、照明、反射、スペキュラ ハイライトは、単一の指向性ライトを備えた明るい部屋に基づきます。

サポートされている素材の概要については、Khronos サイトの glTF PBR プロパティをご覧ください。これらのプロパティなどを使用して 3D モデルをカスタマイズする方法については、 アプリで 3D モデルをカスタマイズするをご覧ください。

glTF ファイルをアセット フォルダに追加する

glTF ファイルを入手したら、次のステップとして Android Studio のアセット ディレクトリに追加します。アセットタイプを整理するために、models ディレクトリを作成することをおすすめします。

/models ディレクトリにアセットを追加する例

SpatialGltfModel を使用して 3D オブジェクトを追加する

Android XR は、3D モデルの glTF 形式をサポートしています。通常、 .glb ファイルとして保存されます。これらのオブジェクトをレイアウトに追加するには、 SpatialGltfModel コンポーザブルを使用します。この API を使用すると、アセットの読み込みと状態の管理が簡単になります。

モデルを表示するには、まず rememberSpatialGltfModelStateを使用してソースと状態を定義します。モデルは、アプリの assets フォルダ、URI、または raw dataから読み込むことができます。

val modelState = rememberSpatialGltfModelState(
    source = SpatialGltfModelSource.fromPath(
        Paths.get("models/model_name.glb")
    )
)

状態が定義されたら、SpatialGltfModel コンポーザブルを使用して、サブスペース内にレンダリングします。

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

Compose SceneCoreEntity を使用して 3D モデルを配置する

SceneCoreEntity を使用して 3D モデルを配置するには、まず glTF を GltfModel.create() を使用してメモリに読み込む必要があります。次に、3D モデルを SceneCoreEntity に配置して、SceneCore コンポーネントを Compose for XR レイアウトとブリッジします。詳しくは、 SceneCoreEntity を使用してレイアウトに 3D オブジェクトを配置するをご覧ください。

Jetpack Scenecore を使用して 3D モデルを配置する

glTF モデルを読み込むには、GltfModel.create() を呼び出します。

val gltfModel = GltfModel.create(session, Paths.get("models", "saturn_rings.glb"))

この時点で、モデルはメモリに読み込まれますが、まだレンダリングされていません。 読み込む 3D モデルが多い場合や、モデルが大きい場合は、事前に非同期で読み込むことをおすすめします。これにより、モデルがメモリに読み込まれるまでユーザーが待つ必要がなくなります。

glTF を ActivitySpace に追加します。 GltfModelEntity.create を呼び出してエンティティを作成し、 ActivitySpace に配置します。ベスト プラクティスとして、アプリが空間機能を使用できる状態であることを確認する 必要があります

if (session.scene.spatialCapabilities.contains(SpatialCapability.SPATIAL_3D_CONTENT)) {
    val gltfEntity = GltfModelEntity.create(session, gltfModel)
}

アプリを実行すると、読み込まれた 3D モデルが表示されます。

読み込まれた 3D モデルの例

Scene Viewer を使用して 3D モデルを読み込む

基本的なインタラクション 機能を備えた 3D モデルを読み込む最も簡単な方法を探している場合は、モバイルと同じように Scene Viewer を使用することをおすすめします。Android XR とモバイルの Scene Viewer の主な違いは、Scene Viewer が glTF ファイルを指すファイル URI パラメータのみをサポートし、他のパラメータはすべて無視されることです。

Scene Viewer は、インテントを使用して呼び出され、フルスペース モードで実行される別のアプリです。そのため、呼び出すとアプリが表示されなくなり、Scene Viewer にフォーカスが移ります。変更した環境は、ユーザーのシステム設定に リセットされます。

Android XR の Scene Viewer で Intent を使用して glTF ファイルを表示する例を次に示します。

val url =
    "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/Avocado/glTF/Avocado.gltf"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
    Uri.parse("https://arvr.google.com/scene-viewer/1.2")
        .buildUpon()
        .appendQueryParameter("file", url)
        .build()
sceneViewerIntent.setData(intentUri)
try {
    startActivity(sceneViewerIntent)
} catch (e: ActivityNotFoundException) {
    // There is no activity that could handle the intent.
}

Scene Viewer のインタラクティビティ オプションについて詳しくは、 3D モデルのデザイン ドキュメントをご覧ください。

glTF 拡張機能

Jetpack XR SDK は、3D モデルの機能を拡張するいくつかの glTF 拡張機能をサポートしています。これらの機能は、 GltfModelEntity と Scene Viewer の両方で使用できます。