CrossRoad

XRを中心とした技術ブログ。 Check also "English" category.

ARCore1.6で追加されたSceneformのRecording機能を試してみました

これは Oculus Rift Advent Calendar 2018の11日目の投稿です。昨日は@stupid_student2さんのOculusGoコントローラでオブジェクトを掴んで投げてみる - Qiitaでした。

本日はARCoreのSceneformについてです。

0. はじめに

数日前、ARCoreが1.6にアップデートされました。

今回は、アップデート内容の1つであるSceneformのRecording機能について解説します。

なお、以下の環境で動作確認しています。

  • Mac OSX 10.14.1
  • Android Studio 3.2.1
  • ARCore 1.6
  • Android 9.0 スマートフォン

1. Scenformとは何か?

ARCore 1.2(2018/5)で発表された機能で、Android StudioでCGの制御ができる仕組みです。このようにViewerが表示されます。XCodeのScenekitに近いイメージです。

Android StudioのSceneform使用画面

UnityやUnreal Engineでは最初から同等の機能が搭載されているので、SceneformはAndroid Studio限定の機能です。

何がよいかというと、Android native開発者(Java)でもUnityのようなツール併用なしにARアプリが作れることです。ちょっとサンプルをためしただけですが、Android Studioに慣れていると使いやすいと思いました。

2. Sceneformの環境構築

Android StudioのPluginとして提供されているので、Pluginのインストールが必要です。

まずは、Android Studioを開き、Preferenceを開きます。左側の Pluginを選択した画面がこちらです。

Android StudioのPlugin設定画面

この画面は現在インストールされているPluginの一覧です。追加するには、Browse Repositoriesをクリックします。

Android StudioでGoogle Sceneform Toolsをインストールする画面

ここから、Google Sceneform Tools(beta)を選んでInstallを実行すればインストールされます。インストール後Android Studioを再起動しないとSceneform Toolsが有効にならないのでご注意ください。

3. サンプルプロジェクトのコード修正

まずはサンプルコード一式(sceneform-android-sdk-v1.6.0.zip)を、以下のURLからダウンロードします。

Releases · google-ar/sceneform-android-sdk · GitHub

解凍したら、Android StudioのOpen existing projectでvideorecordingフォルダを選んで開きます。久しぶりにAndroid Studioを使う場合、Gradleの更新などが入ってしばらく時間がかかります。

Gradleのビルドが通ると、あとはスマートフォンをUSBケーブルで接続してRunボタンを押すだけでアプリを試すことができます。今回はARで表示させる3Dモデルを差し替えるところまで試しました。使用した3Dモデルは下記のクリスマスツリーです。

poly.google.com (Christmas tree/Aya Kawa※この3Dモデルは CC-BY ライセンスで公開されています。著作権に関する情報を表示することで自由にコンテンツを使用できます

3.1 objファイルの変換

まずはobj形式でダウンロードし、Android Studioのsampledata/modelsにドラッグします。クリスマスツリーはmodel.objとmaterial.mtlでした。

Android Studioでobjデータをインポートした例

ここで、model.objを右クリックしてImport Sceneform Assetを選択します。

Android StudioのImport Sceneform Asset実行画面

Import Sceneform Assetが表示されない場合、Android Studioを再起動すると解決します。このまま実行していくと、sfaファイルとsfbファイルが生成されます。

3.2 sfbファイルの呼び出しを追加

公式HPの記述に沿って、以下のコードをonCreateの中に追記しました。

//videoRecordingActivity.java
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    if (!checkIsSupportedDeviceOrFinish(this)) {
      return;
    }
    setContentView(R.layout.activity_ux);
    arFragment = (WritingArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment);

    modelLoader = new ModelLoader(this);
    //modelLoader.loadModel(this, R.raw.andy);
    ModelRenderable.builder()
            .setSource(this, Uri.parse("model.sfb"))
            .build()
            .thenAccept(renderable -> andyRenderable = renderable)
            .exceptionally(
                    throwable -> {
                      Log.e(TAG, "Unable to load Renderable.", throwable);
                      return null;
                    });
//以降は省略

このままだとUriがない、というエラーがでるので、冒頭で import android.net.Uri;を追加します。

これで完了です。あとは、アプリを実機にデプロイすると動作を確認できます。

4. 動作確認

画面はシンプルで、右側にRecordingボタンがあるだけです。Recordingボタンを押すと、ARの様子を記録できます。Recordingを停止すると、mp4形式で動画ファイルが保存されます。保存場所はPicturesの中でした。

ARCore1.6のRecordingサンプルアプリ実行画面

以下はRecordingした動画です。

ARCoreによって平面を認識し、タッチした箇所に先ほど指定したクリスマスツリーが表示されます。また、1本指タッチでオブジェクトを移動、2本指タッチでオブジェクトの拡大ができます。

5. 終わりに

思ったよりも簡単にできました。これならばAndroid Studioに慣れていれば使いやすいと思います。

明日は@songofsaya_さんの「まわりがGOだらけなのでMirage SOLOでHDRPをデプロイするのを試す記事とか書きます」です。