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

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

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

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

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

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

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

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

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