Upgrade to Pro — share decks privately, control downloads, hide ads and more …

ARCoreとSceneformでARアプリを作ろう

 ARCoreとSceneformでARアプリを作ろう

Hiroki.Abe

May 11, 2019
Tweet

More Decks by Hiroki.Abe

Other Decks in Programming

Transcript

  1. 自己紹介  阿部 弘樹  山形県出身、長野を経て山梨2年目  組込みソフトエンジニア(過去) -> 生産技術エンジニア

     過去に作ったAndroidアプリ https://play.google.com/store/apps/developer?id=studio_machikita 2
  2. ARCoreの機能 その他  User interaction  タッチやドラッグなどの操作で3Dシーンのオブジェクトを操作できる。  Augmented Images

     あらかじめ2D画像をマーカーとして登録しておき、ARアプリを通じてカメラがマーカーを発 見したら、3Dオブジェクトを表示する機能  ARCore 1.9 (2019/05)にて機能強化され、動く画像 (例えばバスから見えるポスター)にも対応  Cloud Anchor  Cloud(GCP)を介してAnchor(空間における特定の位置を示すもの)を共有できる。  詳細は https://developers.google.com/ar/discover/concepts 8
  3. ARCore対応端末  対応端末一覧 https://developers.google.com/ar/discover/supported-devices  まだまだ対応端末は少ない。ハイスペック端末が中心。  安価に入手できる端末 (私調べ) メーカー

    端末 市場価格(万円) [新品 (19’5時点)] 備考 Huawei P20 Lite 1.8 公式ページに載っていないが対応している Google Nexus5X 2.0 Android 8.1 を最後に OS サポートは終了している Pixel3a 4.86 まだリストにないが多分対応。少し高いが開発用には最適。 Motorola Moto G6 2.7 Dual SIM Dual Standby (DSDS) 9
  4. ARアプリをつくろう  作成するアプリ 選択、拡大縮小、移動可能な3Dモデルを配置するアプリ (サンプルアプリHelloSceneformと同様のアプリを1から自作する感じ)  手順 1. ARCore開発環境のセットアップ &

    動作確認 2. 3Dモデルを用意する 3. Androidプロジェクトの作成 4. Android Studio Sceneform プラグインを使い3Dモデルを専用形式に変換 してインポートする 5. 3Dモデルを配置するコードを書く 12
  5. 1. ARCore開発環境をセットアップする 環境セットアップとサンプルアプリの実行 1. Android Studioのダウンロード & インストール https://developer.android.com/studio/install?hl=ja 2.

    ARCoreのドキュメントを参考に https://developers.google.com/ar/develop/java/quickstart ↓をダウンロードして解凍 https://github.com/google-ar/sceneform-android-sdk/releases sceneform-android-sdk-1.x.0.zip 3. Android Studioでサンプルプロジェクト(hellosceneform)をインポートする メニュー -> Import project 4.Build -> Make Projectでサンプルプロジェクトをビルドする 13
  6. 1. ARCore開発環境をセットアップする 環境セットアップとサンプルアプリの実行 ▪実機で実行する場合 5. Tool-> SDKマネージャーで実機のAndroid verと一致するSDKがインストールされてい るか確認する。インストールされていなければインストールする 6.

    ARCore対応の実機を用意する 7. 実機のデバッグ機能を有効化する https://ameblo.jp/tomi-omiya/entry-12342918446.html 8. 実機をPCにUSB接続する ARCore 1.9はまだ配信されていないので(2019.05時点)apkを直接 インストールしておく必要がある。 https://github.com/google-ar/arcore-android-sdk/releases 9. Run -> Run で実行する 10. →のように起動できれば成功 14
  7. 1. ARCore開発環境をセットアップする 環境セットアップとサンプルアプリの実行 ▪エミュレータで実行する 5. Tools -> ADV Manager Create

    Virtual Deviceで仮想デバイスを作成する 6. Phone Pixel or Pixel2を選択する 7. System image -> Pie (Google Playイメージ) をダウンロード 8.ダウンロードが完了したら -> Next -> Finish , 再生ボタンを押して起動する 下記のエラーがでて起動できないとき、以下の手順を試す。 Emulator: emulator: ERROR: x86 emulation currently requires hardware acceleration! https://www.javadrive.jp/android/emulator/index9.html 9.Emulatorの設定 (ツールバーの...ボタン)からOpenGLの設定をする Settings -> Advanced OpenGL ES API level -> Renderer maximum (up to OpenGL ES 3.1) 10. ARCoreのAPK(ARCore_1.x.0.x86_for_emulator.apk)ダウンロードしてインストールする。 https://github.com/google-ar/arcore-android-sdk/releases $ adb install ARCore_1.8.0.x86_for_emulator.apk 11. Run -> Run でアプリを実行する Emulatorを起動したらPlay StoreからARCoreをインストール 15
  8. 2. 3Dモデルを用意する  Sceneform がサポートしている3Dモデルのフォーマット  OBJ, glTF (glb), FBX

    (glTFやglbはプラグインによる変換無しでインポートできる)  Sceneform SDKのサンプルに含まれるモデルを使うこともできる https://github.com/google-ar/sceneform-android-sdk  TextViewやButtonなど標準のコンポーネントを表示したり、 立方体や球などのシェイプを動的に生成することもできる 16
  9. 2. 3Dモデルを用意する 今回はニコニ立体 https://3d.nicovideo.jp/ からVRM形式(Glb形式と下位互換あり) をダウンロードし、OBJ形式に変換してインポートした。 今回使用させていただいた3Dモデル 童田明治 -わらべだめいじー- ファンアート

    https://3d.nicovideo.jp/works/td55436 Pixivが提供する3DキャラメーカーVROIDでもVRM形式 の3Dモデルを作成できる https://studio.vroid.com/ その他、GlTFやFBX形式の3Dモデルも各Webサイト から入手することができる。 17
  10. 2. 3Dモデルを用意する VRMからOBJへの変換手順 1. 拡張子を.vrmから.glbに変更する。 2. 3D Builder (Microsoft Storeから入手)で開き、名前を付けて保存でOBJ形式を選択。

    OBJ形式への変換は上記だけでOKだがVRMは3Dモデルの向きが異なる(-Zが上なので仰向けに なってしまう) & スケールやモデル調整をしたいので、Blender(3DCGアニメーションの統合 開発環境)をつかって編集する。 3. Blender(https://blender.jp/)でファイル->インポート-> .objから3Dモデルをインポート 初期状態で追加されているCubeを削除する。Yが上になるようにモデルを回転する。 ここでポーズなども必要に応じて編集する。 ファイル->エクスポート->.obj , 拡大縮小 = 0.1 としてエクスポートを実行する 18
  11. 3. Androidプロジェクトの作成 1. bundle.gradle (Module: app)に下記を追記 (sceneformプラグインの追加) 2. bundle.gradle (Project)

    に下記を追記 3. Sync Nowをクリックして変更を反映する 20 dependencies { classpath 'com.android.tools.build:gradle:3.4.0' classpath 'com.google.ar.sceneform:plugin:1.9.0' } android { ~中略~ compileOptions { sourceCompatibility 1.8 targetCompatibility 1.8 } } dependencies { ~中略~ implementation 'com.google.ar:core:1.9.0' implementation 'com.google.ar.sceneform.ux:sceneform-ux:1.9.0' implementation 'com.google.ar.sceneform:core:1.9.0' } ライブラリのインポート
  12. 3. Androidプロジェクトの作成 1. AndroidManifest.xmlを編集して必要なパーミッション追加する 21 <manifest xmlns:android=“http://schemas.android.com/apk/res/android” package=“com.example.myfirstarcoreapp3”> <uses-permission android:name=“android.permission.CAMERA”

    /> <uses-feature android:name="android.hardware.camera.ar" /> <application android:allowBackup="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme"> <activity android:name=".MainActivity"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <meta-data android:name="com.google.ar.core" android:value="required" /> </application>
  13. 1. MainActivityにコードを追加する public class MainActivity extends AppCompatActivity { private static

    final String TAG = MainActivity.class.getSimpleName(); private ArFragment arFragment; private ModelRenderable modelRenderable; 5. 3Dモデルを配置するコードを書く 25 ① ①3Dモデルの描画を行うオブジェクト Nodeに紐づけて使う @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); arFragment = (ArFragment) getSupportFragmentManager().findFragmentById(R.id.ux_fragment); ModelRenderable.builder() .setSource(this, Uri.parse(“meiji.sfb”)) .build() .thenAccept(renderable -> modelRenderable = renderable) .exceptionally( throwable -> { Log.e( TAG, “Unable to load Renderable.”, throwable); return null; }); ~続く~ ② ②ArFragmentを取り出す ③3Dモデルをロードする ③
  14. 1. MainActivityにコードを追加する (続き) arFragment.setOnTapArPlaneListener( (HitResult hitResult, Plane plane, MotionEvent motionEvent)

    -> { if (modelRenderable == null) { return; } // Create the Anchor. Anchor anchor = hitResult.createAnchor(); AnchorNode anchorNode = new AnchorNode(anchor); anchorNode.setParent(arFragment.getArSceneView().getScene()); // Create the transformable model and add it to the anchor. TransformableNode node = new TransformableNode(arFragment.getTransformationSystem()); node.setParent(anchorNode); node.setRenderable(modelRenderable); node.select(); }); } } 5. 3Dモデルを配置するコードを書く 26 ① ①Plane(平面)をタップを検出する リスナーの処理を記述 ②タップした位置(hitResult)にAnchorを 作成する。Anchorに紐づくAnchorNode を作成し、ArFragmentのSceneに追加 する。 ③選択、移動、拡大縮小、回転ができる Nodeに3Dモデルを紐づける。 AnchorNodeの子として追加する。 ※Scene Sceneを頂点とした、Nodeで構成されたグラフを 保持するクラス。 当たり判定を提供しどの子Nodeが タッチされたかを検出する ② ③ AnchorNode Anchor Scene TransformableNode Model ArFragment