Augmented Image For unity

環境

  • Unity 2019.3.14
  • ARCore 1.18
  • 端末 OPPO Reno A
  • APILevel 7.0 ~

Augmented Image の仕様うんぬん

developers.google.com

※公式より抜粋

  • 最大20枚の画像を同時に追跡できる
  • 同じ画像の複数のインスタンスを同時に検出または追跡しない
  • 各拡張画像データベースには、最大1,000の参照画像の情報を保存できる
  • データベースの数に制限はないが、一度にアクティブにできるデータベースは1つだけ
  • (?)画像は、実行時に拡張データベースに追加できる
  • ネットワーク接続を使用して、以前に作成したデータベースをダウンロードできる(詳しくは、 デベロッパーガイド
  • (?)画像を追加するときに、検出する画像の物理的なサイズを指定することができる
    • (?)物理的なサイズが指定されていない場合、ARCoreはサイズを見積もり、この見積もりを時間をかけて調整する
    • (?)物理サイズが指定されている場合、ARCoreは指定されたサイズを使用して画像の位置と方向を推定し、見かけのサイズまたは実際のサイズと指定された物理サイズとの不一致を無視する
  • 次の画像に応答して追跡できる
    • 壁に掛けられたプリントやテーブルの上の雑誌など、固定された画像
    • 通過するバスの広告や、ユーザーが手を動かして持っている平らな物体の画像などの動画
  • 画像が検出されると、ユーザーがデバイスを動かしたために画像がカメラビューから一時的に外れても、ARCoreは画像の位置と向きを「追跡」し続ける
  • すべての追跡はデバイス上で行われます。画像の検出と追跡にインターネット接続は不要

ラッキングにおける必要条件

  • 最初に検出されるカメラフレームの少なくとも25%を埋める
  • 平らにする(たとえば、しわになったり、ボトルに巻き付けたりしない)
  • 部分的に隠されたり、非常に斜めの角度で表示されたり、モーションブラーのためにカメラの動きが速すぎるときに表示しない

そのたもろもろうんぬんかんぬんは公式へ・・・

サンプルつくってみる

developers.google.com

公式参照のこと

とりあえず「Assets/GoogleARCore/Examples/AugmentedImage/Scenes/」をビルドラン

f:id:gamaspecial:20200901194836p:plain

やってみる、

とりあえずサンプル画像があらかじめ登録されているので、

f:id:gamaspecial:20200901195451p:plain

f:id:gamaspecial:20200901195515p:plain

サンプルだとなんか額縁がつくらしい、、、(地味

いじってみる

画像データベースを作る

公式のとおりなんだけどわかりづらすきる・・・ Augmented Images developer guide for Unity  |  ARCore

1.画像を用意する

f:id:gamaspecial:20200901200320p:plain

2.画像選択 > 画像右クリック > Create > Google ARCore > AugmentedImageDatabase

f:id:gamaspecial:20200901200534p:plain

ちなみに、スクリプトから登録もできるっぽい?(ためしてないがいける気がする アプリから画像とってそのままデータベースにぶちこめたりできそう!

GoogleARCore.AugmentedImageDatabase Class Reference

f:id:gamaspecial:20200901201027p:plain

とおもったら

品質0/100・・・おお

この数字がなにかっていうと、この数字(スコア)が高いほどシステムが画像をトラッキングしやすいとのこと、 なのでこのボール達はとてもトラッキングしづらいということ・・・。

f:id:gamaspecial:20200901201249p:plain

使用arcoreimgの間で品質スコアを取得するためにArcoreのSDKに含まれてツールを0して100、各画像のために。75以上の品質スコアをお勧めします。

ネットからぱくってきたので、こいつならいける

f:id:gamaspecial:20200901202127p:plain

f:id:gamaspecial:20200901202154p:plain

「・・・なにがだめなん?」

ベストプラクティス

developers.google.com

公式を読んだ末に出した答えがこれです。(色情報つかってないんだねぇ・・・

f:id:gamaspecial:20200901202409p:plain

結果は見事勝利をおさめました(スーパーボールだけ5点低いけどね、

f:id:gamaspecial:20200901202913p:plain

これでいったん画像データベースの作成はおしまい

データベースを使用する

developers.google.com

「ssets/GoogleARCore/Examples/AugmentedImage/Configurations/AugmentedImagesSessionConfig」

f:id:gamaspecial:20200901203141p:plain

変更する(この作業もスクリプトでいけるらしい

f:id:gamaspecial:20200901203236p:plain

データベース適用されたか確認する

f:id:gamaspecial:20200901203614p:plain

いけたね

表示するオブジェクトを変えてみる

ExampleControllerにアタッチされてるAugmentedImageExampleControllerをみてみたところ、
こいつは画像データベースに登録されてり画像を検出し、AugmentedImageVisualizerPrefab(デフォで設定されてるやつ)を配置するやつみたい

てことは次はAugmentedImageVisualizerPrefabを見てみる
AugmentedImageVisualizer にアタッチされてる AugmentedImageVisualizer が表示するオブジェクトの位置云々を制御しているっぽい
のでこいつを書き換える、

namespace GoogleARCore.Examples.AugmentedImage
{
    using System;
    using System.Collections.Generic;
    using System.Runtime.InteropServices;
    using GoogleARCore;
    using GoogleARCoreInternal;
    using UnityEngine;

    public class AugmentedImageVisualizer : MonoBehaviour
    {
        public AugmentedImage Image;
        public GameObject Hoge;

        public void Update()
        {
            if (Image == null || Image.TrackingState != TrackingState.Tracking)
            {
                Hoge.SetActive(false);
                return;
            }

            float halfWidth = Image.ExtentX / 2;
            float halfHeight = Image.ExtentZ / 2;
            Hoge.transform.localPosition =
                (halfWidth * Vector3.zero) + (halfHeight * Vector3.zero);

            Hoge.SetActive(true);
        }
    }
}

よしよし

f:id:gamaspecial:20200902020656p:plain