🌟

②[Android][Kotlin][Vuforia][AR]Vuforiaのサンプルコード(Image Targetのみ)を動かしてみた。

に公開

第1回 VuforiaでARの初めの一歩
第2回 Vuforiaのサンプルコード(Image Targetのみ)を動かしてみた。
第3回 動画再生を板ポリ上で実行するサンプルコードを作ってみた。
第4回 Vuforiaで動画再生ARを実装してみた。
第5回 Vuforia11.4.4の公式サンプルコードを動かしてみた。
お薦めしません: 第6回 VuforiaのVuMarkを動かしてみた。
お薦めしません: 第7回 Vuforiaで独自VuMarkを作ってみた。←挑戦中 ←無理ゲーすぎた
第8回 Vuforia(Image Target)を独自マーカーで動かしてみた。
第9回 Vuforia(Image Target)を独自マーカーの複数検出させてみた。

orz.
?! Vuforiaの新バージョンが公式からリリースされとーし(11.4.4)!!
近いうち11.4.4の公式サンプルコード、動かしてみます。
→ 25.9.13 動かしてみた。https://zenn.dev/rg687076/articles/1e46e1bd60b2fe

第2回目 Vuforiaのサンプルコード(Image Targetのみ)を動かしてみた。

Abstruct

  • Vuforiaサンプルコードをビルド→動作させてみた。
  • コード説明
  • Vuforia 11.3.4

※Vuforiaには3Dモデルを認識するModel Targetと、画像を認識するImage Targetってのがあって、この記事はImage Targetの話になります。

背景

ARライブラリだと、Vuforiaが一番よね。ってことで動かしてみようかと。
以前この記事での公式サンプルコードの動かし方を書いたんだけど、今回動かしてみると動かねー。ビルドが通らねー。Android Gradle Pluginバージョンが8系になって過去のコードが軒並みビルドエラーになってもう大変。githubの過去コードがまるで全然動かんやん。
Vuforiaまだサービスやってくれててよかったんだけど、その公式サンプルコードもビルドが通らん。

なので、ビルドが通るようにしてgithubに公開してみた。

今回も目標到達点は↓これ

準備

  • android端末
  • 開発用PC(Android Studioのインストールは済ませておく。)
  • android端末をつないで、デバッグができる様にしておく。
  • SDKとの公式サンプルコードをダウンロード ← githubに一緒にコミットしたんでDL不要。
  • Vuforiaのアカウント作成 前回の説明の準備1をやっておく。
  • Vuforiaのライセンスキー取得 前回の説明の準備2をやって取得しておく。

ビルドする。

1. 下記に修正コードをコミットしたのでそれをDL。

https://github.com/aaaa1597/AndKot-VuforiaImageTargetSample

2. Android Studioでプロジェクトを開く。


開く押下


上図のAndroidプロジェクトを開く。
読み込みが完了するまで、待つ。

3. 認証情報を設定した後、ビルドする。

Vuforiaのライセンス画面


Android Studioで、"AppController.cpp"を開き、licenseKeyに、準備2でコピーしたライセンスを貼り付けます。
そして、ビルド。

もし、この手順を飛ばしたら、アプリ起動時に下記エラーが発生します。

4. マーカを印刷する。

マーカは、vuforia-sample-android-11-3-4.zipを解凍して、vuforia-sample-android-11-3-4/vuforia-sample-11-3-4/Media配下にあります。
target_stones_A4.pdfを印刷しましょう。

↑この画像ですね

5. 動かしてみる。

Android Studioをビルドして、スマホで実行。いきなりカメラ画面になります。
※Splash画面やら、Image Target/Model Terget選択画面やらうるさいので削除しました。
印刷したマーカをカメラで映すと、"目標到達点"で表示している3Dオブジェクトのキャラクタが表示されます。

出来た!!

ハマりポイント

ムズかった~。結構ハマってしまった。何かの情報になるかもやけん残しときます。

1. ビルドがなかなか通らん

  • そもそも samplesのコードだけDLして SDK 側のライブラリをリンクしてなくって苦戦した。
  • CMakeLists.txtの作り方も苦戦した。
    これらはAIのCopilot君に聞いたらちゃんと答えてくれたのが助かった。

2. #include でエラー

'#include <>' と '#include ""' この違いでエラーになってたっけ?
解せん。

- #include <GLESRenderer.h>
+ #include "GLESRenderer.h"

3. vuforiaの特徴ファイル(xml,dat)読み込みエラー

AppController.cpp(929,945)
-       imageTargetConfig.databasePath = "StonesAndChips.xml";
+       imageTargetConfig.databasePath = "ImageTargets/StonesAndChips.xml";
GLESRenderer.cpp(54,68)
-       if (!readAsset(assetManager, "Astronaut.obj", data))
+       if (!readAsset(assetManager, "ImageTargets/Astronaut.obj", data))

app/src/main/assets配下にコピーしたんだけど、構造そのままImageTargetsフォルダの下に置いてたらエラーになって動作しなかった。パスを修正して動くようになった。
※この行って独自マーカー作ったときとか修正が必要な場所なのに、すごい分かりにくいところにあるし。
※assets配下に配置するってことはダウンロードするとか、動的に変更はできないってことじゃんね。わざとかな。

↓プロジェクト毎の変更点になるところでエラーが発生!!(この構成は標準的なので問題ない)

app/
└── src/
    └── main/
        └── assets/
            ├── ImageTargets/
            │   ├── Astronaut.jpg
            │   ├── Astronaut.mtl
            │   ├── Astronaut.obj
            │   ├── StonesAndChips.dat
            │   └── StonesAndChips.xml
            └── ModelTargets/
                ├── VikingLander.jpg
                ├── VikingLander.mtl
                ├── VikingLander.obj
                ├── VuforiaMars_ModelTarget.dat
                └── VuforiaMars_ModelTarget.xml

4. Textureファイル読込みで読み込めず。。。

Texture読込みを Texture.loadTextureFromApk() で実行してるけど Deplicated(非推奨) になったらしく。
かなり面倒な修正になった。で、そこでハマった。直接メモリじゃないとダメらしい。

Deplicated(非推奨) のコード

VuforiaActivity.cpp(339-340)
-       val astronautTexture = Texture.loadTextureFromApk("Astronaut.jpg", assets)
-       val landerTexture = Texture.loadTextureFromApk("VikingLander.jpg", assets)

↓修正コード

MainActivity.cpp(75-81)
+ val astronautbitmap = loadBitmapFromAssets(this@MainActivity, "ImageTargets/Astronaut.jpg")
+ val astronautTexture: ByteBuffer? = astronautbitmap?.let { bitmap ->
+                                         +ByteBuffer.allocateDirect(bitmap.byteCount).apply {
+                                             bitmap.copyPixelsToBuffer(this)
+                                             rewind()
+                                         }
+                                     }

一旦、bitmapで読込んでから、Bytebufferに突っ込むのが推奨らしく、さらに、ByteBufferはallocateDirect()で生成せんとダメらしい。
※allocate()じゃ直接メモリじゃないからダメ。

以上です。
VuforiaでARサンプルを動かす手順でした。

                              「誰かの役に立つと思って」

Discussion