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

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

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

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

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

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

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

สร้างต้นทาง

API สําหรับ Geospatial Creator มีเมธอดแฟกทอรีเพื่อสร้าง ARGeospatialCreatorOrigin ในฉากและเพิ่มคอมโพเนนต์ Cesium ที่จําเป็น โค้ดต่อไปนี้จะสร้างจุดเริ่มต้นที่ละติจูด ลองจิจูด และระดับความสูงใกล้เคียงกัน และใช้คีย์ Map Tiles API ที่ระบุ

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

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

รับข้อมูลอ้างอิง ARAnchorManager

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

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

เมื่อคุณมีต้นทางและผู้จัดการจุดยึดแล้ว ก็เริ่มสร้างออบเจ็กต์ 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

สมมติว่าคุณต้องการวางลูกบาศก์ขนาด 1 เมตรที่แต่ละตำแหน่งเหล่านี้ที่ระดับพื้นดินในแอปพลิเคชัน 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;
}

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

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

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

พร็อพเพอร์ตี้ 2 รายการนี้จะไม่มีผลนอกโหมดเครื่องมือแก้ไข และจะไม่ได้รับการคอมไพล์ลงในแอปที่ทำงานอยู่

จุดยึดทางภูมิสารสนเทศในจัตุรัส City Hall

สร้างจุดยึดบนหลังคา

สมมติว่าคุณต้องการวางจุดยึดบนหลังคาของศาลากลาง สำหรับจุดยึดถัดไป คุณสร้างแอตทริบิวต์นี้ได้ด้วยวิธีเดียวกันทุกประการ ยกเว้นการตั้งค่าพร็อพเพอร์ตี้ 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;

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

หมุดภูมิสารสนเทศบนโดม