【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
【Unity ARkit】2枚の手書き絵の画像をトラッキングしてキャラクターを表示する。を勉強したよぉ
— non (@nonnonkapibara) December 1, 2018
💕(≧∇≦)💕
動作環境
Xcode10.1
iPhone (iOS12.1)#Unity #Unity3D #ARkit #UnityARImageAnchor pic.twitter.com/fvvPAhZqPf
■めも1→キャラクターが後ろを向いて表示されるのでUpdateImageAnchorでカメラの方向に向かせるように修正しました。
■めも2→キャラクターがチラチラ消えるので、RemoveImageAnchorのGameObjectのDestroyをコメントにしてみました。
Unity
Unity3D
ARKit
画像トラッキング
UnityARImageAnchor
1.UnityARKitPlugin/Examples/ARKit1.5/UnityARImageAnchor/UnityARImageAnchor.unityを展開する
2.RandomCubeを非表示にする
3.Assetsストアより「Optimize, SD Kohaku-Chanz!」をインポートする
5.UnityARKitPlugin/Examples/ARKit1.5/UnityARImageAnchor/ReferenceImagesフォルダの中に画像を入れる
nondog.jpg(470×676)
と
fish.jpg(686×602)
※後から判明したのですが、絵は正方形(512×512)で作る必要があったみたいです。
nondog.jpg(512×512)
fish.jpg(512×512)
6.プロジェクト「Create」「UnityARKitPlugin」「ARReferenceImage」を選択する
7.2つ作り、以下の名前にした。
nondogReference.asset
fishReference.asset
8.「nondogReference.asset」を選択し、名前を「dog」にしARマーカーサイズPhysical Sizeを「0.5」にする。
9.「fishReference.asset」を選択し、名前を「fish」にしARマーカーサイズPhysical Sizeを「0.5」にする。
Physical Sizeは「1」で100cm。「0.5」なので50cm。
実際書いたnondogとfishの絵が、ちょっと小さかったかなぁ。
とりあえず、50cm以内には収まる。
10.もともとサンプルで「ARImagesSet_UnityLogo」があるので、そこにdogとfishを追加することにした。
11.もとのサンプルが2つあるので、そこに、2つ追加するので、「Reference images」のSizeを「4」に変更する
Element2とElement3に、nondogReference.assetとfishReference.assetを追加する
12.ヒエラルキーウィンドウ「ARCameraManager」を選択し「Maximum Number Of」を4に変更する
13.「Create Empty」を作る
14.「Generate Image Anchor」追加する
「CameraParent」「MainCamera」の下に
FishObjectとDogObjectを作る。
15.Game Objectを「DogObject」に名前を変更し、Main Cameraの配下に配置する
Reference Imageに「nondogReference.asset」を設定する
Prefab To Generateに「UTC_SchoolUniform_summer」プレハブを設定する
16.Reference Imageに「fishReference.asset」を設定する
Prefab To Generateに「Misaki_SchoolUniform_Winter」プレハブを設定する
プレハブの「UTC_SchoolUniform_summer」のサイズを1.5サイズにする
プレハブの「Misaki_SchoolUniform_Winter」のサイズを1サイズにする
18.「Generate Image Anchor.cs」スクリプトを開く
19.void UpdateImageAnchor
メソッドに「キャラクターをカメラの方向に向ける」と「キャラクターをカメラの方向に回転させる」ようにソースコードを追加する
キャラクターが少しチラチラするので、「RemoveImageAnchor」メソッドの
「GameObject.Destroy (imageAnchorGO);」をコメントにする
めも1→キャラクターが後ろを向いて表示されるのでUpdateImageAnchorでカメラの方向に向かせるように修正しました。
めも2→キャラクターがチラチラ消えるので、RemoveImageAnchorのGameObjectのDestroyをコメントにしてみました。
20.Xcodeの「Deployment Target」を」12.1にする
動作した環境は、以下の通り
⭐️Xcode10.1
⭐️iPhone7(IOS 12.1)
■ 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ピクセルにしないといけないらしい。