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

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

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers.

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

Avatar for Hiroki.Abe

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