Dasar-Dasar HoloLens (generasi ke-1) 101: Menyelesaikan proyek dengan perangkat
Penting
Tutorial Mixed Reality Academy dirancang dengan ingat HoloLens (generasi ke-1), Unity 2017, dan Mixed Reality Immersive Headsets. Dengan demikian, kami merasa penting untuk meninggalkan tutorial ini di tempat bagi pengembang yang masih mencari panduan dalam mengembangkan untuk perangkat tersebut. Tutorial ini tidak akan diperbarui dengan toolset atau interaksi terbaru yang digunakan untuk HoloLens 2 dan mungkin tidak kompatibel dengan versi Unity yang lebih baru. Mereka akan dipertahankan untuk terus bekerja pada perangkat yang didukung. Serangkaian tutorial baru telah diposting untuk HoloLens 2.
Tutorial ini akan memandu Anda melalui proyek lengkap, dibangun di Unity, yang menunjukkan fitur Windows Mixed Reality inti pada HoloLens termasuk tatapan, gerakan, input suara, suara spasial, dan pemetaan spasial.
Tutorial ini akan memakan waktu sekitar 1 jam untuk menyelesaikannya.
Dukungan perangkat
Kursus | HoloLens | Headset imersif |
---|---|---|
DASAR-Dasar MR 101: Menyelesaikan proyek dengan perangkat | ✔️ |
Sebelum memulai
Prasyarat
- PC Windows 10 dikonfigurasi dengan alat yang benar terinstal.
- Perangkat HoloLens dikonfigurasi untuk pengembangan.
File proyek
- Unduh file yang diperlukan oleh proyek. Memerlukan Unity 2017.2 atau yang lebih baru.
- Batalkan arsip file ke desktop Anda atau lokasi lain yang mudah dijangkau. Pertahankan nama folder sebagai Origami.
Catatan
Jika Anda ingin melihat melalui kode sumber sebelum mengunduh, kode tersebut tersedia di GitHub.
Bab 1 - Dunia "Holo"
Dalam bab ini, kita akan menyiapkan proyek Unity pertama kita dan menelusuri proses build dan deploy.
Tujuan
- Siapkan Unity untuk pengembangan holografik.
- Membuat hologram.
- Lihat hologram yang Anda buat.
Petunjuk
- Mulai Unity.
- Pilih Buka.
- Masukkan lokasi sebagai folder Origami yang sebelumnya tidak Anda arsipkan.
- Pilih Origami dan klik Pilih Folder.
- Karena proyek Origami tidak berisi adegan, simpan adegan default kosong ke file baru menggunakan: Simpan Adegan File / Sebagai.
- Beri nama adegan baru Origami dan tekan tombol Simpan .
Menyiapkan kamera virtual utama
- Di Panel Hierarki, pilih Kamera Utama.
- Di Inspektur atur posisi transformasinya menjadi 0,0,0.
- Temukan properti Hapus Bendera , dan ubah menu dropdown dari Skybox menjadi Warna solid.
- Klik bidang Latar Belakang untuk membuka pemilih warna.
- Atur R, G, B, dan A ke 0.
Menyiapkan adegan
- Di Panel Hierarki, klik Buat dan Buat Kosong.
- Klik kanan GameObject baru dan pilih Ganti Nama. Ganti nama GameObject menjadi OrigamiCollection.
- Dari folder Hologram di Panel Proyek (perluas Aset dan pilih Hologram atau klik dua kali folder Hologram di Panel Proyek):
- Seret Tahap ke dalam Hierarki untuk menjadi anak dari OrigamiCollection.
- Seret Sphere1 ke dalam Hierarki untuk menjadi anak dari OrigamiCollection.
- Seret Sphere2 ke dalam Hierarki untuk menjadi anak dari OrigamiCollection.
- Klik kanan objek Cahaya Arah di Panel Hierarki dan pilih Hapus.
- Dari folder Hologram , seret Lampu ke akar Panel Hierarki.
- Di Hierarki, pilih OrigamiCollection.
- Di Inspektur, atur posisi transformasi ke 0, -0,5, 2.0.
- Tekan tombol Putar di Unity untuk mempratinjau hologram Anda.
- Anda akan melihat objek Origami di jendela pratinjau.
- Tekan Putar untuk kedua kalinya untuk menghentikan mode pratinjau.
Mengekspor proyek dari Unity ke Visual Studio
Di Unity pilih Pengaturan Build File>.
Pilih Platform Windows Universal di daftar Platform dan klik Beralih Platform.
Atur SDK ke Universal 10 dan Jenis Build ke D3D.
Periksa Proyek Unity C#.
Klik Tambahkan Adegan Terbuka untuk menambahkan adegan.
Klik Bangun.
Di jendela penjelajah file yang muncul, buat Folder Baru bernama "Aplikasi".
Klik tunggal Folder Aplikasi.
Tekan Pilih Folder.
Ketika Unity selesai, jendela File Explorer akan muncul.
Buka folder Aplikasi .
Buka (klik ganda) Origami.sln.
Menggunakan toolbar atas di Visual Studio, ubah target dari Debug ke Rilis dan dari ARM ke X86.
Klik panah di samping tombol Perangkat, dan pilih Komputer Jarak Jauh untuk disebarkan melalui Wi-Fi.
- Atur Alamat ke nama atau alamat IP HoloLens Anda. Jika Anda tidak mengetahui alamat IP perangkat Anda, lihat di Pengaturan > Jaringan & Opsi Tingkat Lanjut Internet > atau tanyakan Cortana "Hey Cortana, Apa alamat IP saya?"
- Jika HoloLens dilampirkan melalui USB, Anda dapat memilih Perangkat untuk disebarkan melalui USB.
- Biarkan Mode Autentikasi diatur ke Universal.
- Klik Pilih
Klik Debug > Mulai Tanpa penelusuran kesalahan atau tekan Ctrl + F5. Jika ini pertama kalinya menyebarkan ke perangkat Anda, Anda harus memasangkannya dengan Visual Studio.
Proyek Origami sekarang akan membangun, menyebarkan ke HoloLens Anda, lalu menjalankan.
Kenakan HoloLens Anda dan lihat-lihat untuk melihat hologram baru Anda.
Bab 2 - Tatapan
Dalam bab ini, kita akan memperkenalkan yang pertama dari tiga cara berinteraksi dengan hologram Anda - tatapan.
Tujuan
- Visualisasikan tatapan Anda menggunakan kursor yang terkunci di dunia.
Petunjuk
- Kembali ke proyek Unity Anda, dan tutup jendela Pengaturan Build jika masih terbuka.
- Pilih folder Hologram di panel Proyek.
- Seret objek Kursor ke panel Hierarki di tingkat akar.
- Klik dua kali pada objek Kursor untuk melihatnya lebih dekat.
- Klik kanan pada folder Skrip di panel Proyek.
- Klik sub-menu Buat .
- Pilih Skrip C#.
- Beri nama skrip WorldCursor. Catatan: Namanya peka huruf besar/kecil. Anda tidak perlu menambahkan ekstensi .cs.
- Pilih objek Kursor di panel Hierarki.
- Seret dan letakkan skrip WorldCursor ke panel Inspektur.
- Klik dua kali skrip WorldCursor untuk membukanya di Visual Studio.
- Salin dan tempel kode ini ke WorldCursor.cs dan Simpan Semua.
using UnityEngine;
public class WorldCursor : MonoBehaviour
{
private MeshRenderer meshRenderer;
// Use this for initialization
void Start()
{
// Grab the mesh renderer that's on the same object as this script.
meshRenderer = this.gameObject.GetComponentInChildren<MeshRenderer>();
}
// Update is called once per frame
void Update()
{
// Do a raycast into the world based on the user's
// head position and orientation.
var headPosition = Camera.main.transform.position;
var gazeDirection = Camera.main.transform.forward;
RaycastHit hitInfo;
if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
{
// If the raycast hit a hologram...
// Display the cursor mesh.
meshRenderer.enabled = true;
// Move the cursor to the point where the raycast hit.
this.transform.position = hitInfo.point;
// Rotate the cursor to hug the surface of the hologram.
this.transform.rotation = Quaternion.FromToRotation(Vector3.up, hitInfo.normal);
}
else
{
// If the raycast did not hit a hologram, hide the cursor mesh.
meshRenderer.enabled = false;
}
}
}
- Bangun ulang aplikasi dari Pengaturan Build File>.
- Kembali ke solusi Visual Studio yang sebelumnya digunakan untuk menyebarkan ke HoloLens Anda.
- Pilih 'Muat Ulang Semua' saat diminta.
- Klik Debug -> Mulai Tanpa penelusuran kesalahan atau tekan Ctrl + F5.
- Sekarang lihat sekeliling adegan dan perhatikan bagaimana kursor berinteraksi dengan bentuk objek.
Bab 3 - Gerakan
Dalam bab ini, kami akan menambahkan dukungan untuk gerakan. Ketika pengguna memilih bola kertas, kita akan membuat bola jatuh dengan menyalakan gravitasi menggunakan mesin fisika Unity.
Tujuan
- Kontrol hologram Anda dengan gerakan Pilih.
Petunjuk
Kita akan mulai dengan membuat skrip lalu dapat mendeteksi gerakan Pilih.
- Di folder Skrip , buat skrip bernama GazeGestureManager.
- Seret skrip GazeGestureManager ke objek OrigamiCollection di Hierarki.
- Buka skrip GazeGestureManager di Visual Studio dan tambahkan kode berikut:
using UnityEngine;
using UnityEngine.XR.WSA.Input;
public class GazeGestureManager : MonoBehaviour
{
public static GazeGestureManager Instance { get; private set; }
// Represents the hologram that is currently being gazed at.
public GameObject FocusedObject { get; private set; }
GestureRecognizer recognizer;
// Use this for initialization
void Awake()
{
Instance = this;
// Set up a GestureRecognizer to detect Select gestures.
recognizer = new GestureRecognizer();
recognizer.Tapped += (args) =>
{
// Send an OnSelect message to the focused object and its ancestors.
if (FocusedObject != null)
{
FocusedObject.SendMessageUpwards("OnSelect", SendMessageOptions.DontRequireReceiver);
}
};
recognizer.StartCapturingGestures();
}
// Update is called once per frame
void Update()
{
// Figure out which hologram is focused this frame.
GameObject oldFocusObject = FocusedObject;
// Do a raycast into the world based on the user's
// head position and orientation.
var headPosition = Camera.main.transform.position;
var gazeDirection = Camera.main.transform.forward;
RaycastHit hitInfo;
if (Physics.Raycast(headPosition, gazeDirection, out hitInfo))
{
// If the raycast hit a hologram, use that as the focused object.
FocusedObject = hitInfo.collider.gameObject;
}
else
{
// If the raycast did not hit a hologram, clear the focused object.
FocusedObject = null;
}
// If the focused object changed this frame,
// start detecting fresh gestures again.
if (FocusedObject != oldFocusObject)
{
recognizer.CancelGestures();
recognizer.StartCapturingGestures();
}
}
}
- Buat skrip lain di folder Skrip, kali ini bernama SphereCommands.
- Perluas objek OrigamiCollection dalam tampilan Hierarki.
- Seret skrip SphereCommands ke objek Sphere1 di panel Hierarki.
- Seret skrip SphereCommands ke objek Sphere2 di panel Hierarki.
- Buka skrip di Visual Studio untuk pengeditan, dan ganti kode default dengan ini:
using UnityEngine;
public class SphereCommands : MonoBehaviour
{
// Called by GazeGestureManager when the user performs a Select gesture
void OnSelect()
{
// If the sphere has no Rigidbody component, add one to enable physics.
if (!this.GetComponent<Rigidbody>())
{
var rigidbody = this.gameObject.AddComponent<Rigidbody>();
rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
}
}
}
- Ekspor, buat, dan sebarkan aplikasi ke HoloLens Anda.
- Lihatlah salah satu bola.
- Lakukan gerakan pilih dan watch penurunan bola ke permukaan di bawah ini.
Bab 4 - Suara
Dalam bab ini, kita akan menambahkan dukungan untuk dua perintah suara: "Reset dunia" untuk mengembalikan bola yang dijatuhkan ke lokasi aslinya, dan "Jatuhkan bola" untuk membuat bola jatuh.
Tujuan
- Tambahkan perintah suara yang selalu mendengarkan di latar belakang.
- Buat hologram yang bereaksi terhadap perintah suara.
Petunjuk
- Di folder Skrip , buat skrip bernama SpeechManager.
- Seret skrip SpeechManager ke objek OrigamiCollection di Hierarki
- Buka skrip SpeechManager di Visual Studio.
- Salin dan tempel kode ini ke SpeechManager.cs dan Simpan Semua:
using System.Collections.Generic;
using System.Linq;
using UnityEngine;
using UnityEngine.Windows.Speech;
public class SpeechManager : MonoBehaviour
{
KeywordRecognizer keywordRecognizer = null;
Dictionary<string, System.Action> keywords = new Dictionary<string, System.Action>();
// Use this for initialization
void Start()
{
keywords.Add("Reset world", () =>
{
// Call the OnReset method on every descendant object.
this.BroadcastMessage("OnReset");
});
keywords.Add("Drop Sphere", () =>
{
var focusObject = GazeGestureManager.Instance.FocusedObject;
if (focusObject != null)
{
// Call the OnDrop method on just the focused object.
focusObject.SendMessage("OnDrop", SendMessageOptions.DontRequireReceiver);
}
});
// Tell the KeywordRecognizer about our keywords.
keywordRecognizer = new KeywordRecognizer(keywords.Keys.ToArray());
// Register a callback for the KeywordRecognizer and start recognizing!
keywordRecognizer.OnPhraseRecognized += KeywordRecognizer_OnPhraseRecognized;
keywordRecognizer.Start();
}
private void KeywordRecognizer_OnPhraseRecognized(PhraseRecognizedEventArgs args)
{
System.Action keywordAction;
if (keywords.TryGetValue(args.text, out keywordAction))
{
keywordAction.Invoke();
}
}
}
- Buka skrip SphereCommands di Visual Studio.
- Perbarui skrip untuk dibaca sebagai berikut:
using UnityEngine;
public class SphereCommands : MonoBehaviour
{
Vector3 originalPosition;
// Use this for initialization
void Start()
{
// Grab the original local position of the sphere when the app starts.
originalPosition = this.transform.localPosition;
}
// Called by GazeGestureManager when the user performs a Select gesture
void OnSelect()
{
// If the sphere has no Rigidbody component, add one to enable physics.
if (!this.GetComponent<Rigidbody>())
{
var rigidbody = this.gameObject.AddComponent<Rigidbody>();
rigidbody.collisionDetectionMode = CollisionDetectionMode.Continuous;
}
}
// Called by SpeechManager when the user says the "Reset world" command
void OnReset()
{
// If the sphere has a Rigidbody component, remove it to disable physics.
var rigidbody = this.GetComponent<Rigidbody>();
if (rigidbody != null)
{
rigidbody.isKinematic = true;
Destroy(rigidbody);
}
// Put the sphere back into its original local position.
this.transform.localPosition = originalPosition;
}
// Called by SpeechManager when the user says the "Drop sphere" command
void OnDrop()
{
// Just do the same logic as a Select gesture.
OnSelect();
}
}
- Ekspor, buat, dan sebarkan aplikasi ke HoloLens Anda.
- Lihat salah satu bola, dan katakan "Drop Sphere".
- Katakan "Reset Dunia" untuk membawa mereka kembali ke posisi awal mereka.
Bab 5 - Suara spasial
Dalam bab ini, kita akan menambahkan musik ke aplikasi, lalu memicu efek suara pada tindakan tertentu. Kita akan menggunakan suara spasial untuk memberikan suara lokasi tertentu di ruang 3D.
Tujuan
- Dengarkan hologram di duniamu.
Petunjuk
- Di Unity pilih dari menu atas Edit > Audio Pengaturan > Proyek
- Di Panel Pemeriksa di sisi kanan, temukan pengaturan Plugin Spatializer dan pilih MS HRTF Spatializer.
- Dari folder Hologram di panel Proyek, seret objek Ambience ke objek OrigamiCollection di Panel Hierarki.
- Pilih OrigamiCollection dan temukan komponen Sumber Audio di panel Inspektur. Ubah properti ini:
- Periksa properti Spasialisasi .
- Periksa Play On Awake.
- Ubah Campuran Spasial menjadi 3D dengan menyeret penggeser ke kanan. Nilai harus berubah dari 0 ke 1 saat Anda memindahkan pengguncur.
- Periksa properti Perulangan .
- Perluas Pengaturan Suara 3D, dan masukkan 0.1 untuk Tingkat Doppler.
- Atur Rolloff Volume ke Rolloff Logaritmik.
- Atur Jarak Maks ke 20.
- Di folder Skrip , buat skrip bernama SphereSounds.
- Seret dan letakkan SphereSounds ke objek Sphere1 dan Sphere2 di Hierarki.
- Buka SphereSounds di Visual Studio, perbarui kode berikut dan Simpan Semua.
using UnityEngine;
public class SphereSounds : MonoBehaviour
{
AudioSource impactAudioSource = null;
AudioSource rollingAudioSource = null;
bool rolling = false;
void Start()
{
// Add an AudioSource component and set up some defaults
impactAudioSource = gameObject.AddComponent<AudioSource>();
impactAudioSource.playOnAwake = false;
impactAudioSource.spatialize = true;
impactAudioSource.spatialBlend = 1.0f;
impactAudioSource.dopplerLevel = 0.0f;
impactAudioSource.rolloffMode = AudioRolloffMode.Logarithmic;
impactAudioSource.maxDistance = 20f;
rollingAudioSource = gameObject.AddComponent<AudioSource>();
rollingAudioSource.playOnAwake = false;
rollingAudioSource.spatialize = true;
rollingAudioSource.spatialBlend = 1.0f;
rollingAudioSource.dopplerLevel = 0.0f;
rollingAudioSource.rolloffMode = AudioRolloffMode.Logarithmic;
rollingAudioSource.maxDistance = 20f;
rollingAudioSource.loop = true;
// Load the Sphere sounds from the Resources folder
impactAudioSource.clip = Resources.Load<AudioClip>("Impact");
rollingAudioSource.clip = Resources.Load<AudioClip>("Rolling");
}
// Occurs when this object starts colliding with another object
void OnCollisionEnter(Collision collision)
{
// Play an impact sound if the sphere impacts strongly enough.
if (collision.relativeVelocity.magnitude >= 0.1f)
{
impactAudioSource.Play();
}
}
// Occurs each frame that this object continues to collide with another object
void OnCollisionStay(Collision collision)
{
Rigidbody rigid = gameObject.GetComponent<Rigidbody>();
// Play a rolling sound if the sphere is rolling fast enough.
if (!rolling && rigid.velocity.magnitude >= 0.01f)
{
rolling = true;
rollingAudioSource.Play();
}
// Stop the rolling sound if rolling slows down.
else if (rolling && rigid.velocity.magnitude < 0.01f)
{
rolling = false;
rollingAudioSource.Stop();
}
}
// Occurs when this object stops colliding with another object
void OnCollisionExit(Collision collision)
{
// Stop the rolling sound if the object falls off and stops colliding.
if (rolling)
{
rolling = false;
impactAudioSource.Stop();
rollingAudioSource.Stop();
}
}
}
- Simpan skrip, dan kembali ke Unity.
- Ekspor, buat, dan sebarkan aplikasi ke HoloLens Anda.
- Bergerak lebih dekat dan lebih jauh dari Panggung dan berbelok berdampingan untuk mendengar suara berubah.
Bab 6 - Pemetaan spasial
Sekarang kita akan menggunakan pemetaan spasial untuk menempatkan papan permainan pada objek nyata di dunia nyata.
Tujuan
- Bawa dunia nyata Anda ke dunia virtual.
- Tempatkan hologram Anda di mana mereka sangat penting bagi Anda.
Petunjuk
- Di Unity, klik folder Hologram di panel Proyek.
- Seret aset Pemetaan Spasial ke akar Hierarki.
- Klik objek Pemetaan Spasial di Hierarki.
- Di panel Inspektur, ubah properti berikut:
- Centang kotak Gambar Jala Visual .
- Temukan Gambar Bahan dan klik lingkaran di sebelah kanan. Ketik "wireframe" ke bidang pencarian di bagian atas. Klik hasilnya lalu tutup jendela. Ketika Anda melakukan ini, nilai untuk Bahan Gambar harus diatur ke Wireframe.
- Ekspor, buat, dan sebarkan aplikasi ke HoloLens Anda.
- Ketika aplikasi berjalan, jala wireframe akan melapisi dunia nyata Anda.
- Perhatikan bagaimana bola bergulir akan jatuh dari panggung, dan ke lantai!
Sekarang kami akan menunjukkan kepada Anda cara memindahkan OrigamiCollection ke lokasi baru:
- Di folder Skrip , buat skrip bernama TapToPlaceParent.
- Dalam Hierarki, perluas OrigamiCollection dan pilih objek Tahap .
- Seret skrip TapToPlaceParent ke objek Tahap.
- Buka skrip TapToPlaceParent di Visual Studio, dan perbarui menjadi yang berikut ini:
using UnityEngine;
public class TapToPlaceParent : MonoBehaviour
{
bool placing = false;
// Called by GazeGestureManager when the user performs a Select gesture
void OnSelect()
{
// On each Select gesture, toggle whether the user is in placing mode.
placing = !placing;
// If the user is in placing mode, display the spatial mapping mesh.
if (placing)
{
SpatialMapping.Instance.DrawVisualMeshes = true;
}
// If the user is not in placing mode, hide the spatial mapping mesh.
else
{
SpatialMapping.Instance.DrawVisualMeshes = false;
}
}
// Update is called once per frame
void Update()
{
// If the user is in placing mode,
// update the placement to match the user's gaze.
if (placing)
{
// Do a raycast into the world that will only hit the Spatial Mapping mesh.
var headPosition = Camera.main.transform.position;
var gazeDirection = Camera.main.transform.forward;
RaycastHit hitInfo;
if (Physics.Raycast(headPosition, gazeDirection, out hitInfo,
30.0f, SpatialMapping.PhysicsRaycastMask))
{
// Move this object's parent object to
// where the raycast hit the Spatial Mapping mesh.
this.transform.parent.position = hitInfo.point;
// Rotate this object's parent object to face the user.
Quaternion toQuat = Camera.main.transform.localRotation;
toQuat.x = 0;
toQuat.z = 0;
this.transform.parent.rotation = toQuat;
}
}
}
}
- Ekspor, bangun, dan sebarkan aplikasi.
- Sekarang Anda sekarang dapat menempatkan permainan di lokasi tertentu dengan menatapnya, menggunakan gerakan Pilih lalu pindah ke lokasi baru, dan menggunakan gerakan Pilih lagi.
Bab 7 - Kesenangan Holografik
Tujuan
- Mengungkapkan pintu masuk ke dunia bawah holografik.
Petunjuk
Sekarang kami akan menunjukkan kepada Anda cara mengungkap underworld holografik:
- Dari folder Hologram di Panel Proyek:
- Seret Underworld ke dalam Hierarki untuk menjadi anak dari OrigamiCollection.
- Di folder Skrip , buat skrip bernama HitTarget.
- Dalam Hierarki, perluas OrigamiCollection.
- Perluas objek Tahap dan pilih objek Target (kipas biru).
- Seret skrip HitTarget ke objek Target .
- Buka skrip HitTarget di Visual Studio, dan perbarui menjadi yang berikut ini:
using UnityEngine;
public class HitTarget : MonoBehaviour
{
// These public fields become settable properties in the Unity editor.
public GameObject underworld;
public GameObject objectToHide;
// Occurs when this object starts colliding with another object
void OnCollisionEnter(Collision collision)
{
// Hide the stage and show the underworld.
objectToHide.SetActive(false);
underworld.SetActive(true);
// Disable Spatial Mapping to let the spheres enter the underworld.
SpatialMapping.Instance.MappingEnabled = false;
}
}
- Di Unity, pilih objek Target .
- Dua properti publik sekarang terlihat pada komponen Target Hit dan perlu mereferensikan objek di adegan kami:
- Seret Underworld dari panel Hierarki ke properti Underworld pada komponen Target Temuan .
- Seret Tahap dari panel Hierarki ke properti Objek untuk Menyembunyikan pada komponen Target Temuan .
- Ekspor, bangun, dan sebarkan aplikasi.
- Tempatkan Origami Collection di lantai, lalu gunakan gerakan Pilih untuk membuat penurunan bola.
- Ketika bola mengenai target (kipas biru), ledakan akan terjadi. Koleksi akan disembunyikan dan lubang ke dunia bawah akan muncul.
Akhir
Dan itulah akhir tutorial ini!
Anda belajar:
- Cara membuat aplikasi holografik di Unity.
- Cara memanfaatkan tatapan, gerakan, suara, suara, dan pemetaan spasial.
- Cara membuat dan menyebarkan aplikasi menggunakan Visual Studio.
Anda sekarang siap untuk mulai menciptakan pengalaman holografik Anda sendiri!