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

3D モデルを操作する場合、Jetpack XR SDK は glTF 2.0 オープン スタンダードをサポートしています。Android XR が Jetpack XR SDK でビルドされたアプリをレンダリングする場合、3D モデルは glTF 2.0 標準で指定されている物理ベース レンダリング(PBR)手法でレンダリングされます(サポートされている extensions とともに)。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 モデルを読み込むには、createGltfResourceAsync を呼び出します。

// load the gltf file
val gltfModel = xrSession.createGltfResourceAsync("models/saturn_rings.glb").await()

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

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

// check for spatial capabilities
if (xrSession.getSpatialCapabilities().hasCapability(SpatialCapabilities.SPATIAL_CAPABILITY_3D_CONTENT)){
  // create the gltf entity using the gltf file from the previous snippet
   val gltfEntity = xrSession.createGltfEntity(gltfModel)
}

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

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

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

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

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

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

アニメーションを再生するには、startAnimation を呼び出してアニメーションの名前を指定します。必要に応じて、アニメーションを無限ループにするかどうかを指定できます。

//start a looping walk animation for a model
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 にフォーカスが移ります。変更した環境は、ユーザーのシステム設定にリセットされます。

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

val THREED_MODEL_URL = "https://raw.githubusercontent.com/KhronosGroup/glTF-Sample-Models/master/2.0/FlightHelmet/glTF/FlightHelmet.gltf"
val MIME_TYPE = "model/gltf-binary"
val sceneViewerIntent = Intent(Intent.ACTION_VIEW)
val intentUri =
  Uri.parse("https://arvr.google.com/scene-viewer/1.2")
     .buildUpon()
     .appendQueryParameter("file", THREED_MODEL_URL)
     .build()
sceneViewerIntent.setDataAndType(intentUri, MIME_TYPE)
startActivity(sceneViewerIntent)

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

glTF 拡張機能

Jetpack XR SDK は、3D モデルの機能を拡張する複数の gfTF 拡張機能をサポートしています。これらの機能は、GltfEntity とシーン ビューアの両方で使用できます。