かぴばらさんの覚書ブログ (nonkapibara 自分メモ)

かぴばらさんの覚書ブログ (nonkapibara 自分メモ)

Unity勉強中です。 AR、VR、エンターテイメント全般、ワクワクする事が大好き♪♪ O(≧∇≦)O イエイ!!

【Unity】UnityARImageAnchor 画像トラッキング [ARKit1.5]

2枚の手書き絵の画像をトラッキングしてUnity Chanを表示する。

環境メモ

⭐️Mac OS Mojave バージョン10.14

⭐️Unity 2018.2.15f1

⭐️Xcode10.1

⭐️iPhone7(IOS 12.1)

実際に動かした動画はこちら↓↓

https://twitter.com/nonnonkapibara/status/1068659956012859396

 

■めも1→キャラクターが後ろを向いて表示されるのでUpdateImageAnchorでカメラの方向に向かせるように修正しました。

■めも2→キャラクターがチラチラ消えるので、RemoveImageAnchorGameObjectDestroyをコメントにしてみました。

Unity

Unity3D

ARKit

画像トラッキング

UnityARImageAnchor

 

1.UnityARKitPlugin/Examples/ARKit1.5/UnityARImageAnchor/UnityARImageAnchor.unityを展開する

f:id:nonkapibara:20181201092931p:plain

2.RandomCubeを非表示にする

f:id:nonkapibara:20181201093017p:plain

3.AssetsストアよりOptimize, SD Kohaku-Chanz!をインポートする

f:id:nonkapibara:20181201093047p:plain

 

5.UnityARKitPlugin/Examples/ARKit1.5/UnityARImageAnchor/ReferenceImagesフォルダの中に画像を入れる

nondog.jpg(470×676)

fish.jpg(686×602

f:id:nonkapibara:20181201093115p:plain

 

後から判明したのですが、絵は正方形(512×512)で作る必要があったみたいです。

nondog.jpg(512×512)

fish.jpg(512×512

 

 

6.プロジェクト「Create」「UnityARKitPlugin」「ARReferenceImage」を選択する

7.2つ作り、以下の名前にした。

nondogReference.asset

fishReference.asset

f:id:nonkapibara:20181201093244p:plain

8.nondogReference.asset」を選択し、名前を「dog」にしARマーカーサイズPhysical Sizeを「0.5」にする。

f:id:nonkapibara:20181201093320p:plain

9.fishReference.asset」を選択し、名前を「fish」にしARマーカーサイズPhysical Sizeを「0.5」にする。

Physical Sizeは「1」で100cm。「0.5」なので50cm

実際書いたnondogfishの絵が、ちょっと小さかったかなぁ。

とりあえず、50cm以内には収まる。

f:id:nonkapibara:20181201093349p:plain

10.もともとサンプルで「ARImagesSet_UnityLogo」があるので、そこにdogfishを追加することにした。

f:id:nonkapibara:20181201093427p:plain

11.もとのサンプルが2つあるので、そこに、2つ追加するので、「Reference images」のSizeを「4」に変更する

Element2Element3に、nondogReference.assetfishReference.assetを追加する

f:id:nonkapibara:20181201093452p:plain

12.ヒエラルキーウィンドウ「ARCameraManager」を選択し「Maximum Number Of」を4に変更する

f:id:nonkapibara:20181201093518p:plain

13.Create Empty」を作る

f:id:nonkapibara:20181201093537p:plain

 

14.Generate Image Anchor」追加する

CameraParent」「MainCamera」の下に

FishObjectDogObjectを作る。

f:id:nonkapibara:20181201093559p:plain

f:id:nonkapibara:20181201093612p:plain

15.Game Objectを「DogObject」に名前を変更し、Main Cameraの配下に配置する

Reference Imageに「nondogReference.asset」を設定する

Prefab To Generateに「UTC_SchoolUniform_summer」プレハブを設定する

f:id:nonkapibara:20181201093640p:plain

16.Reference Imageに「fishReference.asset」を設定する

Prefab To Generateに「Misaki_SchoolUniform_Winter」プレハブを設定する

f:id:nonkapibara:20181201093704p:plain

プレハブの「UTC_SchoolUniform_summer」のサイズを1.5サイズにする

f:id:nonkapibara:20181201093921p:plain

プレハブの「Misaki_SchoolUniform_Winter」のサイズを1サイズにする

f:id:nonkapibara:20181201094137p:plain

 

18.Generate Image Anchor.csスクリプトを開く

f:id:nonkapibara:20181201093726p:plain

19.void UpdateImageAnchor
メソッドに「キャラクターをカメラの方向に向ける」と「キャラクターをカメラの方向に回転させる」ようにソースコードを追加する

キャラクターが少しチラチラするので、「RemoveImageAnchor」メソッドの

GameObject.Destroy (imageAnchorGO);」をコメントにする

f:id:nonkapibara:20181201093747p:plain

めも1→キャラクターが後ろを向いて表示されるのでUpdateImageAnchorでカメラの方向に向かせるように修正しました。

めも2→キャラクターがチラチラ消えるので、RemoveImageAnchorGameObjectDestroyをコメントにしてみました。

 

20.Xcodeの「Deployment Target」を」12.1にする

動作した環境は、以下の通り

⭐️Xcode10.1

⭐️iPhone7(IOS 12.1)

f:id:nonkapibara:20181201093811p:plain

 

 

GenerateImageAnchor.cs
using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using UnityEngine.XR.iOS;

public class GenerateImageAnchor : MonoBehaviour
{


    [SerializeField]
    private ARReferenceImage referenceImage = null;

    [SerializeField]
    private GameObject prefabToGenerate = null;

    private GameObject imageAnchorGO;

    // Use this for initialization
    void Start () {
        UnityARSessionNativeInterface.ARImageAnchorAddedEvent += AddImageAnchor;
        UnityARSessionNativeInterface.ARImageAnchorUpdatedEvent += UpdateImageAnchor;
        UnityARSessionNativeInterface.ARImageAnchorRemovedEvent += RemoveImageAnchor;

    }

    void AddImageAnchor(ARImageAnchor arImageAnchor)
    {
        Debug.LogFormat("image anchor added[{0}] : tracked => {1}", arImageAnchor.identifier, arImageAnchor.isTracked);
        if (arImageAnchor.referenceImageName == referenceImage.imageName) {
            Vector3 position = UnityARMatrixOps.GetPosition (arImageAnchor.transform);
            Quaternion rotation = UnityARMatrixOps.GetRotation (arImageAnchor.transform);

            imageAnchorGO = Instantiate<GameObject> (prefabToGenerate, position, rotation);
        }
    }

    void UpdateImageAnchor(ARImageAnchor arImageAnchor)
    {
        Debug.LogFormat("image anchor updated[{0}] : tracked => {1}", arImageAnchor.identifier, arImageAnchor.isTracked);
        if (arImageAnchor.referenceImageName == referenceImage.imageName) {
            if (arImageAnchor.isTracked)
            {
                if (!imageAnchorGO.activeSelf)
                {
                    imageAnchorGO.SetActive(true);
                }

            }
            else if (imageAnchorGO.activeSelf)
            {
                imageAnchorGO.SetActive(false);
            }
            imageAnchorGO.transform.position = UnityARMatrixOps.GetPosition(arImageAnchor.transform);
            imageAnchorGO.transform.rotation = UnityARMatrixOps.GetRotation(arImageAnchor.transform);
            // キャラクターをカメラの方向に向ける
            imageAnchorGO.transform.LookAt(Camera.main.transform.position);
            // キャラクターをカメラの方向に回転させる
            imageAnchorGO.transform.eulerAngles = new Vector3(0, imageAnchorGO.transform.eulerAngles.y, 0);
        }

    }

    void RemoveImageAnchor(ARImageAnchor arImageAnchor)
    {
        Debug.LogFormat("image anchor removed[{0}] : tracked => {1}", arImageAnchor.identifier, arImageAnchor.isTracked);
        // キャラクターがチラチラ消えるのでコメントにしました。
        /*
        if (imageAnchorGO) {
            GameObject.Destroy (imageAnchorGO);
        }
        */ 

    }

    void OnDestroy()
    {
        UnityARSessionNativeInterface.ARImageAnchorAddedEvent -= AddImageAnchor;
        UnityARSessionNativeInterface.ARImageAnchorUpdatedEvent -= UpdateImageAnchor;
        UnityARSessionNativeInterface.ARImageAnchorRemovedEvent -= RemoveImageAnchor;

    }

    // Update is called once per frame
    void Update () {
        
    }
}



 

自分メモ・・・最初、fish画像のサイズが310pxの場合、以下のエラーが出ました。

ARUnityChanTraking[1548:71129] [Session] Session (0x105f53280): did fail with error: Error Domain=com.apple.arkit.error Code=300 "Invalid reference image." UserInfo={NSLocalizedFailureReason=One or more reference images have an invalid size: Fish, NSLocalizedRecoverySuggestion=Make sure that all reference images are greater than 100 pixels and have a positive physical size in meters.,

幅と高さは、少なくとも480ピクセルにしないといけないらしい。

 

f:id:nonkapibara:20181202003305p:plain

完成