シーンフォームを使ってみる

このページでは、Hello Sceneform サンプルアプリのコードを調べて、主なコンセプトについて説明します。注:

  • このサンプルでは、シーンシーンと ARCore を使用します。

    ARCore なしでシーンフォームを使用するには、ARCore の依存関係と CAMERA 権限の要件を無視して、以下の手順を行います。シーンを作成するの説明に沿って、アプリのレイアウトで SceneView を使用します。

  • このサンプルアプリは、AR 必須アプリとして記述されています。

    AR オプション アプリと AR 必須アプリの詳細については、ARCore の有効化をご覧ください。

プロジェクトでシーンを使用するには、次のことを行う必要があります。

  1. Seneform プラグインをインポートする
  2. プロジェクトの build.gradle ファイルを構成する
  3. AndroidManifest.xml を更新する
  4. ランタイム チェックを実行してシーンビューを作成する
  5. レンダリング可能コンテンツを作成する
  6. シーンを構築する

プロジェクトに Sceneform プラグインをインポートする

Sceneform プラグインをインストールすると、Android Studio の AR アプリ用の Sceneform SDK で 3D アセットをインポート、表示、ビルドできます。Android Studio バージョン 3.1 以降が必要です。

プラグインをインストールするには:

  1. Android Studio で [Plugins] の設定を開きます。

    • Windows: [ファイル] > [設定] > [プラグイン] > [リポジトリを参照]

    • macOS: Android Studio > 設定 > プラグイン

  2. [リポジトリを参照] をクリックし、Google シーンツール(ベータ版)をインストールします。

プロジェクトの build.gradle ファイルを設定する

  1. プロジェクト build.gradle に Google の Maven リポジトリが含まれていることを確認します。

    allprojects {
        repositories {
            google()
            …
    
  2. アプリbuild.gradle を更新して、最新の ARCore と Seceform UX の依存関係を追加し、プロジェクト設定が両方のライブラリと互換性があることを確認します。

    android {
        …
        defaultConfig {
            // Sceneform requires minSdkVersion >= 24.
            minSdkVersion 24
            …
        }
        // Sceneform libraries use language constructs from Java 8.
        // Add these compile options if targeting minSdkVersion < 26.
        compileOptions {
            sourceCompatibility JavaVersion.VERSION_1_8
            targetCompatibility JavaVersion.VERSION_1_8
        }
    }
    
    dependencies {
        …
        // Provides ARCore Session and related resources.
        implementation 'com.google.ar:core:1.15.0'
    
        // Provides ArFragment, and other UX resources.
        implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.15.0'
    
        // Alternatively, use ArSceneView without the UX dependency.
        implementation 'com.google.ar.sceneform:core:1.15.0'
    }
    

AndroidManifest.xml の更新

AndroidManifest.xml を変更して、アプリが ARCore と CAMERA アクセスを使用する(AR オプション)か、必要とする(AR 必須)ことを示します。

<!-- Both "AR Optional" and "AR Required" apps require CAMERA permission. -->
<uses-permission android:name="android.permission.CAMERA" />

<!-- Sceneform requires OpenGL ES 3.0 or later. -->
<uses-feature android:glEsVersion="0x00030000" android:required="true" />

<!-- Indicates that app requires ARCore ("AR Required"). Ensures the app is
     visible only in the Google Play Store on devices that support ARCore.
     For "AR Optional" apps remove this line. -->
<uses-feature android:name="android.hardware.camera.ar" />

<application>
    …
    <!-- Indicates that app requires ARCore ("AR Required"). Causes the Google
         Play Store to download and install Google Play Services for AR along
         with the app. For an "AR Optional" app, specify "optional" instead of
         "required".
    -->
    <meta-data android:name="com.google.ar.core" android:value="required" />
</application>

ランタイム チェックを行い、シーンビューを作成する

シーンフォームを利用してシーンビューを作成する最も簡単な方法は、必要な ARCore ランタイム チェックを行った後に ARCore セッション管理を自動的に処理する ArFragment を使用することです。

  1. 互換性のあるバージョンの AR 用 Google Play 開発者サービスがインストールされているかどうかをチェックし、必要に応じてインストールまたは更新をユーザーに促します。

  2. アプリがカメラにアクセスできるかどうかを確認し、カメラへの権限の付与をユーザーに求めます。

アプリが追加の権限をリクエストする必要がある場合、または AR セッションの作成方法とタイミングをカスタマイズする場合は、代わりに以下を行えます。

  • ArFragment のサブクラスを作成して、追加の権限をリクエストします。

  • ArSceneView を直接使用または拡張します。ソーラーシステムのサンプルに示すように、アプリで ARCore バージョン チェックを実行し、setupSession() を呼び出して ARCore セッションを手動で作成する必要があります。

チェックに合格すると、ArFragment は以下を作成します。

  1. ArSceneViewgetArSceneView() を介してアクセス可能):

    • セッションから取得したカメラ画像をサーフェスにレンダリング

    • 組み込みのシーン UX アニメーションをレンダリングし、スマートフォンを動かすと AR 体験を有効にする方法をユーザーに示します。

    • デフォルトの PlaneRenderer を使用して検出されたハイライトPlanes

  2. ARCore SessiongetSession() を介してアクセス可能)

アプリで ArFragment を使用するには、Hello シーンのサンプルの activity_ux.xml で示されているように、アクティビティのレイアウトに追加します。

<fragment android:name="com.google.ar.sceneform.ux.ArFragment"
    android:id="@+id/ux_fragment"
    android:layout_width="match_parent"
    android:layout_height="match_parent" />

レンダリング可能を作成する

Renderable は、シーン内の任意の場所に配置でき、メッシュ、マテリアル、テクスチャで構成される 3D モデルです。

レンダラは次の場所から作成できます。

サンプルアプリでは、3D andy.obj アセット ファイルからレンダリング可能を作成します。このアセットがインポートされると、Sceneform プラグインアプリbuild.gradle を更新してプラグインを適用し、インポートしたモデルの 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.

res/raw/andy リソースは、ModelRenderable の作成に使用されます。

private ModelRenderable andyRenderable;

@Override
protected void onCreate(Bundle savedInstanceState) {
    …

    ModelRenderable.builder()
        .setSource(this, R.raw.andy)
        .build()
        .thenAccept(renderable -> andyRenderable = renderable)
        .exceptionally(
            throwable -> {
            Log.e(TAG, "Unable to load Renderable.", throwable);
            return null;
        });
}

シーンを作成する

ARSceneView には Scene が接続されています。シーンはツリー形式のデータ構造で、レンダリングされる仮想オブジェクトである Node を保持します。

ここでは、アンディをレンダリングできる要素がルートシーンノードに直接アタッチされています。

Node node = new Node();
node.setParent(arFragment.getArSceneView().getScene());
node.setRenderable(andyRenderable);

各ノードには、シーンフォームがレンダリングするために必要なすべての情報(位置、向き、レンダリング可能なオブジェクトなど)と、ノードの操作(衝突シェイプ、イベント リスナーなど)が含まれています。

ノードは他のノードに追加でき、親子関係が形成されます。ノードが別のノードの子である場合は、ノードがその親と一緒に移動、回転、スケーリングします。たとえば、体が動いたときの腕の動きなどです。ノードには複数の子を設定できますが、親は 1 つだけであるため、ツリー状の構造を形成することになります。この構造はシーングラフと呼ばれます。

フレームごとに、カメラの視点からのシーングラフ(ARCore モーション トラッキングに基づいてガイド)がレンダリングされます。アプリは、タップや操作のイベントをリッスンし、ノードに対してヒットテストを実行して、アンカーを配置することで、シーンを操作できます。詳細については、シーンを作成して操作するをご覧ください。