Bagikan melalui


Sistem koordinat di Unity

Windows Mixed Reality mendukung aplikasi di berbagai skala pengalaman, dari aplikasi khusus orientasi dan skala duduk melalui aplikasi skala kamar. Di HoloLens, Anda dapat melangkah lebih jauh dan membangun aplikasi skala dunia yang memungkinkan pengguna berjalan melebihi 5 meter, menjelajahi seluruh lantai gedung dan seterusnya.

Langkah pertama Anda dalam membangun pengalaman realitas campuran di Unity adalah memahami sistem koordinat dan memilih skala pengalaman yang akan ditargetkan aplikasi Anda.

Membangun pengalaman orientasi-saja atau berskala duduk

Namespace: UnityEngine.XR
Jenis: XRDevice

Untuk membangun pengalaman skala orientasi-saja atau seated, Anda perlu mengatur Unity ke jenis ruang pelacakan stasioner. Ruang pelacakan stasioner mengatur sistem koordinat dunia Unity untuk melacak bingkai referensi stasioner. Dalam mode Pelacakan stasioner, konten yang ditempatkan di editor tepat di depan lokasi default kamera (forward is -Z) akan muncul di depan pengguna saat aplikasi diluncurkan.

XRDevice.SetTrackingSpaceType(TrackingSpaceType.Stationary);

Namespace: UnityEngine.XR
Jenis: InputTracking

Untuk pengalaman orientasi murni saja seperti penampil video 360 derajat (di mana pembaruan kepala posisional akan merusak ilusi), Anda kemudian dapat mengatur XR. InputTracking.disablePositionalTracking ke true:

InputTracking.disablePositionalTracking = true;

Untuk pengalaman skala duduk, untuk membiarkan pengguna kemudian memberi tahu pengguna asal yang duduk, Anda dapat memanggil XR. Metode InputTracking.Recenter:

InputTracking.Recenter();

Membangun pengalaman skala berdiri atau skala kamar

Namespace: UnityEngine.XR
Jenis: XRDevice

Untuk pengalaman skala berdiri atau skala kamar, Anda harus menempatkan konten relatif terhadap lantai. Alasan Anda tentang lantai pengguna menggunakan tahap spasial, yang mewakili asal tingkat lantai dan batas ruang opsional yang ditentukan pengguna, disiapkan selama eksekusi pertama.

Untuk memastikan bahwa Unity beroperasi dengan sistem koordinat dunianya di tingkat lantai, Anda dapat mengatur dan menguji bahwa Unity menggunakan jenis ruang pelacakan RoomScale:

if (XRDevice.SetTrackingSpaceType(TrackingSpaceType.RoomScale))
{
    // RoomScale mode was set successfully.  App can now assume that y=0 in Unity world coordinate represents the floor.
}
else
{
    // RoomScale mode was not set successfully.  App cannot make assumptions about where the floor plane is.
}
  • Jika SetTrackingSpaceType mengembalikan true, Unity telah berhasil mengalihkan sistem koordinat dunianya untuk melacak bingkai tahap referensi.
  • Jika SetTrackingSpaceType mengembalikan false, Unity tidak dapat beralih ke bingkai tahap referensi, kemungkinan karena pengguna belum menyiapkan lantai di lingkungan mereka. Meskipun nilai pengembalian palsu tidak umum, itu dapat terjadi jika tahap disiapkan di ruang yang berbeda dan perangkat dipindahkan ke ruang saat ini tanpa pengguna menyiapkan tahap baru.

Setelah aplikasi Anda berhasil mengatur jenis ruang pelacakan RoomScale, konten yang ditempatkan di bidang y=0 akan muncul di lantai. Asal pada 0, 0, 0 akan menjadi tempat khusus di lantai tempat pengguna berdiri selama pengaturan kamar, dengan -Z mewakili arah ke depan yang mereka hadapi selama pengaturan.

Namespace: UnityEngine.Experimental.XR
Jenis: Batas

Dalam kode skrip, Anda kemudian dapat memanggil metode TryGetGeometry pada jenis UnityEngine.Experimental.XR.Boundary untuk mendapatkan poligon batas, menentukan jenis batas TrackedArea. Jika pengguna menentukan batas (Anda mendapatkan kembali daftar simpul), aman untuk memberikan pengalaman skala kamar kepada pengguna, di mana mereka dapat berjalan di sekitar adegan yang Anda buat.

Catatan

Sistem akan secara otomatis merender batas ketika pengguna mendekatinya. Aplikasi Anda tidak perlu menggunakan poligon ini untuk merender batas itu sendiri. Namun, Anda dapat memilih untuk menjabarkan objek adegan Anda menggunakan poligon batas ini, untuk memastikan pengguna dapat secara fisik menjangkau objek tersebut tanpa teleportasi:

var vertices = new List<Vector3>();
if (UnityEngine.Experimental.XR.Boundary.TryGetGeometry(vertices, Boundary.Type.TrackedArea))
{
    // Lay out your app's content within the boundary polygon, to ensure that users can reach it without teleporting.
}

Membangun pengalaman berskala dunia

Namespace: UnityEngine.XR.WSA
Jenis: WorldAnchor

Untuk pengalaman berskala dunia sejati di HoloLens yang memungkinkan pengguna berkeliaran melebihi 5 meter, Anda memerlukan teknik baru di luar yang digunakan untuk pengalaman skala kamar. Salah satu teknik utama yang akan Anda gunakan adalah membuat jangkar spasial untuk mengunci kluster hologram tepatnya di tempat di dunia fisik, tidak peduli seberapa jauh pengguna telah menjelajah, dan kemudian menemukan hologram tersebut lagi di sesi selanjutnya.

Di Unity, Anda membuat jangkar spasial dengan menambahkan komponen WorldAnchor Unity ke GameObject.

Menambahkan Jangkar Dunia

Untuk menambahkan jangkar dunia, panggil AddComponent<WorldAnchor>() pada objek game dengan transformasi yang ingin Anda jangkar di dunia nyata.

WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Itu saja! Objek game ini sekarang akan berlabuh ke lokasinya saat ini di dunia fisik - Anda mungkin melihat koordinat dunia Unity-nya menyesuaikan sedikit dari waktu ke waktu untuk memastikan bahwa keselarasan fisik. Gunakan persistensi untuk menemukan lokasi berlabuh ini lagi di sesi aplikasi mendatang.

Menghapus Jangkar Dunia

Jika Anda tidak lagi ingin GameObject dikunci ke lokasi dunia fisik dan tidak berniat memindahkannya bingkai ini, maka Anda hanya dapat memanggil Destroy pada komponen World Anchor.

Destroy(gameObject.GetComponent<WorldAnchor>());

Jika Anda ingin memindahkan GameObject bingkai ini, Anda perlu memanggil DestroyImmediate sebagai gantinya.

DestroyImmediate(gameObject.GetComponent<WorldAnchor>());

Memindahkan World Anchored GameObject

GameObject tidak dapat dipindahkan saat World Anchor berada di dalamnya. Jika Anda perlu memindahkan bingkai GameObject ini, Anda perlu:

  1. DestroyImmediate komponen World Anchor
  2. Memindahkan GameObject
  3. Tambahkan komponen World Anchor baru ke GameObject.
DestroyImmediate(gameObject.GetComponent<WorldAnchor>());
gameObject.transform.position = new Vector3(0, 0, 2);
WorldAnchor anchor = gameObject.AddComponent<WorldAnchor>();

Menangani Perubahan Ketercarian

WorldAnchor mungkin tidak dapat dilokalkan di dunia fisik pada titik waktu tertentu. Jika itu terjadi, Unity tidak akan memperbarui transformasi objek berlabuh. Ini juga dapat berubah saat aplikasi sedang berjalan. Kegagalan untuk menangani perubahan ketercarian akan menyebabkan objek tidak muncul di lokasi fisik yang benar di dunia.

Untuk diberi tahu tentang perubahan ketercarian:

  1. Berlangganan peristiwa OnTrackingChanged
  2. Menangani peristiwa

Peristiwa OnTrackingChanged akan dipanggil setiap kali jangkar spasial yang mendasarinya berubah antara keadaan dapat dilokalkan vs. tidak dapat di-locatable.

anchor.OnTrackingChanged += Anchor_OnTrackingChanged;

Kemudian tangani peristiwa:

private void Anchor_OnTrackingChanged(WorldAnchor self, bool located)
{
    // This simply activates/deactivates this object and all children when tracking changes
    self.gameObject.SetActiveRecursively(located);
}

Terkadang jangkar segera ditemukan. Dalam hal ini, properti jangkar isLocated ini akan diatur ke true saat AddComponent<WorldAnchor>() kembali. Akibatnya, peristiwa OnTrackingChanged tidak akan dipicu. Pola bersih adalah memanggil handler OnTrackingChanged Anda dengan status IsLocated awal setelah melampirkan jangkar.

Anchor_OnTrackingChanged(anchor, anchor.isLocated);

Berbagi jangkar di seluruh perangkat

Gunakan Azure Spatial Anchors untuk membuat jangkar cloud tahan lama dari WorldAnchor lokal, yang kemudian dapat ditemukan aplikasi Anda di beberapa perangkat HoloLens, iOS, dan Android. Dengan berbagi jangkar spasial umum di beberapa perangkat, setiap pengguna dapat melihat konten yang dirender relatif terhadap jangkar tersebut di lokasi fisik yang sama. Ini memungkinkan pengalaman bersama real-time.

Untuk mulai membangun pengalaman bersama di Unity, cobalah mulai cepat Azure Spatial Anchors Unity 5 menit.

Setelah aktif dan berjalan dengan Azure Spatial Anchors, Anda kemudian dapat membuat dan menemukan jangkar di Unity.

Titik Pemeriksaan Pengembangan Berikutnya

Jika Anda mengikuti perjalanan titik pemeriksaan pengembangan Unity yang telah kami susun, Anda berada di tengah-tengah menjelajahi blok penyusun inti Mixed Reality. Dari sini, Anda dapat melanjutkan ke blok penyusun berikutnya:

Atau lompat ke kemampuan dan API platform Mixed Reality:

Anda selalu dapat kembali ke titik pemeriksaan pengembangan Unity kapan saja.

Lihat Juga