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

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

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

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

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

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

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

สร้างต้นทาง

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

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

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

ดูข้อมูลอ้างอิงเกี่ยวกับ ARAnchorManager

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

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

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

สร้าง Anchor ภูมิประเทศ

ลองพิจารณาอาร์เรย์ 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;
}

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

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

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

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

จุดเชื่อมโยงด้านภูมิสารสนเทศในศาลากลาง

สร้าง Anchor บนชั้นดาดฟ้า

สำหรับโฆษณา Anchor ลำดับถัดไป สมมติว่าคุณต้องการวางตำแหน่ง Anchor ไว้บนดาดฟ้าของ City Hall คุณสร้าง 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 บนชั้นดาดฟ้าในมุมมองฉากของ Editor ได้โดยใช้พร็อพเพอร์ตี้ UseEditorAltitudeOverride และ EditorAltitudeOverride เช่นเดียวกับ Anchor ของภูมิประเทศ ในตัวอย่างนี้ ระดับความสูง WGS84 ของหลังคาคือประมาณ 10.7 เมตร

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

สร้าง Anchor ที่ระดับความสูงที่ต้องการ

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

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