[Android][Kotlin][Vuforia][AR]Vuforiaのサンプルコード(Image Target)を動かしてみた。
Abstruct
- Vuforiaサンプルコードをビルド→動作させてみた。
- コード説明
背景
ちょっと思い立って、Vuforia動かしてみようかと思った。
以前この記事で動かし方を書いたんだけど、今回動かしてみると動かねー。ビルドが通らねー。Android Gradle Pluginバージョンが8系になって過去のコードが軒並みビルドエラーになってもう大変。githubのコードが全然動かん。
Vuforiaまだサービスやってくれててよかったんだけど、公式サンプルコードもビルドが通らん。
なので、ビルドが通るようにしてgithubに公開してみた。
今回も目標到達点は↓これ
準備
- android端末
- 開発用PC(Android Studioのインストールは済ませておく。)
- android端末をつないで、デバッグができる様にしておく。
- SDKとサンプルコードをダウンロード
- Vuforia SDK: https://developer.vuforia.com/downloads/sdk
- Samples: https://developer.vuforia.com/downloads/samples
- vuforia-sample-android-11-3-4.zip
- vuforia-sdk-android-11-3-4.zip
- Vuforiaのアカウント作成 前回の説明の準備1をやっておく。
- Vuforiaのライセンスキー取得 前回の説明の準備2をやって取得しておく。
ビルドする。
1. 下記に修正コードをコミットしたのでそれをDL。
2. Android Studioでプロジェクトを開く。
開く押下
上図のAndroidプロジェクトを開く。
読み込みが完了するまで、待つ。
3. 認証情報を設定した後、ビルドする。
Android Studioで、"AppController.cpp"を開き、licenseKeyに、準備2でコピーしたライセンスを貼り付けます。
そして、ビルド。
もし、この手順を飛ばしたら、アプリ起動時に下記エラーが発生します。
4. マーカを印刷する。
マーカは、D:\VuforiaTest\vuforia-sdk-android-10-7-2\samples\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)読み込みエラー
- imageTargetConfig.databasePath = "StonesAndChips.xml";
+ imageTargetConfig.databasePath = "ImageTargets/StonesAndChips.xml";
- 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(非推奨) のコード
- val astronautTexture = Texture.loadTextureFromApk("Astronaut.jpg", assets)
- val landerTexture = Texture.loadTextureFromApk("VikingLander.jpg", assets)
↓修正コード
+ 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