3D アセットをインポートしてプレビューする

3D モデルをインポートしてシーン形式に変換し、Android Studio でプレビューする方法について学習します。

新しい 3D アセットをインポートする

シーンは、次の形式の 3D アセットをサポートします。

  • OBJ
  • glTF(アニメーションはサポートされていません)
  • FBX(アニメーションあり / なし)。

新しい 3D アセットをインポートする手順は次のとおりです。

  1. プロジェクトの app フォルダに sampledata フォルダがあることを確認します。

    フォルダを作成するには、[Project] ウィンドウで app フォルダを右クリックし、[New > Sample Data Directory] を選択します。

    sampledata フォルダは Android Studio プロジェクトの一部ですが、そのコンテンツは APK には含まれません。

  2. 3D モデルのソースアセット ファイル(*.obj*.fbx、または *.gltf)とそのすべての依存関係(*.mtl*.bin*.png*.jpg など)を sampledata フォルダにコピーします。

    これらのソースファイルをプロジェクトの assets フォルダや res フォルダにコピーしないでください。コピーすると、それらが不必要に APK に含まれることになります。

  3. 3D モデルのソースアセットを右クリックし、[Import Sceneform Asset] を選択してインポート プロセスを開始します。

    これらの値は、app's build.gradlesceneform.asset() エントリで使用され、プロジェクトの *.sfa ファイルと *.sfb ファイルの生成場所を決定します。

    モデルを初めてインポートする場合は、デフォルト値を使用します。

    フィールド 説明
    ソースアセットのパス インポートする OBJ、FBX、glTF 3D モデルアセットのファイル名。
    マテリアル パス default は、組み込みのデフォルトのマテリアルか、カスタム マテリアル*.mat ファイルのパスを使用するようにシーンに指示します。
    .sfa 出力パス デフォルトを使用するか、sampledata フォルダの下に別のパスを指定します。

    .sfa ファイルが見つからなければ、このファイルが生成されます。インポート プロセスの一部の側面は、変更して制御できます。

    これにより、*.sfa が APK に不必要に含まれることがなくなります。

    .sfb 出力パス デフォルトでは src/main/assets/ フォルダが使用されるため、任意のアセット ファイル名を使用できます。

    ファイル名(ファイル拡張子なし)が有効なリソース識別子(R.raw.filename など)の場合、代わりに src/main/res/raw/ フォルダを使用できます。

    アプリで assets/ フォルダと res/ フォルダを使用する方法について詳しくは、Android のアプリリソースの概要をご覧ください。

    アニメーション ファイル

    *.fbx アニメーション ファイルをインポートする場合は、プラス記号(+)をクリックして、残りのファイルを個別に追加します。

  4. [完了] をクリックしてインポート プロセスを開始します。

アセットをインポートするために、プラグインは次のことを行います。

  1. プロジェクト build.gradle にシーン Gradle プラグインを追加します(すでに存在しない場合)。

    dependencies {
        …
        classpath 'com.google.ar.sceneform:plugin:1.15.0'
    }
    
  2. appbuild.gradle ファイルを更新して、apply plugin 行と、新しくインポートされたアセットの sceneform.asset() エントリを含めます。

    apply plugin: 'com.google.ar.sceneform.plugin'
    
    sceneform.asset('sampledata/models/andy.obj', // 'Source Asset Path' specified during import.
            'default',                            // 'Material Path' specified during import.
            'sampledata/models/andy.sfa',         // '.sfa Output Path' specified during import.
            'src/main/res/raw/andy')              // '.sfb Output Path' specified during import.
    

    アプリbuild.gradle に新たに追加されたこれらのエントリは、次の 2 つの Gradle タスクを作成します。

    • createAsset-<asset-name> がまだシーンアセット定義(*.sfa)ファイルが存在しない場合は、ファイルを作成します。

      このタスクでは既存の *.sfa ファイルが上書きされません。インポート後に SFA ファイルを変更しても、上書きされることはありません。

      *.sfa ファイルは、人が読める形式でアセットのインポート設定を記述したテキスト ファイルです。ソースアセットのモデルとテクスチャを参照し、シーンベースの物理的マテリアルにマテリアル パラメータを指定することでマテリアルを定義します。

    • compileAsset-<asset-name> は、*.sfa ファイルをシーンバイナリ アセット(*.sfb)ファイルにコンパイルします。

      この *.sfb ファイルはアプリの APK に組み込まれ、実行時に読み込まれてレンダリング可能を作成します。

    詳細については、Sceneform Gradle プラグイン リファレンスをご覧ください。

  3. テキスト ウィンドウで *.sfa を、ビューア ウィンドウで *.sfb を開きます。

以前にインポートした 3D アセットを更新する

以前にインポートした OBJ、FBX、glTF モデルのソースアセット ファイル(*.obj*.fbx または *.gltf)を更新する場合、app の対応する sceneform.asset() エントリによって、プラグインが現在の *.sfa パラメータに基づいて更新された *.sfb ファイルを自動的に生成します。

インポート済みのアセットのパラメータを反復処理するには:

  • SFA ファイル形式のリファレンスをガイドとして使用して、*.sfa テキスト ファイルを変更します。
  • 変更を保存します。これにより、アセットが再コンパイルされ、*.sfb ファイルが更新されます。
  • *.sfb ファイルをダブルクリックしてアセットの [閲覧者] ウィンドウを開き、更新されたアセットをプレビューします。

以前にインポートしたアセットにアニメーション データを含む更新する場合は、インポート ダイアログの [アニメーション ファイル] セクションでプラス記号(+)を使用し、更新された各 *.fbx ファイルを個別にインポートします。

Gradle アセットの定義

インポート プロセスでは、build.gradle ファイルの最後に *.fbx アニメーション ファイルが追加されます。

sceneform.asset('sampledata/models/andy_dance.fbx',
'default',
'sampledata/models/andy_dance.sfa',
'src/main/res/raw/andy_dance',
['sampledata/models/andy_wave_r.fbx',
'sampledata/models/andy_wave_l.fbx'])

レンダリング可能アセットを作成する

アセットを *.sfb 形式にコンパイルしたら、次のように ModelRenderable をビルドしてシーン内のノードにアタッチできます。

ModelRenderable.builder()
    // To load as an asset from the 'assets' folder ('src/main/assets/andy.sfb'):
    .setSource(this, Uri.parse("andy.sfb"))

    // Instead, load as a resource from the 'res/raw' folder ('src/main/res/raw/andy.sfb'):
    //.setSource(this, R.raw.andy)

    .build()
    .thenAccept(renderable -> andyRenderable = renderable)
    .exceptionally(
        throwable -> {
          Log.e(TAG, "Unable to load Renderable.", throwable);
          return null;
    });

カスタム マテリアルの使用

シーンのデフォルトのマテリアルを使用すると、デベロッパーは簡単に優れた結果を得ることができます。カスタム マテリアルを使用して、アセットの外観を細かくカスタマイズすることもできます。

アセットにカスタム マテリアルを割り当てるには:

  1. [カスタム マテリアル リファレンス](/sceneform/develop/custom-material)をガイドとして使用し、カスタム マテリアル定義(*.mat)ファイルを作成します。

  2. カスタム マテリアルをアセットに適用します。

    新しいアセットをインポートする場合:

    以前にインポートしたアセットを更新するには:

    • *.sfa コンテンツがカスタマイズされていない場合は、既存の *.sfa ファイルと *.sfb ファイル、およびアプリ build.gradlesceneform.asset() エントリを削除してから、アセットを再インポートします。これにより、再生成された *.sfa 属性とマテリアル パラメータは、カスタム マテリアルでサポートされるものと一致するようになります。

    • *.sfa のカスタマイズを保持するには、*.sfa ファイルを開き、source 属性をカスタム マテリアル *.mat ファイルのパスに変更してから、カスタム マテリアルに合わせて *.sfa 属性とマテリアル パラメータを手動で調整します。