สร้างและแก้ไข Anchor แบบเป็นโปรแกรมใน Geospatial Creator ใน Unity

คู่มือนี้อธิบายวิธีใช้ Geospatial Creator ในการเขียนสคริปต์ C# เพื่อทำงานทั่วไปได้อย่างรวดเร็ว เช่น การสร้างและการย้าย ออบเจ็กต์ ARGeospatialCreatorAnchor รายการในโหมด Edit ของ Unity ซึ่งจะเป็นประโยชน์สำหรับ การสร้าง Anchor หลายรายการจากรายการที่กำหนดไว้ล่วงหน้า เช่น สเปรดชีตหรือ KML

ผู้สร้างภูมิสารสนเทศใน Unity ช่วยให้คุณดูตัวอย่างเนื้อหาภูมิสารสนเทศใน ตัวแก้ไข Unity คู่มือเริ่มใช้งานฉบับย่อ แนะนำ Geospatial Creator และแนะนำคุณเกี่ยวกับวิธีสร้าง ประสบการณ์ AR ที่รองรับภูมิสารสนเทศด้วยการเขียนโปรแกรมเพียงเล็กน้อยโดยใช้ Unity UI ของ Editor คุณอาจต้องสร้างและจัดการโปรเจ็กต์ขั้นสูง GameObjects ของผู้สร้างภูมิสารสนเทศแบบเป็นโปรแกรมแทนการใช้ Unity UI ของ Editor

คู่มือนี้จะถือว่าคุณคุ้นเคยกับแนวคิดพื้นฐานสำหรับครีเอเตอร์ภูมิสารสนเทศ ซึ่งเปิดตัวใน Quickstart และคุณพร้อมแล้วที่จะเริ่มเพิ่มภูมิสารสนเทศ ครีเอเตอร์นำไปยังฉาก คุณจะต้องเปิดใช้งานผู้สร้างภูมิสารสนเทศและ กำหนดค่าด้วยคีย์ API รวมทั้งออบเจ็กต์เซสชัน AR เริ่มต้นใน ด้วย หากต้องเริ่มใหม่ตั้งแต่ต้น ให้ทำตามคู่มือเริ่มใช้งานฉบับย่อและ ซึ่งรวมถึง"เปิดใช้ภูมิสารสนเทศ Creator" ก่อนดำเนินการต่อ

เริ่มต้นใช้งาน

สำหรับตัวอย่างนี้ สมมติว่าคุณมีสถานที่ที่รู้จักกันรอบศาลากลางใน ซานฟรานซิสโก แคลิฟอร์เนีย สหรัฐอเมริกา ซึ่งคุณต้องการวางเนื้อหา AR คุณจะ สร้างวัตถุยึดที่แต่ละตำแหน่งเหล่านี้ จากนั้นแนบ เรขาคณิตกับแท็ก Anchor เหล่านั้น

ก่อนที่คุณจะสร้าง Anchor คุณควรระบุ ARGeospatialCreatorOrigin ซึ่งเป็นจุดอ้างอิงสำหรับการแปลง ละติจูด ลองจิจูด และระดับความสูงไปยังและจากพิกัดโลกแบบ Unity ต้นทางจะมีคอมโพเนนต์ย่อย CesiumGeoreference และ วัตถุลูก Cesium3DTileset ซึ่งช่วยให้ซีเซียมแสดงผลรอบๆ ได้ ในมุมมองฉากของตัวแก้ไข Unity โดยต้องมี Google Maps คีย์ API ของการ์ดตามที่อธิบายไว้ใน การเริ่มต้นอย่างรวดเร็ว

สร้างต้นทาง

API สำหรับผู้สร้างภูมิสารสนเทศมีวิธีการจากโรงงานในการสร้าง ARGeospatialCreatorOrigin ในฉากและเพิ่มคอมโพเนนต์ Cesium ที่จำเป็น โค้ดต่อไปนี้สร้างต้นทางที่ละติจูด ลองจิจูด และ ระดับความสูง และการใช้คีย์ API ชิ้นส่วนแผนที่ที่กำหนด:

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

โดยค่าเริ่มต้น อ็อบเจกต์นี้จะวางอยู่ที่ (0, 0, 0) ในพิกัดโลก Unity ซึ่ง เหมาะกับตัวอย่างนี้

ดูข้อมูลอ้างอิงของ ARAnchorManager

ARAnchorManager ในการแก้ปัญหา Anchor เชิงพื้นที่ขณะรันไทม์ ต้องอ้างอิง ARAnchorManager ในฉากด้วย หากคุณเริ่มต้นด้วย แอปพลิเคชันตัวอย่างภูมิสารสนเทศที่มาพร้อมกับส่วนขยาย ARCore ซึ่งเป็นแท็ก Anchor เครื่องมือจัดการจะแนบอยู่กับ "ต้นทางเซสชัน AR" GameObject. สมมติว่าคุณมี แค่เครื่องมือจัดการแท็กเดียวในฉากของคุณ คุณก็จะได้รับการอ้างอิงถึงแท็ก เช่น ดังนี้

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

เมื่อมีต้นทางและเครื่องมือจัดการแท็ก Anchor แล้ว คุณก็เริ่มสร้าง ออบเจ็กต์ ARGeospatialCreatorAnchor รายการ

สร้างตัวยึดภูมิประเทศ

พิจารณาอาร์เรย์ 2 มิติต่อไปนี้ของค่า double โดยจะแสดง ละติจูดและลองจิจูดที่แม่นยำที่จุด 3 จุดทางฝั่งตะวันออกของ ศาลาว่าการเมืองในซานฟรานซิสโก แคลิฟอร์เนีย สหรัฐอเมริกา

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

สมมติว่าคุณต้องการวางลูกบาศก์หนึ่งเมตรที่แต่ละตำแหน่งเหล่านี้ที่พื้น ในแอปพลิเคชัน AR ของเรา โค้ดต่อไปนี้สร้าง ARGeospatialCreatorAnchor ออบเจ็กต์และกำหนดพร็อพเพอร์ตี้ให้กับออบเจ็กต์ ค่าที่เหมาะสม ได้แก่

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;
}

วิธีนี้จะสร้างตัวยึดภูมิประเทศในแต่ละจุด ผู้สร้างภูมิสารสนเทศโดยอัตโนมัติ วางหมุดบนพิกัดโลก Unity ที่เหมาะสม โดยการคำนวณ ตำแหน่งที่สัมพันธ์กับออบเจ็กต์ ARGeospatialCreatorOrigin หากต้องการปรับ ระดับความสูงของจุดยึดภูมิประเทศ ตั้งค่าคุณสมบัติ Altitude เป็นเมตรด้านบนหรือ ใต้พื้นผิวภูมิประเทศ

ขณะรันไทม์ ตัวยึดภูมิประเทศจะแก้ไขที่ระดับพื้นดินสำหรับแอปที่กำลังวิ่ง ชดเชยด้วยพร็อพเพอร์ตี้ Altitude แต่ในมุมมองฉากของเครื่องมือแก้ไข แสดงผลที่ระดับความสูง WGS84 ที่ 0 โดยค่าเริ่มต้น ซึ่งไม่สัมพันธ์กับไทล์ 3 มิติ เรขาคณิต ซึ่งมักจะไม่ใช่ตำแหน่งที่คุณต้องการเห็น ดังนั้นคุณสามารถแทนที่ ระดับความสูงเริ่มต้นของจุดยึดในมุมมองฉากของเครื่องมือแก้ไขโดยการตั้งค่า พร็อพเพอร์ตี้ UseEditorAltitudeOverride กับ true และระบุระดับความสูงใน WGS84 เมตรโดยใช้พร็อพเพอร์ตี้ EditorAltitudeOverride:

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

คุณสมบัติทั้งสองนี้จะไม่มีผลนอกโหมด Editor และไม่ได้ ที่คอมไพล์ลงในแอปที่ทำงานอยู่

หมุดภูมิสารสนเทศที่ศาลากลางพลาซ่า

สร้างจุดยึดบนชั้นดาดฟ้า

สำหรับจุดยึดถัดไปของเรา สมมติว่าคุณต้องการปักหมุดไว้ที่ชั้นดาดฟ้าของเมือง ฮอลล์ คุณสร้าง Anchor ได้ในลักษณะเดียวกัน ยกเว้น AltitudeType พร็อพเพอร์ตี้ถูกตั้งค่าเป็น 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;

คุณสามารถปรับระดับความสูงของหลังคาได้เช่นเดียวกับตัวยึดภูมิประเทศ โฆษณา Anchor ในมุมมองฉากของเครื่องมือแก้ไขโดยใช้ UseEditorAltitudeOverride และ พร็อพเพอร์ตี้ EditorAltitudeOverride รายการ สำหรับตัวอย่างนี้ ระดับความสูง WGS84 ของ หลังคายาวประมาณ 10.7 เมตร

ตัวยึดภูมิสารสนเทศบนหลังคา

สร้างจุดยึดที่ระดับความสูงที่เฉพาะเจาะจง

สถานที่อันสุดท้ายของเราจะวางไว้ที่บนสุดของโดมของศาลากลาง สำหรับ จุดยึดนี้ ระดับความสูงที่แน่นอน คือสิ่งสำคัญ ดังนั้นคุณจะต้องตั้งค่าให้ชัดเจนโดย ใช้จุดยึด WGS84 แทนแท็กภูมิประเทศหรือจุดยึดหลังคา:

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;

ไม่จำเป็นต้องใช้การลบล้างระดับความสูงจากเครื่องมือแก้ไขเท่านั้น เนื่องจากระดับความสูงนั้น ที่ระบุตาม WGS84 แล้ว แน่นอนว่าถ้าความสูงของชิ้นส่วนแผนที่ เรขาคณิตในเครื่องมือแก้ไขไม่ถูกต้อง เมื่อเทียบกับโลกจริง คุณยังสามารถใช้การลบล้างตัวแก้ไขเพื่อเปลี่ยนตำแหน่ง Anchor ในฉาก

จุดยึดภูมิสารสนเทศบนโดม