Build your AR app
by using AR Foundation samples
In usecase of Image tracking
2020.01.22 (wed)
eegozilla
@JAG 1月定例会
Who are you?
eegozilla (@ega1979)
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
• フリーランスのエンジニア(ARのアプリをつくってます)
• ROSCon JP 理事
• 日本アンドロイドの会 運営委員
• GoogleXR WG主宰 (最近活動していない…)
• html5j運営スタッフ, ロボット部部長, Webプラットフォーム部スタッフ (最近活動していない…)
先程、Samplesを使えばかんたんに試せるとは言ったものの…
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
先程、Samplesを使えばかんたんに試せるとは言ったものの…
サンプルは実際のユースケースに
合わせて作っているわけではない!
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
例えば
Image trackingを使ったイベント向けアプリ
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
とりあえずサンプルを試してみる
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
しかし、実際のユースケースを考えると
1度にまとめてトラッキングさせたくない(1枚限りにしたい)
トラッキングを外したら表示される画像は消したい
Image trackingにオン/オフさせたい
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
サンプルのソースコードを見てみる
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
・トラッキングで検知した場合に、
OnTrackedImagesChanged(ARTrackedImagesChangedEventArgs eventArgs)が実行される
・ARTrackedImagesChangedEventArgs eventArgsは、トラッキングできた画像の全体の集合みたいなもの
・ var trackedImageはトラッキングできた個々の画像。
・eventArgs.added/eventArgs.updatedにトラッキングできた画像についてリスト化される
※情報はaddedからupdatedに移される。
・ void UpdateInfo(ARTrackedImage trackedImage) は検知した画像に対する上から被せるものの描画処理。
・ OnTrackedImagesChanged()が実行される中でトラッキングできたものをupdateInfo()で描画処理を行う。
ソースコードから
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
その1
Image trackingにオン/オフ機能
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
試そうとしたこと
1. ARImagetrakingManagerのenableをfalseで起動(オフでスタート)。
トグルを用意してtrueに切り替える(オンにする)。
void Awake() {
m_TrackedImageManager.enabled = false;
}
…
void ImgTrackingOnEnable() {
m_TrackedImageManager.enabled = true;
}
2. トグルでARImagetrakingManagerのenableをfalseに戻す(オフにする)。
void ImgTrackingOnDisable() {
m_TrackedImageManager.enabled = false;
}
…
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
結果
1. ARImagetrakingManagerのenableをfalseで起動(オフでスタート)。
トグルを用意してtrueに切り替える(オンにする)。
void Awake() {
…
m_TrackedImageManager.enabled = false;
…
}
…
void ImgTrackingOnEnable() {
…
m_TrackedImageManager.enabled = true;
…
}
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
結果
1. ARImagetrakingManagerのenableをfalseで起動(オフでスタート)。
トグルを用意してtrueに切り替える(オンにする)。
void Awake() {
…
m_TrackedImageManager.enabled = false;
…
}
…
void ImgTrackingOnEnable() {
…
m_TrackedImageManager.enabled = true;
…
}
黒い画面のまま動かない…
(ARImagetrakingManager.csを有効にすることでデバイスのカメラI/Oへのアクセスを無効にしてしまった)
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
結果
2. トグルでARImagetrakingManager.csのenableをfalseに戻す(オフにする)。
void ImgTrackingOnDisable() {
…
m_TrackedImageManager.enabled = false;
…
}
…
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
結果
一度テクスチャが描画されると完全になくならない。
PrefabをSetActive(false)にしても複数認識した場合は、一つしか非表示にできなかった。
2. トグルでARImagetrakingManager.csのenableをfalseに戻す(オフにする)。
void ImgTrackingOnDisable() {
…
m_TrackedImageManager.enabled = false;
…
}
…
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
対応策
・enableをtrue/falseでコントロールするのではなく、別途bool値(ex. isFlag)を定義する
・isFlagのfalseのときにtrackedImage.gameObjectをSetActive(false) にする
・foreachでループされるので、全リファレンス画像について適用される
・ImageTrackingしか使わないときはenable=falseのスタートは諦める
(他のManegaerを使うときは、そちらにカメラI/Oのアクセスを任せる)
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
Private bool m_isFlag = true;
…
void OnTrackedImageChanged(ARTrackedImageChangedEventArgs eventArgs){
…
if (!m_isFlag) {
…
foreach (var trackedImage in eventArgs) {
…
trackedImage.gameObject.SetActive(false);
}
…
} else {
…
foreach (var trackedImage in eventArgs) {
…
trackedImage.gameObject.SetActive(true);
UpdateInfo(trackedImage);
}
… }
}
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
その2
トラッキングを外したら表示される画像は消したい
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
・trackedImage.trackingStateは認識しているときはtracking、外れるとlimitedになる
対応策
・foreachの中でtrackingのときにupdateInfo()実行し、それ以外のとき(limited)は
trackedImage.gameObjectをSetActive(false) にして、updateInfo()を実行しない
// OnTrackedImageChanged()の中のm_isFlag = trueのときの処理
…
foreach (var trackedImage in eventArgs.updated) {
if (trackedImage.trackingState == TrackingState.Tracking) {
…
trackedImage.gameObject.SetActive(true);
UpdateInfo(trackedImage);
…
} else {
…
trackedImage.gameObject.SetActive(false);
…
}
}
・認識状態のログが取得できる(tracking, limited, none)
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
その3
1度にまとめてトラッキングさせたくない
(検知は1枚だけにしたい)
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
ARKit Pluginの場合
その数までしか認識できなくなる状態にできる
UnityARCameraManagerにMaximumNumberOfTrackedImagesと
いう値を設定できる。
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
ARKit Pluginの場合
AR Foundationの場合
ARImagetrakingManagerにMaxNumberOfMovingImagesという値を設定できる。
The maximum number of moving images to track in realtime.
UnityARCameraManagerにMaximumNumberOfTrackedImagesと
いう値を設定できる。
その数までしか認識できなくなる状態にできる
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
ARKit Pluginの場合
AR Foundationの場合
なんか効いていない。。。
ARImagetrakingManagerにMaxNumberOfMovingImagesという値を設定できる。
The maximum number of moving images to track in realtime.
The maximum number of moving images to track in realtime.
UnityARCameraManagerにMaximumNumberOfTrackedImagesと
いう値を設定できる。
その数までしか認識できなくなる状態にできる
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
ARKit Pluginの場合
AR Foundationの場合
なんか効いていない。。。
ARImagetrakingManagerにMaxNumberOfMovingImagesという値を設定できる。
The maximum number of moving images to track in realtime.
The maximum number of moving images to track in realtime. Not all implementations support this feature.
UnityARCameraManagerにMaximumNumberOfTrackedImagesと
いう値を設定できる。
その数までしか認識できなくなる状態にできる
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
対応策
・認識画像(ReferenceImage)から取得できる情報を確認する(name, uuid)
・認識状態のログが取得できる(tracking, limited, none)
・認識した参照画像の情報と認識状態によって条件分岐して、updateInfo()を実行する
・trackedImage.trackingStateは認識しているときはtracking、外れるとlimitedになる
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
private string disdplayName = “”;
// OnTrackedImageChanged()の中のm_isFlag = trueのときの処理
…
foreach (var trackedImage in eventArgs.updated) {
if (trackedImage.trackingState == TrackingState.Tracking
&& displayName == “”) {
…
displayName = trackedImage.referenceImage.name;
trackedImage.gameObject.SetActive(true);
UpdateInfo(trackedImage);
…
} else if (trackedImage.trackingState == TrackingState.Tracking
&& displayName == trackedImage.referenceImage.name) {
…
trackedImage.gameObject.SetActive(true);
UpdateInfo(trackedImage);
…
} else if (trackedImage.trackingState != TrackingState.Tracking
&& displayName == trackedImage.referenceImage.name) {
…
displayName = “”;
trackedImage.gameObject.SetActive(false);
…
} else {
…
trackedImage.gameObject.SetActive(false);
…
}
}
…
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.
Recap #2
・そのためにはとにかくログを出せ、ログを追え
・ユースケースをちゃんと考える
(ユーザーは想定外の動きをすることが前提)
・条件分岐させるフックとなる部分を探せ
・サンプルをちょこっと弄るだけでは作れない。
(「おっ」となる部分だけの部分だけに目を向けると足元をすくわれる)
・ユースケースからできるだけ細かいテストケースをつくる
(テストを考えられないエンジニアはエンジニアとは言えない)
Copyright @Hirokazu Egashira a.k.a eegozilla. All right reserved.

Build your AR app by using AR Foundation samples