3D モデルを操作する場合、Jetpack XR SDK は glTF 2.0 オープン スタンダードをサポートしています。Android XR が Jetpack XR SDK でビルドされたアプリをレンダリングする場合、3D モデルは glTF 2.0 標準で指定されている物理ベース レンダリング(PBR)手法でレンダリングされます(サポートされている extensions
とともに)。Autodesk Maya、Maxon ZBrush、Blender、Spline などのほとんどのデジタル コンテンツ作成(dcc)ツールでは、3D モデルを glTF 形式(.gltf
ファイルまたは .glb
ファイル)にエクスポートできます。
ユーザーまたはアプリによって SpatialEnvironment
スカイボックスが指定されている場合、3D モデルは環境スカイボックスから提供される照明情報で照明されます。反射するマテリアルとスペキュラ ハイライトも、環境のスカイボックスを反射します。パススルーが有効になっている場合、照明、反射、鏡面反射ハイライトは、単一の指向性ライトのあるシンプルで明るい部屋に基づいています。
サポートされているマテリアルの概要については、Khronos サイトの glTF PBR プロパティをご覧ください。
Jetpack XR SDK でビルドされたアプリで 3D モデルを読み込む主な方法は 2 つあります。
- 次のセクションのActivitySpace に 3D モデルを配置するで説明されているように、
ActivitySpace
に読み込みます。 - インテントを使用して組み込みのシーン ビューアを使用する
3D モデルを ActivitySpace に配置する
glTF ファイルを作成したら、次は Android Studio のアセット ディレクトリに追加します。アセットタイプを整理するために、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 モデルを 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
とシーン ビューアの両方で使用できます。
KHR_animation_pointer
KHR_draco_mesh_compression
KHR_lights_punctual
KHR_materials_clearcoat
KHR_materials_sheen
KHR_materials_unlit
KHR_materials_variants
KHR_mesh_quantization
KHR_texture_basisu
KHR_texture_transform
EXT_texture_webp