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

対象となる XR デバイス
このガイダンスは、次のようなタイプの XR デバイス向けのエクスペリエンスを構築する際に役立ちます。
XR ヘッドセット
有線 XR グラス

3D モデルを扱う場合、Jetpack XR SDK は glTF 2.0 オープン標準をサポートしています。Android XR が Jetpack XR SDK でビルドされたアプリをレンダリングする場合、3D モデルは glTF 2.0 標準(およびサポートされている拡張機能)で指定された物理ベース レンダリング(PBR)手法でレンダリングされます。Autodesk Maya、Maxon ZBrush、Blender、Spline などのほとんどのデジタル コンテンツ作成(DCC)ツールは、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 を使用します。SpatialGltfModel は、glTF 形式の 3D モデルを空間レイアウトに追加できるサブスペース コンポーザブルです。この API を使用すると、アセットの読み込みと状態の管理のプロセスを簡素化できます。

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

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

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

SpatialGltfModel(state = modelState, modifier = SubspaceModifier)

コードに関する主なポイント

  • 非同期読み込み: モデルは非同期で読み込まれます。最初のコンポジションでは、固有サイズがゼロになることがあります。モデルの準備が整うと、レイアウトが再測定されます。
  • 状態の制御: SpatialGltfModelState.status を使用して、読み込みステータスをクエリしたり、アニメーションを制御したりします。
  • サイズ設定とスケーリング: デフォルトでは、レイアウト サイズはアセットの境界ボックスと一致します。これを SubspaceModifier.size でオーバーライドして、指定された境界内に収まるようにモデルを均一にスケーリングできます。

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

SceneCoreEntity を使用して 3D モデルを配置するには、まず GltfModel.create() を使用して glTF をメモリに読み込む必要があります。その後、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 モデルを読み込む最も簡単な方法をお探しの場合は、モバイルの場合と同様にシーンビューアを使用することをおすすめします。Android XR の Scene Viewer とモバイルの Scene Viewer の主な違いは、Scene Viewer が glTF ファイルを指すファイル URI パラメータのみをサポートし、他のすべてのパラメータは無視される点です。

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.
}

シーン ビューアのインタラクティブ オプションの詳細については、3D モデル設計のドキュメントをご覧ください。

glTF 拡張機能

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