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→キャラク ターがチラチラ消えるので、 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 ピクセル にしないといけないらしい。
完成