Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
ARコンテンツ作成勉強会:VuforiaでつくるスマホAR+VRアプリ
Search
shinjism
October 13, 2018
Technology
0
800
ARコンテンツ作成勉強会:VuforiaでつくるスマホAR+VRアプリ
Unity Asset Storeで公開されているVuforia AR+VR Sampleを用いたスマホアプリ作成ハンズオンでのスライド
shinjism
October 13, 2018
Tweet
Share
More Decks by shinjism
See All by shinjism
OpenCVでつくろうARスタンプアプリ for iOS
shinjism
0
130
個人的にお気に入りのVuforia公式サンプル #AR_Fukuoka
shinjism
0
100
A-Frameでお手軽WebAR
shinjism
1
4.2k
日本語でおk?
shinjism
0
230
Other Decks in Technology
See All in Technology
「AI駆動PO」を考えてみる - 作る速さから価値のスループットへ:検査・適応で未来を開発 / AI-driven product owner. scrummat2025
yosuke_nagai
4
630
ZOZOのAI活用実践〜社内基盤からサービス応用まで〜
zozotech
PRO
0
200
AIが書いたコードをAIが検証する!自律的なモバイルアプリ開発の実現
henteko
1
350
生成AIとM5Stack / M5 Japan Tour 2025 Autumn 東京
you
PRO
0
230
【Oracle Cloud ウェビナー】クラウド導入に「専用クラウド」という選択肢、Oracle AlloyとOCI Dedicated Region とは
oracle4engineer
PRO
3
120
小学4年生夏休みの自由研究「ぼくと Copilot エージェント」
taichinakamura
0
500
AI駆動開発を推進するためにサービス開発チームで 取り組んでいること
noayaoshiro
0
220
SwiftUIのGeometryReaderとScrollViewを基礎から応用まで学び直す:設計と活用事例
fumiyasac0921
0
150
AWS Top Engineer、浮いてませんか? / As an AWS Top Engineer, Are You Out of Place?
yuj1osm
1
110
BirdCLEF+2025 Noir 5位解法紹介
myso
0
200
自動テストのコストと向き合ってみた
qa
0
200
ACA でMAGI システムを社内で展開しようとした話
mappie_kochi
1
290
Featured
See All Featured
The Invisible Side of Design
smashingmag
301
51k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
PRO
23
1.5k
Imperfection Machines: The Place of Print at Facebook
scottboms
269
13k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
54
3k
Faster Mobile Websites
deanohume
310
31k
4 Signs Your Business is Dying
shpigford
185
22k
Scaling GitHub
holman
463
140k
Balancing Empowerment & Direction
lara
4
680
GitHub's CSS Performance
jonrohan
1032
460k
Building Better People: How to give real-time feedback that sticks.
wjessup
368
20k
How STYLIGHT went responsive
nonsquared
100
5.8k
Music & Morning Musume
bryan
46
6.8k
Transcript
None
None
None
None
None
None
None
None
None
None
None
None
None
◼ ◼ ◼ ◼
◼ ◼ ◼ ◼
None
None
None
None
None
None
None
None
None
None
None
None
None
◼ ◼
◼ ◼ ◼
None
None
◼ ◼ ◼
◼
None
◼ ◼
None
None
◼ ◼ ◼ ◼
None
None
None
None
◼ ◼
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
/* 省略 */ public class UserHeadRotation : MonoBehaviour { //
オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { } }
/* 省略 */ public class UserHeadRotation : MonoBehaviour { //
オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る // 上下キーの入力を受け取る // X軸とY軸を回転させる } }
/* 省略 */ public class UserHeadRotation : MonoBehaviour { //
オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る // 上下キーの入力を受け取る // X軸とY軸を回転させる } }
None
/* 省略 */ public class UserHeadRotation : MonoBehaviour { //
オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る // X軸とY軸を回転させる } }
/* 省略 */ public class UserHeadRotation : MonoBehaviour { //
オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る // X軸とY軸を回転させる } }
None
/* 省略 */ public class UserHeadRotation : MonoBehaviour { //
オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る float x = Input.GetAxis("Vertical") * -1; // X軸とY軸を回転させる } }
/* 省略 */ public class UserHeadRotation : MonoBehaviour { //
オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る float x = Input.GetAxis("Vertical") * -1; // X軸とY軸を回転させる } }
/* 省略 */ public class UserHeadRotation : MonoBehaviour { //
オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る float x = Input.GetAxis("Vertical") * -1; // X軸とY軸を回転させる transform.Rotate(x, y, 0); } }
/* 省略 */ public class UserHeadRotation : MonoBehaviour { //
オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る float x = Input.GetAxis("Vertical") * -1; // X軸とY軸を回転させる transform.Rotate(x, y, 0); } }
/* 省略 */ public class UserHeadRotation : MonoBehaviour { //
オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start () { } // フレームが更新される度に呼ばれる関数 void Update () { // 左右キーの入力を受け取る float y = Input.GetAxis("Horizontal"); // 上下キーの入力を受け取る float x = Input.GetAxis("Vertical") * -1; // X軸とY軸を回転させる transform.Rotate(x, y, 0); } }
◼ ◼
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
◼ ◼ ◼
None
None
None
None
None
None
None
None
None
None
None
None
None
◼ ◼
None
None
None
◼ ◼
◼ ◼
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
◼ ◼
None
None
◼ ◼
None
None
None
None
None
None
None
None
None
◼ ◼
None
None
None
◼ ◼
None
None
◼ ◼
None
None
None
#region PUBLIC_MEMBER_VARIABLES static public bool isFullScreenMode = true; public GameObject[]
AROnlyObjects; public GameObject[] VROnlyObjects; [Range(0.1f, 5.0f)] public float transitionDuration = 1.5f; // seconds public Canvas StereoViewDivider; public Animator m_Astronaut, m_Drone; public bool InAR { get { return mTransitionCursor <= 0.66f; } } #endregion PUBLIC_MEMBER_VARIABLES
#region PUBLIC_MEMBER_VARIABLES static public bool isFullScreenMode = true; public GameObject[]
AROnlyObjects; public GameObject[] VROnlyObjects; [Range(0.1f, 5.0f)] public float transitionDuration = 1.5f; // seconds public Canvas StereoViewDivider; public Animator m_Astronaut, m_Drone; public bool InAR { get { return mTransitionCursor <= 0.66f; } } #endregion PUBLIC_MEMBER_VARIABLES
void UpdateVisibleObjects() { foreach (var go in VROnlyObjects) { go.SetActive(!InAR);
} // Start Astronaut and Drone animations in VR mode if (!InAR) { if (m_Astronaut) { m_Astronaut.SetBool("IsDrilling", !InAR); } if (m_Drone != null) { m_Drone.SetBool("IsScanning", !InAR); m_Drone.SetBool("IsShowingLaser", !InAR); m_Drone.SetBool("IsFacingObject", !InAR); } } }
void UpdateVisibleObjects() { foreach (var go in VROnlyObjects) { go.SetActive(!InAR);
} // Start Astronaut and Drone animations in VR mode if (!InAR) { if (m_Astronaut) { m_Astronaut.SetBool("IsDrilling", !InAR); } if (m_Drone != null) { m_Drone.SetBool("IsScanning", !InAR); m_Drone.SetBool("IsShowingLaser", !InAR); m_Drone.SetBool("IsFacingObject", !InAR); } } }
◼ ◼
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
None
◼ ◼
None
None
None
None
None
None
None
None
None
None
None
None
None
None
/* 省略 */ public class SceneControllerScript : MonoBehaviour { /*
省略 */ public void OnAssembleButton() { pt = 0f; panelFlag = !panelFlag; } // ドアを開ける関数 // ドアを閉める関数 }
/* 省略 */ public class SceneControllerScript : MonoBehaviour { /*
省略 */ public void OnAssembleButton() { pt = 0f; panelFlag = !panelFlag; } // ドアを開ける関数 public void OpenDoor () { dt = 0f; doorFlag = true; } // ドアを閉める関数 public void CloseDoor () { dt = 1f; doorFlag = false; } }
None
None
None
None
None
None
#region PRIVATE_MEMBER_VARIABLES float mFocusedTime; bool mTriggered; TransitionManager mTransitionManager; Transform cameraTransform;
#endregion // PRIVATE_MEMBER_VARIABLES /* 省略 */ // オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start() { cameraTransform = Camera.main.transform; mTransitionManager = FindObjectOfType<TransitionManager>(); GetComponent<Renderer>().material = nonFocusedMaterial; }
#region PRIVATE_MEMBER_VARIABLES float mFocusedTime; bool mTriggered; TransitionManager mTransitionManager; Transform cameraTransform;
SceneControllerScript danbocchi; #endregion // PRIVATE_MEMBER_VARIABLES /* 省略 */ // オブジェクトが有効になった時に1度だけ呼ばれる関数 void Start() { cameraTransform = Camera.main.transform; mTransitionManager = FindObjectOfType<TransitionManager>(); GetComponent<Renderer>().material = nonFocusedMaterial; danbocchi = GetComponent<SceneControllerScript>(); }
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; danbocchi.OpenDoor(); // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
◼ ◼
None
None
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; danbocchi.OpenDoor(); // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
#region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */
} private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
#region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */
} private IEnumerator TransitionXRMode() { // ドアを開く // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
#region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */
} private IEnumerator TransitionXRMode() { // ドアを開く // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
#region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */
} private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
#region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */
} private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
#region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */
} private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
#region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */
} private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) // AR←→VRの移行 bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
#region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */
} private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) yield return new WaitForSeconds(1.0f); // AR←→VRの移行 bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; danbocchi.OpenDoor(); // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; danbocchi.OpenDoor(); // Activate transition from AR to VR or vice versa bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); }
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // AR←→VR移行をコルーチンとして呼び出す }
// フレームが更新される度に呼ばれる関数 void Update() { /* 省略 */ if (Focused)
{ // Update the "focused state" time mFocusedTime += Time.deltaTime; if ((mFocusedTime > activationTime) || startAction) { mTriggered = true; mFocusedTime = 0; // AR←→VR移行をコルーチンとして呼び出す StartCoroutine(TransitionXRMode()); }
◼ ◼
None
None
#region PRIVATE_METHODS private void UpdateMaterials(bool focused) { /* 省略 */
} private IEnumerator TransitionXRMode() { // ドアを開く danbocchi.OpenDoor(); // ドアが開くまで待つ(1秒待機) yield return new WaitForSeconds(1.0f); // AR←→VRの移行 bool goingBackToAR = (triggerType == TriggerType.AR_TRIGGER); mTransitionManager.Play(goingBackToAR); StartCoroutine( ResetAfter(0.3f * mTransitionManager.transitionDuration) ); } private IEnumerator ResetAfter(float seconds) { /* 省略 */ } #endregion // PRIVATE_METHODS
private IEnumerator ResetAfter(float seconds) { Debug.Log("Resetting View trigger after: "
+ seconds); yield return new WaitForSeconds(seconds); Debug.Log("Resetting View trigger: " + name); // Reset variables mTriggered = false; mFocusedTime = 0; Focused = false; UpdateMaterials(false); }
private IEnumerator ResetAfter(float seconds) { Debug.Log("Resetting View trigger after: "
+ seconds); yield return new WaitForSeconds(seconds); Debug.Log("Resetting View trigger: " + name); // ドアを閉じる // Reset variables mTriggered = false; mFocusedTime = 0; Focused = false; UpdateMaterials(false); }
private IEnumerator ResetAfter(float seconds) { Debug.Log("Resetting View trigger after: "
+ seconds); yield return new WaitForSeconds(seconds); Debug.Log("Resetting View trigger: " + name); // ドアを閉じる danbocchi.CloseDoor(); // Reset variables mTriggered = false; mFocusedTime = 0; Focused = false; UpdateMaterials(false); }
◼ ◼
None
None
None
None
◼ ◼
None
None
None
None
None
None
None
/* 省略 */ public class SceneControllerScript : MonoBehaviour { /*
省略 */ public void OnAssembleButton() { pt = 0f; panelFlag = !panelFlag; } // ドアを開ける関数 public void OpenDoor () { dt = 0f; doorFlag = true; } // ドアを閉める関数 public void CloseDoor () { dt = 1f; doorFlag = false; } }
/* 省略 */ public class SceneControllerScript : MonoBehaviour { /*
省略 */ public void OnAssembleButton() { pt = 0f; panelFlag = !panelFlag; } // ドアを開ける関数 public void OpenDoor () { dt = 0f; doorFlag = true; GetComponent<AudioSource>().Play(); } // ドアを閉める関数 public void CloseDoor () { dt = 1f; doorFlag = false; } }
◼ ◼
None
None
None
◼ ◼ ◼ ◼
None
None
None
None
◼ ◼
None
None
None
None
None
None
None
None
◼ ◼
◼ ◼ ◼
None
◼ ◼
None
None
None
None
None
None
None
None
None
◼ ◼
None
None
◼ ◼ ◼