Membuat dan mengedit anchor secara terprogram di Geospatial Creator di Unity

Panduan ini menjelaskan cara menggunakan Geospatial Creator untuk menulis skrip C# untuk menyelesaikan tugas umum dengan cepat seperti membuat dan memindahkan Objek ARGeospatialCreatorAnchor dalam mode Edit Unity. Hal ini dapat bermanfaat untuk membuat beberapa anchor dari daftar yang ditentukan sebelumnya seperti spreadsheet atau KML .

Geospatial Creator di Unity memungkinkan Anda melihat pratinjau konten Geospasial di Unity Editor. Panduan Memulai kami memperkenalkan Geospatial Creator dan menjelaskan cara membuat Pengalaman AR berkemampuan geospasial dengan pemrograman minimal, menggunakan Unity UI Editor. Untuk project yang lebih kompleks, Anda dapat membuat dan memanipulasi Geospatial Creator GameObjects secara terprogram, bukan menggunakan Unity UI Editor.

Panduan ini mengasumsikan bahwa Anda telah memahami konsep dasar Geospatial Creator diperkenalkan di Panduan Memulai, dan Anda siap untuk mulai menambahkan Geospasial Kreator mengarahkan ke sebuah adegan. Anda harus mengaktifkan Geospatial Creator dan dengan kunci API Anda, serta objek sesi AR awal di latar depan. Jika memulai dari awal, ikuti panduan Memulai dan termasuk opsi "Enable Geospatial Kreator" sebelum melanjutkan.

Memulai

Untuk contoh ini, misalkan Anda memiliki sekumpulan lokasi yang diketahui di sekitar Balai Kota di San Francisco, California, AS, tempat Anda ingin menempatkan konten AR. Anda akan perlu membuat objek anchor di setiap lokasi ini, lalu geometri ke anchor tersebut.

Agar dapat membuat anchor, Anda harus menentukan ARGeospatialCreatorOrigin, yang merupakan titik referensi untuk mengonversi lintang, bujur, dan ketinggian ke dan dari koordinat dunia Unity. Origin juga akan berisi subkomponen CesiumGeoreference dan Objek turunan Cesium3DTileset, yang memungkinkan Cesium merender area sekitarnya area dalam tampilan Scene pada editor Unity. Untuk itu, Anda membutuhkan Google Maps Kunci Tiles API seperti yang dijelaskan dalam Panduan Memulai

Membuat Origin

API untuk Geospatial Creator menyertakan metode factory untuk membuat ARGeospatialCreatorOrigin di scene dan tambahkan komponen Cesium yang diperlukan. Kode berikut membuat tempat asal di lintang, bujur, dan ketinggian, dan menggunakan kunci Map Tiles API yang diberikan:

ARGeospatialCreatorOrigin origin =
  GeospatialCreatorCesiumAdapter.CreateOriginWithCesiumGeoreference(
    37.77954, -122.417581, 0.0, "<MAP_TILES_KEY>");

Secara default, objek ini ditempatkan di (0, 0, 0) dalam koordinat dunia Unity, yang bekerja dengan baik untuk contoh ini.

Mendapatkan Referensi ARAnchorManager

ARAnchorManager diperlukan untuk me-resolve anchor geospasial saat runtime, sehingga Anda juga memerlukan referensi ke ARAnchorManager di scene. Jika Anda memulai dengan aplikasi Geospatial Sample yang dipaketkan dengan Ekstensi ARCore, yaitu Anchor Pengelola dilampirkan ke "Asal Sesi AR" GameObject. Dengan asumsi Anda memiliki dengan hanya satu pengelola anchor di adegan, Anda bisa mendapatkan referensi ini:

ARAnchorManager anchorManager =
    Resources.FindObjectsOfTypeAll<ARAnchorManager>()[0];

Setelah memiliki origin dan pengelola anchor, Anda dapat mulai membuat Objek ARGeospatialCreatorAnchor.

Membuat Anchor Medan

Pertimbangkan array dua dimensi dari nilai double berikut, yang merepresentasikan garis lintang dan garis bujur yang tepat di tiga titik menghadap ke timur Balai Kota di San Francisco, California, AS:

double[,] _cityHallEastPoints = {
    { 37.77936, -122.418617 }, // in front of city hall
    { 37.77965, -122.418680 }, // right of city hall
    { 37.77917, -122.418577 }}; // left of city hall

Misalkan Anda ingin menempatkan kubus berukuran satu meter di setiap lokasi ini, di permukaan dalam aplikasi AR. Kode berikut membuat ARGeospatialCreatorAnchor objek dan menetapkan propertinya ke nilai yang sesuai:

for (int i = 0; i < _cityHallEastPoints.GetLength(0); i++)
{
  ARGeospatialCreatorAnchor anchor =
    new GameObject("City Hall " + i).AddComponent<ARGeospatialCreatorAnchor>();
  anchor.Origin = origin;
  anchor.AnchorManager = anchorManager;
  anchor.Latitude = _cityHallEastPoints[i, 0];
  anchor.Longitude = _cityHallEastPoints[i, 1];
  anchor.AltitudeType = AnchorAltitudeType.Terrain;

  GameObject cube = GameObject.CreatePrimitive(PrimitiveType.Cube);
  cube.transform.parent = anchor.transform;
}

Tindakan ini akan membuat anchor medan di setiap titik. Geospatial Creator secara otomatis menempatkan anchor pada koordinat dunia Unity yang sesuai, dengan menghitung lokasi relatif terhadap objek ARGeospatialCreatorOrigin. Untuk menyesuaikan ketinggian anchor medan, tetapkan properti Altitude dalam meter di atas atau di bawah permukaan medan.

Saat runtime, anchor medan akan diselesaikan di permukaan tanah untuk aplikasi yang sedang berjalan, disesuaikan dengan properti Altitude. Namun, dalam tampilan scene Editor, merender pada ketinggian WGS84 0 secara default, tidak relatif terhadap ubin 3D geometri. Ini sering kali bukan di tempat yang Anda inginkan, jadi Anda dapat mengganti ketinggian default anchor dalam tampilan scene Editor dengan menyetel UseEditorAltitudeOverride ke true dan menentukan ketinggian dalam WGS84 meter menggunakan properti EditorAltitudeOverride:

anchor.UseEditorAltitudeOverride = true;
anchor.EditorAltitudeOverride = -13.5; // WGS84 altitude at ground level for City Hall plaza

Kedua properti ini tidak berpengaruh di luar mode Editor dan tidak dikompilasi ke dalam aplikasi yang sedang berjalan.

Gambar Geospasial di City Hall Plaza

Membuat anchor atap

Untuk anchor kita berikutnya, misalnya Anda ingin menempatkan anchor di atap Kota Aula. Anchor dapat dibuat dengan cara yang sama persis, kecuali dengan AltitudeType disetel ke AnchorAltitudeType.Rooftop:

ARGeospatialCreatorAnchor cityHallRoofAnchor =
  new GameObject("City Hall Roof").AddComponent<ARGeospatialCreatorAnchor>();
cityHallRoofAnchor.Origin = origin;
cityHallRoofAnchor.AnchorManager = anchorManager;
cityHallRoofAnchor.Latitude = 37.77959;
cityHallRoofAnchor.Longitude = -122.419006;
cityHallRoofAnchor.AltitudeType = AnchorAltitudeType.Rooftop;

GameObject roofCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
roofCube.transform.parent = cityHallRoofAnchor.transform;

Mirip dengan angkur medan, Anda dapat mengatur ketinggian atap anchor di tampilan scene Editor menggunakan UseEditorAltitudeOverride dan Properti EditorAltitudeOverride. Untuk contoh ini, ketinggian WGS84 panjang atap sekitar 10,7 meter.

Anchor Geospasial di atap

Membuat anchor pada ketinggian tertentu

Jangkar terakhir kita akan ditempatkan di bagian paling atas kubah Balai Kota. Sebagai anchor ini, ketinggian yang akurat tersebut penting, jadi Anda akan menyetelnya secara eksplisit dengan menggunakan anchor WGS84, bukan anchor medan atau atap:

ARGeospatialCreatorAnchor cityHallDomeAnchor =
  new GameObject("City Hall Dome").AddComponent<ARGeospatialCreatorAnchor>();
cityHallDomeAnchor.Origin = origin;
cityHallDomeAnchor.AnchorManager = anchorManager;
cityHallDomeAnchor.Latitude = 37.77928;
cityHallDomeAnchor.Longitude = -122.419241;
cityHallDomeAnchor.AltitudeType = AnchorAltitudeType.WGS84;
cityHallDomeAnchor.Altitude = 73;

GameObject domeCube = GameObject.CreatePrimitive(PrimitiveType.Cube);
domeCube.transform.parent = cityHallDomeAnchor.transform;

Tidak perlu menggunakan penggantian ketinggian khusus editor, karena ketinggian yang ditentukan berdasarkan WGS84. Tentu saja, jika tinggi Ubin Peta geometri di editor ternyata salah dibandingkan dengan yang ada di dunia nyata, Anda masih dapat menggunakan penggantian editor untuk memosisikan ulang anchor dalam adegan {i>view<i}.

Anchor Geospasial di kubah