Mais conteúdo relacionado Semelhante a はじめようARCore (20) Mais de Takashi Yoshinaga (19) はじめようARCore42. スクリプトの記述
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→タップ開始時
平面を構成するポリゴンの
内側をタップ判定の対象に
43. スクリプトの記述
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
44. スクリプトの記述
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;
}
}
78. スクリプトの記述
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の対応付けを行う(次頁)
}
}
83. 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;
}
}
94. 下準備
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に変更
127. これから追加する内容(概要)
public class AnchorScript : MonoBehaviour {
// Use this for initialization
void Start()
{
}
public void HostAnchor()
{
}
public void ResolveAnchor()
{
}
void Update () {
//ボタンと画面どちらをタップしたのかを認識
//画面をタップしたらAndyを対応する3次元位置に配置
//最新のAnchorを覚えておく
}
}
環境情報を
クラウドに保存
CloudAnchorで
位置合わせ
128. 画面タップとボタンタップの区別
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;
/*以下省略*/
129. 最新の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;
}
}
}
131. 最新の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;
});
}
137. 【動作確認の手順】
① 平面を認識させる
② Andyを配置
③ Hostボタンをタップ
④ 画面下の文字がhosting...になる
⑤ アップロードに成功するとIDが表示される
【この後やりたいこと】
① アプリをいったん終了して再起動
② 前操作で生成したIDでCGP側に問い合わせ
③ CloudAnchorで現在の空間とマッチング
④ CGが同じ位置に表示!
まずはIDをスマホ内に保存
138. 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()
{
}
環境情報をクラウドに保存 (編集中)
139. 環境情報をクラウドに保存
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();
});
}
140. 次のステップ
public class AnchorScript : MonoBehaviour {
// Use this for initialization
void Start()
{
}
public void HostAnchor()
{
}
public void ResolveAnchor()
{
}
void Update () {
//ボタンと画面どちらをタップしたかを認識
//画面をタップしたらAndyを対応する3次元位置に配置
//最新のAnchorを覚えておく
}
}
環境情報を
クラウドに保存
CloudAnchorで
位置合わせ
141. テキストファイルの読み込み
public void ResolveAnchor()
{
if (connecting) { return; }
connecting = true;
// FileReadTest.txtファイルを読み込む
FileInfo file = new FileInfo(filePath);
StreamReader sr = new StreamReader(file.OpenRead());
string cloudAnchorId = sr.ReadLine();
sr.Close();
txt.text=cloudAnchorId;
}
147. 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;
});
}