Anchor geospasial adalah jenis anchor yang memungkinkan Anda menempatkan konten 3D di dunia nyata.
Jenis anchor Geospasial
Ada tiga jenis anchor Geospasial, yang masing-masing menangani ketinggian dengan cara yang berbeda:
Anchor WGS84:
Anchor WGS84 memungkinkan Anda menempatkan konten 3D pada lintang, bujur, dan ketinggian tertentu.Anchor medan:
Anchor medan memungkinkan Anda menempatkan konten hanya menggunakan lintang dan bujur dengan tinggi yang relatif terhadap medan di posisi tersebut. Ketinggian ditentukan relatif terhadap tanah atau lantai seperti yang diketahui oleh VPS.Anchor atap:
Anchor atap memungkinkan Anda menempatkan konten hanya menggunakan lintang dan bujur dengan tinggi yang relatif terhadap atap gedung di posisi tersebut. Ketinggian ditentukan relatif terhadap bagian atas bangunan seperti yang diketahui oleh Streetscape Geometry. Nilai ini akan ditetapkan secara default ke ketinggian medan jika tidak ditempatkan di bangunan.
WGS84 | Medan | Atap | |
---|---|---|---|
Posisi Horizontal | Lintang, Bujur | Lintang, Bujur | Lintang, Bujur |
Posisi Vertikal | Relatif terhadap ketinggian WGS84 | Relatif terhadap tingkat medan yang ditentukan oleh Google Maps | Relatif terhadap tingkat atap yang ditentukan oleh Google Maps |
Perlu di-resolve server? | Tidak | Ya | Ya |
Prasyarat
Pastikan Anda mengaktifkan Geospatial API sebelum melanjutkan.
Menempatkan anchor Geospasial
Setiap jenis anchor memiliki API khusus untuk membuatnya; lihat Jenis anchor Geospasial untuk mengetahui informasi selengkapnya.
Membuat anchor dari hit-test
Anda juga dapat membuat anchor Geospasial dari hasil hit-test.
Gunakan Pose dari hit-test dan konversikan menjadi GeospatialPose
. Gunakan untuk menempatkan salah satu dari 3 jenis anchor yang dijelaskan.
Mendapatkan Pose Geospasial dari Pose AR
AREarthManager.Convert(Pose)
menyediakan cara tambahan untuk menentukan lintang dan bujur dengan mengonversi Pose AR menjadi Pose Geospasial.
Mendapatkan Pose AR dari Pose Geospasial
AREarthManager.Convert(GeospatialPose)
mengonversi posisi horizontal, ketinggian, dan rotasi kuadrat yang ditentukan Bumi sehubungan dengan bingkai koordinat timur-atas-selatan ke Pose AR sehubungan dengan koordinat dunia GL.
Memilih metode yang sesuai dengan kasus penggunaan Anda
Setiap metode pembuatan anchor memiliki kompromi terkait yang perlu diingat:
- Saat menggunakan Streetscape Geometry, gunakan hit-test untuk melampirkan konten ke gedung.
- Pilih anchor Terrain atau Rooftop daripada anchor WGS84 karena menggunakan nilai ketinggian yang ditentukan oleh Google Maps.
Menentukan lintang dan bujur lokasi
Ada tiga cara untuk menghitung lintang dan bujur lokasi:
- Gunakan Geospatial Creator untuk melihat dan meningkatkan dunia dengan konten 3D tanpa harus pergi ke lokasi secara fisik. Hal ini memungkinkan Anda menempatkan konten imersif 3D secara visual menggunakan peta Google di Unity Editor. Lintang, bujur, rotasi, dan ketinggian konten akan otomatis dihitung untuk Anda.
- Gunakan Google Maps
- Gunakan Google Earth. Perhatikan bahwa mendapatkan koordinat ini menggunakan Google Earth, bukan Google Maps, akan memberi Anda margin error hingga beberapa meter.
- Buka lokasi fisik
Gunakan Google Maps
Untuk mendapatkan lintang dan bujur lokasi menggunakan Google Maps:
Buka Google Maps di komputer desktop Anda.
Buka Lapisan > Lainnya.
Ubah Jenis Peta menjadi Satelit dan hapus centang pada kotak Tampilan Globe di sudut kiri bawah layar.
Tindakan ini akan memaksa perspektif 2D dan menghilangkan kemungkinan error yang dapat berasal dari tampilan 3D miring.
Pada peta, klik kanan lokasi, lalu pilih bujur/lintang untuk menyalinnya ke papan klip.
Menggunakan Google Earth
Anda dapat menghitung lintang dan bujur lokasi dari Google Earth dengan mengklik lokasi di UI dan membaca data dari detail penanda letak.
Untuk mendapatkan lintang dan bujur lokasi menggunakan Google Earth:
Buka Google Earth di komputer desktop Anda.
Buka menu tiga garis , lalu pilih Gaya Peta.
Nonaktifkan tombol Bangunan 3D.
Setelah tombol Bangunan 3D dinonaktifkan, klik ikon pin untuk menambahkan penanda lokasi di lokasi yang dipilih.
Tentukan project yang akan berisi penanda letak Anda, lalu klik Simpan.
Di kolom Judul untuk penanda letak, masukkan nama untuk penanda letak.
Klik panah kembali di panel project, lalu pilih menu Tindakan Lainnya.
Pilih Ekspor sebagai file KML dari menu.
File KLM melaporkan lintang, bujur, dan ketinggian untuk penanda letak dalam tag <coordinates>
yang dipisahkan koma, sebagai berikut:
<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>
Jangan gunakan lintang dan bujur dari tag <LookAt>
, yang menentukan posisi kamera, bukan lokasi.
Buka lokasi fisik
Anda dapat menghitung ketinggian lokasi dengan pergi ke sana secara fisik dan melakukan pengamatan lokal.
Mendapatkan kuadrat rotasi
GeospatialPose.EunRotation
mengekstrak orientasi dari Pose Geospasial dan menghasilkan kuadrat yang mewakili matriks rotasi yang mengubah vektor dari target ke sistem koordinat timur-atas-utara (EUN). X+ mengarah ke timur, Y+ mengarah ke atas menjauh dari gravitasi, dan Z+ mengarah ke utara.
Anchor WGS84
Anchor WGS84 adalah jenis anchor yang memungkinkan Anda menempatkan konten 3D pada lintang, bujur, dan ketinggian tertentu. Pose ini bergantung pada Pose, dan orientasi, untuk ditempatkan di dunia nyata. Posisi terdiri dari lintang, bujur, dan ketinggian, yang ditentukan dalam sistem koordinat WGS84. Orientasi terdiri dari rotasi kuadrona.
Ketinggian dilaporkan dalam meter di atas ellipsoid WGS84 referensi sehingga permukaan tanah tidak nol. Aplikasi Anda bertanggung jawab untuk memberikan koordinat ini untuk setiap anchor yang dibuat.
Menempatkan anchor WGS84 di dunia nyata
Menentukan ketinggian lokasi
Ada beberapa cara untuk menentukan ketinggian lokasi guna menempatkan anchor:
- Jika lokasi anchor secara fisik berada di dekat pengguna, Anda dapat menggunakan ketinggian yang mirip dengan ketinggian perangkat pengguna.
- Setelah Anda memiliki lintang dan bujur, gunakan Elevation API untuk mendapatkan elevasi berdasarkan spesifikasi EGM96. Anda harus mengonversi elevasi Maps API EGM96 ke WGS84 untuk dibandingkan dengan ketinggian
GeospatialPose
. Lihat GeoidEval yang memiliki antarmuka command line dan HTML. Maps API melaporkan lintang dan bujur sesuai dengan spesifikasi WGS84 secara default. - Anda dapat memperoleh lintang, bujur, dan ketinggian lokasi dari Google Earth. Hal ini akan memberi Anda margin error hingga beberapa meter. Gunakan lintang, bujur, dan ketinggian dari tag
<coordinates>
, bukan tag<LookAt>
, dalam file KML. - Jika anchor yang ada berada di dekat dan jika Anda tidak berada di tanjakan curam, Anda mungkin dapat menggunakan ketinggian dari
GeospatialPose
kamera tanpa menggunakan sumber lain, seperti Maps API.
Membuat anchor
Setelah Anda memiliki lintang, bujur, ketinggian, dan kuadrat rotasi, gunakan ARAnchorManagerExtensions.AddAnchor()
untuk mengaitkan konten ke koordinat geografis yang Anda tentukan.
if (earthTrackingState == TrackingState.Tracking)
{
var anchor =
AnchorManager.AddAnchor(
latitude,
longitude,
altitude,
quaternion);
var anchoredAsset = Instantiate(GeospatialAssetPrefab, anchor.transform);
}
Angkur Medan
Anchor medan adalah jenis anchor yang memungkinkan Anda menempatkan objek AR hanya menggunakan lintang dan bujur, dengan memanfaatkan informasi dari VPS untuk menemukan ketinggian yang akurat di atas tanah.
Daripada memasukkan ketinggian yang diinginkan, Anda memberikan ketinggian di atas medan. Jika nol, anchor akan sejajar dengan medan.
Menetapkan mode penemuan pesawat
Penemuan bidang bersifat opsional dan tidak diperlukan untuk menggunakan anchor. Perhatikan bahwa hanya bidang horizontal yang digunakan. Bidang horizontal akan membantu penyelarasan dinamis anchor medan di tanah.
Perhatikan bahwa anchor medan dipengaruhi oleh Horizontal
dan Horizontal | Vertical
Gunakan menu drop-down Mode Deteksi untuk menyetel mode deteksi:
Membuat anchor Terrain menggunakan Async API baru
Untuk membuat dan menempatkan anchor Terrain, panggil ARAnchorManagerExtensions.resolveAnchorOnTerrainAsync()
.
Anchor tidak akan langsung siap dan perlu di-resolve. Setelah diselesaikan, ResolveAnchorOnTerrainPromise
akan tersedia.
public GameObject TerrainAnchorPrefab;
public void Update()
{
ResolveAnchorOnTerrainPromise terrainPromise =
AnchorManager.ResolveAnchorOnTerrainAsync(
latitude, longitude, altitudeAboveTerrain, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckTerrainPromise(terrainPromise));
}
private IEnumerator CheckTerrainPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.TerrainAnchorState == TerrainAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(TerrainAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
Memeriksa Status Promise
Promise akan memiliki PromiseState
yang terkait.
Negara Bagian | Deskripsi |
---|---|
Pending |
Operasi masih tertunda. |
Done |
Operasi selesai dan hasilnya tersedia. |
Cancelled |
Operasi telah dibatalkan. |
Memeriksa status anchor Terrain dari hasil Promise
TerrainAnchorState
termasuk dalam operasi asinkron dan merupakan bagian dari hasil Promise akhir.
switch (result.TerrainAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case TerrainAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case TerrainAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case TerrainAnchorState.ErrorInternal:
// The Terrain anchor could not be resolved due to an internal error.
break;
default:
break;
}
Pengait Atap
Anchor atap adalah jenis anchor dan sangat mirip dengan Anchor medan di atas. Perbedaannya adalah Anda akan memberikan ketinggian di atas atap, bukan ketinggian di atas medan.
Membuat anchor Rooftop menggunakan Async API baru
Anchor tidak akan langsung siap dan perlu di-resolve.
Untuk membuat dan menempatkan anchor Atap, panggil ARAnchorManagerExtensions.resolveAnchorOnRooftopAsync()
. Serupa dengan anchor Terrain, Anda juga akan mengakses PromiseState
Promise. Kemudian, Anda dapat memeriksa hasil Promise untuk mengakses RooftopAnchorState
.
public GameObject RooftopAnchorPrefab;
public void Update()
{
ResolveAnchorOnRooftopPromise rooftopPromise =
AnchorManager.ResolveAnchorOnRooftopAsync(
latitude, longitude, altitudeAboveRooftop, eunRotation);
// The anchor will need to be resolved.
StartCoroutine(CheckRooftopPromise(rooftopPromise));
}
private IEnumerator CheckRooftopPromise(ResolveAnchorOnTerrainPromise promise)
{
yield return promise;
var result = promise.Result;
if (result.RooftopAnchorState == RooftopAnchorState.Success &&
result.Anchor != null)
{
// resolving anchor succeeded
GameObject anchorGO = Instantiate(RooftopAnchorPrefab,
result.Anchor.gameObject.transform);
anchorGO.transform.parent = result.Anchor.gameObject.transform;
}
else
{
// resolving anchor failed
}
yield break;
}
Memeriksa Status Promise
Promise akan memiliki PromiseState
terkait, lihat tabel di atas.
Memeriksa status anchor Rooftop dari hasil Promise
RooftopAnchorState
termasuk dalam operasi asinkron dan merupakan bagian dari hasil Promise akhir.
switch (result.RooftopAnchorState)
{
case TerrainAnchorState.Success:
// Anchor has successfully resolved
break;
case RooftopAnchorState.ErrorUnsupportedLocation:
// The requested anchor is in a location that isn't supported by the Geospatial API.
break;
case RooftopAnchorState.ErrorNotAuthorized:
// An error occurred while authorizing your app with the ARCore API. See
// https://developers.google.com/ar/reference/unity-arf/namespace/Google/XR/ARCoreExtensions#terrainanchorstate_errornotauthorized
// for troubleshooting steps.
break;
case RooftopAnchorState.ErrorInternal:
// The Rooftop anchor could not be resolved due to an internal error.
break;
default:
break;
}
Langkah berikutnya
- Pastikan Anda memahami kuota penggunaan API Geospatial.