Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

はじめようArcore (修正版)

8,603 views

Published on

2018/6/23に開催したARコンテンツ作成勉強会、ARCore編の資料
https://eventon.jp/12953/

Published in: Technology
  • Hi there! I just wanted to share a list of sites that helped me a lot during my studies: .................................................................................................................................... www.EssayWrite.best - Write an essay .................................................................................................................................... www.LitReview.xyz - Summary of books .................................................................................................................................... www.Coursework.best - Online coursework .................................................................................................................................... www.Dissertations.me - proquest dissertations .................................................................................................................................... www.ReMovie.club - Movies reviews .................................................................................................................................... www.WebSlides.vip - Best powerpoint presentations .................................................................................................................................... www.WritePaper.info - Write a research paper .................................................................................................................................... www.EddyHelp.com - Homework help online .................................................................................................................................... www.MyResumeHelp.net - Professional resume writing service .................................................................................................................................. www.HelpWriting.net - Help with writing any papers ......................................................................................................................................... Save so as not to lose
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating for everyone is here: ♥♥♥ http://bit.ly/2Q98JRS ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here
  • Dating direct: ♥♥♥ http://bit.ly/2Q98JRS ♥♥♥
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

はじめようArcore (修正版)

  1. 1. ARコンテンツ作成勉強会 はじめようARCore #AR_Fukuoka
  2. 2. 自己紹介 氏名:吉永崇(Takashi Yoshinaga) 所属:九州先端科学技術研究所(ISIT) 専門:AR/VRを用いた情報可視化と各種計測 コミュニティ:ARコンテンツ作成勉強会
  3. 3. Twitterと勉強会ページで情報を発信しています #AR_Fukuoka Googleで「AR勉強会」で検索
  4. 4. FacebookグループのxR九州もよろしく
  5. 5. ARCore Googleが提供する次世代ARプラットフォーム。普通のスマホでマーカーレスARを実現。 【主要機能】 (1) 自己位置推定 (Motion Tracking) (2) 明るさ推定 (Light Estimation) (3) 平面認識 (Environmental Understanding) (4) マーカー認識 (Augmented Image) (5) 空間共有 (Cloud Anchor)
  6. 6. 今日紹介する内容 Googleが提供する次世代ARプラットフォーム。普通のスマホでマーカーレスARを実現。 【主要機能】 (1) 自己位置推定 (Motion Tracking) (2) 明るさ推定 (Light Estimation) (3) 平面認識 (Environmental Understanding) (4) マーカー認識 (Augmented Image) (5) 空間共有 (Cloud Anchor)
  7. 7. Unityのプロジェクトを作成 (1/2) Unityを起動後、画面右上のNEWをクリック New
  8. 8. Unityのプロジェクトを作成 (2/2) プロジェクト名・保存場所・3Dを指定してCreate project 3D 最後にクリック プロジェクト名 保存場所
  9. 9. ARCoreのインポート ①Assets ②Import Package → Custom Package ③arcore-unity-sdk-xxx ④開く
  10. 10. 演習用フォルダの作成(1/3) Assetsを右クリック
  11. 11. 演習用フォルダの作成(2/3) ①Create ②Folder
  12. 12. 演習用フォルダの作成(3/3) フォルダ名をSample1に変更
  13. 13. 一旦、現状を保存 Sample1を開く コンテンツ名を入力 (例:sample1) 保存 Ctrl + Sで現状のコンテンツ(Scene)を保存 ※この後もこまめに保存しましょう
  14. 14. 自己位置推定:Motion Tracking
  15. 15. ARCore用のカメラの設定(1/2) Main Cameraを削除
  16. 16. ARCore用のカメラの設定(2/2) ①GoogleARCore → Prefabs ② ARCore Device ③ドラッグ&ドロップ
  17. 17. 表示オブジェクトの追加(1/2) ①GoogleARCore → Examples → Common → Prefabs ② Andy Diffuse ③ドラッグ&ドロップ
  18. 18. 表示オブジェクトの追加(2/2) ①AndyDiffuse ② Positionのzを0.5[m]
  19. 19. ビルドの準備 ①File ② Build Settings
  20. 20. ビルドの準備 ②Switch Platform ① Android ③Player Settings
  21. 21. ビルドの準備 ①Product Nameを入力 ② Other Settings ③ Multithreaded Renderingをオフ
  22. 22. ビルドの準備 ①Package Nameを設定 例) com.arfukuoka.test1 ② Minimum API Levelを Android 7.0に設定
  23. 23. ビルドの準備 ①XR Settings ② ARCore Supportedをオン
  24. 24. ビルドと実機インストール ①File ② Build & Run
  25. 25. ビルドと実機インストール ①インストーラー(apk)の名前を設定 ② 保存
  26. 26. 床や壁の認識:Environmental Understanding
  27. 27. Environmental Understandingを有効化(1/5) ①Sample1
  28. 28. Environmental Understandingを有効化(2/5) ①右クリック ②Create ③GoogleARCore ④SessionConfig
  29. 29. Environmental Understandingを有効化(3/5) ファイル名を変更(例:sample1)
  30. 30. Environmental Understandingを有効化(4/5) ①sample1.assetをクリック 【Plane Finding Mode】 (1)Disabled:平面認識なし (2)Horizontal And Vertical: 水平面と垂直面を認識 (3)Horizontal: 水平面のみ認識 (4)Vertical 垂直面のみ認識 今回は(2)~(4)から好きなのを選択
  31. 31. Environmental Understandingを有効化(5/5) ①ARCore Deviceをクリック ②Sample1フォルダ ③sample1.asset ④Session Configに ドラッグ&ドロップ
  32. 32. 平面可視化スクリプト (1/4) ①空白を右クリック ② Create Empty
  33. 33. 平面可視化スクリプト (2/4) ①GameObjectの名前を Controllerに変更
  34. 34. 平面可視化スクリプト (3/4) ①Controllerをクリック ②AddComponent ③Detected Plane Generator
  35. 35. 平面可視化スクリプト (4/4) ②GoogleARCore → Examples → Common → Prefabs ③DetectedPlaneVisualizer ①Controller ④Detected Plane Prefabにドラッグ&ドロップ
  36. 36. 水平面 垂直面
  37. 37. タップした平面にCGを置く ①Controller ②Add Component
  38. 38. タップした平面にCGを置く ①New Script ③Create and Add ②PutScript
  39. 39. タップした平面にCGを置く ①Controllerをクリック ②PutScriptを ダブルクリック
  40. 40. スクリプトの記述 using System.Collections; using System.Collections.Generic; using UnityEngine; using GoogleARCore; public class PutScript : MonoBehaviour { public GameObject andy; //CG(Andy)を扱う変数 void Start () { } void Update () { //タップの検出 //タップした画面の座標と3D空間座標の対応付け //Andyをその位置に置く } }
  41. 41. スクリプトの記述 void Update () { Touch touch; if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began) { return; //画面に触れていないor既に触れている最中なら何もしない } //タップした座標にAndyを移動。 TrackableHit hit; TrackableHitFlags filter = TrackableHitFlags.PlaneWithinPolygon; Frame.Raycast(touch.position.x, touch.position.y, filter, out hit) } touch.position hit Began→タップ開始時 平面を構成するポリゴンの 内側をタップ判定の対象に
  42. 42. スクリプトの記述 void Update () { Touch touch; if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began) { return; //画面に触れていないor既に触れている最中なら何もしない } //タップした座標にAndyを移動。対象は認識した平面 TrackableHit hit; TrackableHitFlags filter = TrackableHitFlags.PlaneWithinPolygon; if (Frame.Raycast(touch.position.x, touch.position.y, filter, out hit)) { //Andyの3D座標を指定するコードを記述(次頁) } } touch.position hit
  43. 43. スクリプトの記述 if (Frame.Raycast(touch.position.x, touch.position.y, filter, out hit)) { //平面にヒット & 裏面でなければAndyを置く if ((hit.Trackable is DetectedPlane ) && Vector3.Dot(Camera.main.transform.position - hit.Pose.position, hit.Pose.rotation * Vector3.up) > 0) { //Andyの位置・姿勢を指定 andy.transform.position = hit.Pose.position; andy.transform.rotation = hit.Pose.rotation; andy.transform.Rotate(0, 180, 0, Space.Self); //Anchorを設定 var anchor = hit.Trackable.CreateAnchor(hit.Pose); andy.transform.parent = anchor.transform; } }
  44. 44. スクリプトとGameObjectのAndyの対応付け ②AndyDiffuse ①Controller ③Put ScriptのAndy にドラッグ&ドロップ
  45. 45. マーカー認識:Augmented Image
  46. 46. 次の演習の準備 ①Assets ③Create ②右クリック ④Folder
  47. 47. 次の演習の準備 フォルダ名をSample2に変更
  48. 48. 次の演習の準備 File→New Scene
  49. 49. 一旦、現状を保存 Sample2を開く コンテンツ名を入力 (例:sample2) 保存 Ctrl+Sで保存&コンテンツ(Scene)名設定
  50. 50. ARCore用カメラの設定 Main Cameraを削除
  51. 51. ARCore用カメラの設定 ①GoogleARCore → Prefabs ② ARCore Device ③ドラッグ&ドロップ
  52. 52. 設定ファイルを作成 ②右クリック ③Create ④GoogleARCore ⑤SessionConfig ①Sample2
  53. 53. 設定ファイルを作成 ファイル名を変更(例:sample2)
  54. 54. 設定ファイルを作成 ①ARCore Deviceをクリック ②Sample2フォルダ ③sample2.asset ④Session Configに ドラッグ&ドロップ
  55. 55. 補足 ①sample2.assetをクリック ②下記を適宜設定 ・Plane Fitting Mode ・Enable Light Estimation ※マーカー認識には影響なし
  56. 56. 次の手順 このあと Augmented Image Database にマーカ情報の一覧を登録する
  57. 57. マーカー画像を追加 ②sample2 ①Sample(事前配布)フォルダ ③AndyMarkerとearthを ドラッグ&ドロップ
  58. 58. 画像をマーカーとして登録 AndyMarkerとearthを選択
  59. 59. 画像をマーカーとして登録 ①どちらかの画像を右クリック ②Create ③GoogleARCore ④AugmentedImage Database
  60. 60. 画像をマーカーとして登録 マーカー画像のデータベース
  61. 61. 解説 マーカーの横幅の実寸サイズ[m] ※0の場合、ARCore側で勝手に 推定してくれる。 ただし、サイズをしておいた方が 位置合わせは安定する Qualityは認識のしやすさ ※75以上推奨 by Google
  62. 62. Sample2.asset
  63. 63. NewDatabase.asset
  64. 64. Polyから表示オブジェクトを入手 Googleが提供する3Dデータ共有サービス https://poly.google.com/
  65. 65. オブジェクトの入手 ここから検索 画面上部のフォームから「Astronaut」で検索
  66. 66. オブジェクトの入手 ここをクリック
  67. 67. オブジェクトの入手 ダウンロード → OBJファイル
  68. 68. Zip解凍後、 フォルダ名が長いので Astronautに変更
  69. 69. CGをプロジェクトに追加 sample2 ①Sample(事前配布)フォルダ ③Astronautフォルダ をドラッグ&ドロップ
  70. 70. CGをプロジェクトに追加 Astronautが追加されていればOK
  71. 71. マーカー認識用スクリプトの作成 ①右クリック ②Create Empty
  72. 72. マーカー認識用スクリプトの作成 GameObjectの名前を Controllerに変更(※任意)
  73. 73. マーカー認識用スクリプトの作成 ①AddComponent
  74. 74. マーカー認識用スクリプトの作成 ①New Script ③Create and Add ②MarkerScript
  75. 75. マーカー認識用スクリプトの作成 ②ダブルクリック ①Controller
  76. 76. スクリプトの記述 using GoogleARCore; public class MarkerScript : MonoBehaviour { public GameObject andy;//Andyオブジェクト public GameObject astronaut;//宇宙飛行士オブジェクト //マーカー番号(int)とCG(GameObject)の対応を記録する辞書 Dictionary<int,GameObject> markerDic = new Dictionary<int,GameObject>(); //フレーム毎に認識されたマーカーを一時的に覚えておく List<AugmentedImage> markers = new List<AugmentedImage>(); void Start() { } void Update() { //マーカーとCGの対応付けを行う(次頁) } }
  77. 77. CGとスクリプトの対応付け(Andy) ①Controller ②GoogleARCore → Examples → Common → Prefabs ③Andy Diffuse ④Andyに ドラッグ&ドロップ
  78. 78. CGとスクリプトの対応付け(Astronaut) ①Controller ②Sample2 → Astronaut ③Astronaut ④Astronautに ドラッグ&ドロップ
  79. 79. void Update() { //計測情報が更新されたマーカーを取得 Session.GetTrackables<AugmentedImage> (markers,TrackableQueryFilter.Updated); //マーカーに対してCGとの対応付けor解除を行う foreach (var image in markers) { int index = image.DatabaseIndex; //マーカーの番号 GameObject obj = null; //上記indexに対応するCGを格納(予定) markerDic.TryGetValue(index, out obj);//indexに対応するCGを取得 if (image.TrackingState == TrackingState.Tracking && obj == null) { //マーカーとCGの対応付けと辞書(markerDic)登録を行う } else if (image.TrackingState == TrackingState.Stopped && obj != null) { //計測をやめたマーカーに対して行う処理 } } }
  80. 80. void Update() { //計測情報が更新されたマーカーを取得 Session.GetTrackables<AugmentedImage> (markers,TrackableQueryFilter.Updated); //マーカーに対してCGとの対応付けor解除を行う foreach (var image in markers) { int index = image.DatabaseIndex; //マーカーの番号 GameObject obj = null; //上記indexに対応するCGを格納(予定) markerDic.TryGetValue(index, out obj);//indexに対応するCGを取得 if (image.TrackingState == TrackingState.Tracking && obj == null) { //マーカーとCGの対応付けと辞書(markerDic)登録を行う } else if (image.TrackingState == TrackingState.Stopped && obj != null) { //計測をやめたマーカーに対して行う処理 } } }
  81. 81. if (image.TrackingState == TrackingState.Tracking && obj == null) { Anchor anchor = image.CreateAnchor(image.CenterPose); switch (index) { case 0://AndyMarker obj = GameObject.Instantiate(andy, anchor.transform); obj.transform.localPosition = new Vector3(0, 0.02f, -0.04f); obj.transform.Rotate(-90, 0, 0, Space.Self); obj.transform.localScale =new Vector3(0.3f, 0.3f, 0.3f); markerDic.Add(index, obj); break; case 1://earth obj = GameObject.Instantiate(astronaut, anchor.transform); obj.transform.localPosition = new Vector3(0.02f, 0.04f, 0); obj.transform.Rotate(90, 0, 0, Space.Self); obj.transform.localScale = new Vector3(0.01f, 0.01f, 0.01f); markerDic.Add(index, obj); break; } }
  82. 82. void Update() { //計測情報が更新されたマーカーを取得 Session.GetTrackables<AugmentedImage> (markers,TrackableQueryFilter.Updated); //マーカーに対してCGとの対応付けor解除を行う foreach (var image in markers){ int index = image.DatabaseIndex; //マーカーの番号 GameObject obj = null; //上記indexに対応するCGを格納(予定) markerDic.TryGetValue(index, out obj);//indexに対応するCGを取得 if (image.TrackingState == TrackingState.Tracking && obj == null) { //マーカーとCGの対応付けと辞書(markerDic)登録を行う } else if (image.TrackingState == TrackingState.Stopped && obj != null) { markerDic.Remove(image.DatabaseIndex); Destroy(obj); } } }
  83. 83. 空間共有:CloudAnchor 今回は同一端末で空間共有(TangoのArea Learning的な使い方)
  84. 84. 下準備 Sample1を選択し、Ctrl +D
  85. 85. 下準備 フォルダ名をsample3
  86. 86. 下準備 ファイル名をそれぞれsample3
  87. 87. 下準備 sample3.unityをダブルクリック
  88. 88. 下準備 ①ARCoreDevice ②sample3.asset ③Session Configに ドラッグ&ドロップ
  89. 89. 下準備 ②PutScriptを選択してCtrl+D ①Assets
  90. 90. 下準備 PutScript1をAnchorScriptに変更
  91. 91. 下準備 AnchorScriptをダブルクリック
  92. 92. 下準備 using UnityEngine; using GoogleARCore; public class AnchorScript : MonoBehaviour { public GameObject andy; // Use this for initialization void Start() { } // Update is called once per frame void Update () { Touch touch; if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began) { return; } クラス名をAnchorScriptに変更
  93. 93. 下準備 ①Controller ②PutScript右の ③Remove Component
  94. 94. 下準備 ①AnchorScript
  95. 95. 下準備 ①Controller ②AndyDiffuse ③Anchor Scriptの Andyにドラグ&ドロップ
  96. 96. 動くことを確認
  97. 97. UI作成 ①右クリック ②UI ③Button
  98. 98. UI作成 ①Canvasをダブルクリック ②ボタンが見えるアングルにする
  99. 99. UI作成 ①Canvas ②Scale With Screen Size
  100. 100. UI作成 ②クリック ③top-centerをクリック ①Button
  101. 101. UI作成 上方の中央右寄りに Pos X: 90 Pos Y: -35 Height: 60
  102. 102. UI作成 ①Button→Text ②ボタンに表示される 文字をHostに変更
  103. 103. UI作成 ①右クリック ②UI ③Button
  104. 104. UI作成 ①Button(1) ②クリック ③top-centerをクリック
  105. 105. UI作成 上方の中央右寄りに Pos X: -90 Pos Y: -35 Height: 60
  106. 106. UI作成 ①Button(1)→Text ②ボタンに表示される 文字をResolveに変更
  107. 107. UI作成 ①右クリック ②UI ③Text
  108. 108. UI作成 ①右クリック ②UI ③Text
  109. 109. UI作成 ①Text ②クリック ③bottom-centerをクリック
  110. 110. UI作成 下方の中央右寄りに Pos X: 0 Pos Y: 30 Width:400 Height: 60
  111. 111. UI作成 ①Font Sizeを50に変更 ②Alignmentを左右・上下 両方とも中央寄せ
  112. 112. Cloud Anchorの使用を許可 ①ARCoreDevice ②Sample3をダブルクリック
  113. 113. Cloud Anchorの使用を許可 Enable Cloud Anchorをオン
  114. 114. GCP側の設定 作成
  115. 115. GCP側の設定 プロジェクト名をつける
  116. 116. GCP側の設定 選択
  117. 117. GCP側の設定 今作ったプロジェクトを選択
  118. 118. GCP側の設定 ARCore Cloud Anchor APIで検索
  119. 119. GCP側の設定 有効にする
  120. 120. APIキーの作成 ①メニュー ②APIとサービス ③認証情報
  121. 121. APIキーの作成 ①認証情報を作成 ②APIキー
  122. 122. APIキーの作成 コピー
  123. 123. GCP側の設定 ①Edit ②Project Settings ③ARCore
  124. 124. GCP側の設定 ②Close ①APIキーをはりつけ
  125. 125. これから追加する内容(概要) public class AnchorScript : MonoBehaviour { // Use this for initialization void Start() { } public void HostAnchor() { } public void ResolveAnchor() { } void Update () { //ボタンと画面どちらをタップしたのかを認識 //画面をタップしたらAndyを対応する3次元位置に配置 //最新のAnchorを覚えておく } } 環境情報を クラウドに保存 CloudAnchorで 位置合わせ
  126. 126. 画面タップとボタンタップの区別 using UnityEngine.EventSystems; public class AnchorScript : MonoBehaviour { /*Start,HostAnchor,ResolveAnchorはスペースの都合上省略*/ void Update () { if (EventSystem.current.IsPointerOverGameObject (Input.GetTouch(0).fingerId)) { return; } Touch touch; if (Input.touchCount < 1 || (touch = Input.GetTouch(0)).phase != TouchPhase.Began) { return; } //タッチした座標にAndyを移動。対象は認識した平面 TrackableHit hit; TrackableHitFlags filter = TrackableHitFlags.PlaneWithinPolygon; /*以下省略*/
  127. 127. 最新のAnchorを記録 Anchor currentAnchor = null; void Update () { /*途中省略*/ if (Frame.Raycast(touch.position.x, touch.position.y, filter, out hit)) { if ((hit.Trackable is DetectedPlane) && Vector3.Dot(Camera.main.transform.position – hit.Pose.position,hit.Pose.rotation * Vector3.up) > 0) { //Andyの位置・姿勢を指定 andy.transform.position = hit.Pose.position; andy.transform.rotation = hit.Pose.rotation; andy.transform.Rotate(0, 180, 0, Space.Self); //Anchorを設定 var anchor = hit.Trackable.CreateAnchor(hit.Pose); andy.transform.parent = anchor.transform; currentAnchor = anchor; } } }
  128. 128. 最新のAnchorをクラウドに保存 using GoogleARCore; using UnityEngine.EventSystems; using GoogleARCore.CrossPlatform; using UnityEngine.UI; public class AnchorScript : MonoBehaviour { public GameObject andy; Anchor currentAnchor = null; public Text txt; //保存や位置合わせのステータス表示 bool connecting = false; //クラウドに接続中or切断 void Start() { } public void HostAnchor() { } 環境情報をクラウドに保存 (次頁)
  129. 129. 最新のAnchorをクラウドに保存 public void HostAnchor() { if (connecting || currentAnchor == null) { return; } connecting = true; txt.text = "hosting..."; //環境情報をアップロード XPSession.CreateCloudAnchor(currentAnchor).ThenAction(result => { connecting = false; if (result.Response != CloudServiceResponse.Success) { txt.text = "Please Try Again"; return; } txt.text = result.Anchor.CloudId; }); }
  130. 130. Textオブジェクトとスクリプトの対応付け ①Textを見つけておく ②Controller ②Anchor Scriptの Txtにドラッグ&ドロップ
  131. 131. ボタン押下時にAnchorをクラウドに保存(1/4) ②On Click()内の+ ①Button
  132. 132. ボタン押下時にAnchorをクラウドに保存(2/4) ①Controller ②Noneと書かれた 箇所にドラッグ&ドロップ
  133. 133. ボタン押下時にAnchorをクラウドに保存(3/4) No Function
  134. 134. ボタン押下時にAnchorをクラウドに保存(4/4) ①AnchorScript ②HostAnchor
  135. 135. 【動作確認の手順】 ① 平面を認識させる ② Andyを配置 ③ Hostボタンをタップ ④ 画面下の文字がhosting...になる ⑤ アップロードに成功するとIDが表示される 【この後やりたいこと】 ① アプリをいったん終了して再起動 ② 前操作で生成したIDでCGP側に問い合わせ ③ CloudAnchorで現在の空間とマッチング ④ CGが同じ位置に表示! まずはIDをスマホ内に保存
  136. 136. Cloud AnchorのIDを保存 using UnityEngine.EventSystems; using UnityEngine.UI; using System.IO; public class AnchorScript : MonoBehaviour { public GameObject andy; Anchor currentAnchor = null; public Text txt; bool connecting = false; string filePath; void Start() { filePath = Application.persistentDataPath + "/anchorID.txt"; } public void HostAnchor() { } 環境情報をクラウドに保存 (編集中)
  137. 137. 環境情報をクラウドに保存 public void HostAnchor() { if (connecting || currentAnchor == null) { return; } connecting = true; txt.text = "hosting..."; //環境情報をアップロード XPSession.CreateCloudAnchor(currentAnchor).ThenAction(result => { connecting = false; if (result.Response != CloudServiceResponse.Success) { txt.text = "Please Try Again"; return; } txt.text = ""; StreamWriter sw = new StreamWriter(filePath, false); sw.WriteLine(result.Anchor.CloudId); sw.Close(); }); }
  138. 138. 次のステップ public class AnchorScript : MonoBehaviour { // Use this for initialization void Start() { } public void HostAnchor() { } public void ResolveAnchor() { } void Update () { //ボタンと画面どちらをタップしたかを認識 //画面をタップしたらAndyを対応する3次元位置に配置 //最新のAnchorを覚えておく } } 環境情報を クラウドに保存 CloudAnchorで 位置合わせ
  139. 139. テキストファイルの読み込み public void ResolveAnchor() { if (connecting) { return; } connecting = true; // txtファイルを読み込む FileInfo file = new FileInfo(filePath); StreamReader sr = new StreamReader(file.OpenRead()); string cloudAnchorId = sr.ReadLine(); sr.Close(); txt.text=cloudAnchorId; }
  140. 140. ボタン押下時にファイル読み込み&位置合わせ ②On Click()内の+ ①Button(1)
  141. 141. ボタン押下時にファイル読み込み&位置合わせ ①Controller
  142. 142. ボタン押下時にファイル読み込み&位置合わせ No Function
  143. 143. ボタン押下時にファイル読み込み&位置合わせ ①AnchorScript ②ResolveAnchor
  144. 144. 【動作確認の手順】 ① Andyをどこかに配置 ② Hostボタンを押しクラウドに保存 ③ アプリを終了 ④ アプリを再び起動 ⑤ Resolveボタンをタップ ⑥ 画面下にIDが表示されればOK 【この後やりたいこと】 ① IDを使ってARCoreAPI(クラウド) に問い合わせ ③ CloudAnchorで空間のマッチング ④ CGが以前と同じ位置に表示! ここにIDが表示される
  145. 145. CloucAnchorを用いた位置合わせ public void ResolveAnchor() { /*さっきまで書いていたところは省略*/ //txt.text = cloudAnchorId; txt.text ="resolving..."; XPSession.ResolveCloudAnchor(cloudAnchorId).ThenAction(result => { connecting = false; if (result.Response != CloudServiceResponse.Success) { txt.text = "Please Try Again"; return; } txt.text = ""; andy.transform.position = result.Anchor.transform.position; andy.transform.rotation = result.Anchor.transform.rotation; andy.transform.Rotate(0, 180, 0, Space.Self); andy.transform.parent = result.Anchor.transform; }); }
  146. 146. 完成

×