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

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

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

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

サポートされているマテリアルの概要については、Khronos サイトの glTF PBR プロパティをご覧ください。

Jetpack XR SDK で構築されたアプリで 3D モデルを読み込む主な方法は 2 つあります。

3D モデルを ActivitySpace に配置する

glTF ファイルが用意できたら、次は Android Studio のアセット ディレクトリに追加します。アセットタイプを整理するために、models ディレクトリを作成することをおすすめします。

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

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 モデルの例

Compose SceneCoreEntity に 3D モデルを配置する

GltfModel.create() を使用して glTF をメモリに読み込む必要はありますが、Jetpack Compose for XR で UI を作成している場合は、3D モデルを SceneCoreEntity に配置できます。SceneCoreEntity を使用してレイアウトに 3D オブジェクトを配置するをご覧ください。

3D モデルをアニメーション化する

glTF 仕様の一部として、3D モデルにアニメーションを埋め込むことができます。Jetpack XR SDK では、スケルトン(リグ付き)、リジッド、モーフ ターゲット(ブレンド シェイプ)のアニメーションがすべてサポートされています。KHR_animation_pointer glTF 拡張機能で作成されたマテリアル アニメーションもサポートされています。

アニメーションを再生するには、startAnimation() を呼び出し、アニメーションの名前を指定します。アニメーションを無限にループさせるかどうかをオプションで指定できます。

gltfEntity.startAnimation(loop = true, animationName = "Walk")

startAnimation を 2 回目に呼び出すと、現在のアニメーションが停止し、新しいアニメーションが開始されます。

getAnimationState() を使用して、アニメーションの現在の状態をクエリできます。

startAnimation() の呼び出し時に指定されたアニメーション名が存在しない場合、呼び出しはサイレントに失敗し、実行中のアニメーションはすべて停止し、getAnimationState()STOPPED を返します。

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 モデルの機能を拡張するいくつかの gfTF 拡張機能をサポートしています。これらの機能は、GltfModelEntity と Scene Viewer の両方で使用できます。