ใช้ Geospatial Anchor เพื่อกำหนดตำแหน่งเนื้อหาในโลกจริงบน iOS

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

ประเภทของหมุดยึดเชิงพื้นที่

หมุดยึดเชิงพื้นที่มี 3 ประเภท ซึ่งแต่ละประเภทจัดการระดับความสูงแตกต่างกันไป ดังนี้

  1. หมุด WGS84:
    หมุด WGS84 ช่วยให้คุณวางเนื้อหา 3 มิติที่ละติจูด ลองจิจูด และระดับความสูงที่ต้องการได้

  2. หมุดเทอร์เรน:
    หมุดเทอร์เรนช่วยให้คุณวางเนื้อหาได้โดยใช้เฉพาะละติจูดและลองจิจูดที่มีความสูงสัมพันธ์กับภูมิประเทศ ณ ตำแหน่งนั้น ระดับความสูงจะกำหนดตามพื้นดินหรือพื้นตามที่ VPS ทราบ

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

WGS84 ภูมิประเทศ ดาดฟ้า
ตำแหน่งแนวนอน ละติจูด ลองจิจูด ละติจูด ลองจิจูด ละติจูด ลองจิจูด
ตำแหน่งแนวตั้ง สัมพัทธ์กับความสูง WGS84 สัมพันธ์กับระดับภูมิประเทศที่กำหนดโดย Google Maps สัมพันธ์กับระดับดาดฟ้าที่ Google Maps ระบุ
ต้องแก้ไขจากเซิร์ฟเวอร์ไหม ไม่ ได้ ใช่

ข้อกำหนดเบื้องต้น

โปรดตรวจสอบว่าคุณได้เปิดใช้ Geospatial API แล้วก่อนดำเนินการต่อ

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

หมุดแต่ละประเภทมี API เฉพาะสำหรับสร้าง โปรดดูข้อมูลเพิ่มเติมที่ประเภทของหมุดพิกัดภูมิศาสตร์

สร้างจุดยึดจากการทดสอบการคลิก

นอกจากนี้ คุณยังสร้างหมุดตำแหน่งทางภูมิศาสตร์จากผลการทดสอบ Hit Test ได้ด้วย ใช้การเปลี่ยนรูปแบบจาก Hit-Test และแปลงเป็น GARGeospatialTransform ให้ใช้ตำแหน่งเพื่อวาง Anchor ประเภทใดประเภทหนึ่งจาก 3 ประเภทที่อธิบายไว้

รับการเปลี่ยนรูปแบบเชิงพื้นที่จากการเปลี่ยนรูปแบบ AR

GARSession.geospatialTransformFromTransform:error: มีวิธีเพิ่มเติมในการระบุละติจูดและลองจิจูดโดยการแปลง AR Transform เป็นการแปลงภูมิสารสนเทศ

รับการเปลี่ยนรูปแบบ AR จากการเปลี่ยนรูปแบบเชิงพื้นที่

GARSession.transformFromGeospatialCoordinate:altitude:eastUpSouthQTarget:error: จะแปลงตำแหน่งแนวนอน ระดับความสูง และการหมุนควอร์เทอร์ไบน์ที่ระบุโดยโลกตามกรอบพิกัดตะวันออก-ขึ้น-ใต้เป็นการแปลง AR ตามพิกัดโลก GL

เลือกวิธีการที่เหมาะกับกรณีการใช้งานของคุณ

วิธีการสร้าง Anchor แต่ละวิธีมีข้อดีข้อเสียที่เกี่ยวข้องที่ควรคำนึงถึง ดังนี้

  • เมื่อใช้ Streetscape Geometry ให้ใช้การทดสอบ Hit เพื่อแนบเนื้อหากับอาคาร
  • แนะนำให้ใช้จุดยึดบนพื้นดินหรือบนหลังคาแทนจุดยึด WGS84 เนื่องจากใช้ค่าระดับความสูงที่ Google Maps กำหนด

ระบุละติจูดและลองจิจูดของสถานที่

คุณสามารถคํานวณละติจูดและลองจิจูดของสถานที่ได้ 3 วิธีดังนี้

  • ใช้ Geospatial Creator เพื่อดูและเพิ่มประสิทธิภาพโลกด้วยเนื้อหา 3 มิติโดยไม่ต้องไปที่สถานที่จริง ซึ่งช่วยให้คุณวางเนื้อหา 3 มิติที่สมจริงได้โดยใช้ภาพจาก Google Maps ใน Unity Editor ระบบจะคำนวณละติจูด ลองจิจูด การหมุน และระดับความสูงของเนื้อหาให้คุณโดยอัตโนมัติ
  • ใช้ Google Maps
  • ใช้ Google Earth โปรดทราบว่าการหาพิกัดเหล่านี้โดยใช้ Google Earth แทน Google Maps จะมีความคลาดเคลื่อนได้สูงสุดหลายเมตร
  • ไปที่สถานที่ตั้งจริง

ใช้ Google Maps

วิธีรับละติจูดและลองจิจูดของสถานที่โดยใช้ Google Maps

  1. ไปที่ Google Maps ในคอมพิวเตอร์เดสก์ท็อป

  2. ไปที่เลเยอร์ > เพิ่มเติม

  3. เปลี่ยนประเภทแผนที่เป็นดาวเทียม แล้วยกเลิกการเลือกช่องทำเครื่องหมายมุมมองโลกที่มุมซ้ายล่างของหน้าจอ

    ซึ่งจะบังคับใช้มุมมอง 2 มิติและขจัดข้อผิดพลาดที่อาจเกิดขึ้นจากมุมมอง 3 มิติที่เอียง

  4. บนแผนที่ ให้คลิกขวาที่ตำแหน่งและเลือกลองจิจูด/ละติจูดเพื่อคัดลอกไปยังคลิปบอร์ด

ใช้ Google Earth

คุณสามารถคํานวณละติจูดและลองจิจูดของสถานที่จาก Google Earth ได้โดยคลิกสถานที่ใน UI และอ่านข้อมูลจากรายละเอียดจุดสังเกต

หากต้องการทราบละติจูดและลองจิจูดของสถานที่โดยใช้ Google Earth ให้ทำดังนี้

  1. ไปที่ Google Earth ในคอมพิวเตอร์เดสก์ท็อป

  2. ไปที่เมนูแฮมเบอร์เกอร์ แล้วเลือกรูปแบบแผนที่

  3. ปิดสวิตช์สิ่งปลูกสร้าง 3 มิติ

  4. เมื่อปิดสวิตช์อาคาร 3 มิติแล้ว ให้คลิกไอคอนหมุด เพื่อเพิ่มหมุดหมาย ณ ตำแหน่งที่เลือก

  5. ระบุโปรเจ็กต์ที่จะใส่หมุด แล้วคลิกบันทึก

  6. ป้อนชื่อหมุดในช่องชื่อของหมุด

  7. คลิกลูกศรย้อนกลับ ในแผงโปรเจ็กต์ แล้วเลือกเมนู การดำเนินการเพิ่มเติม

  8. เลือกส่งออกเป็นไฟล์ KML จากเมนู

ไฟล์ KLM จะรายงานละติจูด ลองจิจูด และระดับความสูงของจุดสังเกตในแท็ก <coordinates> โดยคั่นด้วยคอมมา ดังนี้

<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>

อย่าใช้ละติจูดและลองจิจูดจากแท็ก <LookAt> ซึ่งระบุตำแหน่งกล้อง ไม่ใช่ตำแหน่ง

ไปที่สถานที่ตั้งจริง

คุณสามารถคำนวณระดับความสูงของสถานที่ได้โดยไปที่สถานที่นั้นและทำการสังเกตการณ์ในพื้นที่

รับควอร์เทอร์ไบน์การหมุน

GARGeospatialTransform.eastUpSouthQTarget ดึงข้อมูลการวางแนวจากการเปลี่ยนรูปแบบเชิงพื้นที่และแสดงผลควอร์เทอร์ไบน์ที่แสดงถึงเมทริกซ์การหมุนที่เปลี่ยนเวกเตอร์จากเป้าหมายไปยังระบบพิกัดตะวันออก-ขึ้น-ใต้ (EUS) X+ จะชี้ไปทางตะวันออก Y+ จะชี้ขึ้น และ Z+ จะชี้ไปทางใต้ โดยระบบจะเขียนค่าตามลำดับ {x, y, z, w}

จุดยึด WGS84

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

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

วางหมุด WGS84 ในโลกแห่งความเป็นจริง

ระบุระดับความสูงของสถานที่

การกำหนดระดับความสูงของสถานที่เพื่อวางจุดยึดทำได้หลายวิธี ดังนี้

  • หากตำแหน่งของจุดยึดอยู่ใกล้กับผู้ใช้จริงๆ คุณสามารถใช้ระดับความสูงที่ใกล้เคียงกับระดับความสูงของอุปกรณ์ของผู้ใช้ได้
  • เมื่อทราบละติจูดและลองจิจูดแล้ว ให้ใช้ Elevation API เพื่อรับระดับความสูงตามข้อกำหนด EGM96 คุณต้องแปลงระดับความสูง EGM96 ของ Maps API เป็น WGS84 เพื่อเปรียบเทียบกับระดับความสูง GARGeospatialTransform ดู GeoidEval ที่มีทั้งบรรทัดคำสั่งและอินเทอร์เฟซ HTML Maps API จะรายงานละติจูดและลองจิจูดตามข้อกำหนด WGS84 โดยค่าเริ่มต้น
  • คุณดูละติจูด ลองจิจูด และระดับความสูงของตำแหน่งได้จาก Google Earth ซึ่งจะทำให้คุณมีความคลาดเคลื่อนได้สูงสุดหลายเมตร ใช้ละติจูด ลองจิจูด และระดับความสูงจากแท็ก <coordinates> ไม่ใช่แท็ก <LookAt> ในไฟล์ KML
  • หากมีจุดยึดที่มีอยู่ใกล้ๆ และคุณไม่ได้อยู่บนทางลาดชันชันชันชัน คุณอาจใช้ระดับความสูงจาก GARGeospatialTransform ของกล้องได้โดยไม่ต้องใช้แหล่งข้อมูลอื่น เช่น Maps API

สร้าง Anchor

เมื่อคุณมีละติจูด ลองจิจูด ความสูง และควอร์เทอร์ไบน์ของการหมุนแล้ว ให้ใช้ createAnchorWithCoordinate:altitude:eastUpSouthQAnchor:error: เพื่อกำหนดตำแหน่งเนื้อหาตามพิกัดทางภูมิศาสตร์ที่คุณระบุ

  NSError *error = nil;
  GARAnchor *anchor = [self.garSession createAnchorWithCoordinate:coordinate
                                                         altitude:altitude
                                               eastUpSouthQAnchor:eastUpSouthQAnchor
                                                            error:&error];

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

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

คุณต้องระบุระดับความสูงเหนือภูมิประเทศแทนการป้อนระดับความสูงที่ต้องการ เมื่อค่านี้เป็น 0 หมุดยึดจะอยู่ในระดับเดียวกับภูมิประเทศ

ตั้งค่าโหมดหาเครื่องบิน

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

ใช้ ARWorldTrackingConfiguration.PlaneDetection เพื่อเลือกวิธีที่แอปจะตรวจจับเครื่องบิน

สร้างหมุดเทอร์เรนโดยใช้ Async API ใหม่

หากต้องการสร้างและวางจุดยึดภูมิประเทศ ให้กด GARSession.createAnchorWithCoordinate:altitudeAboveTerrain:eastUpSouthQAnchor:completionHandler:error:

หมุดจะไม่พร้อมใช้งานในทันทีและจำเป็นต้องแก้ไข เมื่อแก้ไขแล้ว รายการดังกล่าวจะพร้อมใช้งานใน GARCreateAnchorOnTerrainFuture

GARCreateAnchorOnTerrainFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveTerrain:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARTerrainAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

ดู "สถานะของอนาคต"

อนาคตจะมี GARFutureState ที่เชื่อมโยงอยู่

รัฐ คำอธิบาย
GARFutureStatePending การดำเนินการยังอยู่ระหว่างรอดำเนินการ
GARFutureStateDone การดำเนินการเสร็จสมบูรณ์และผลลัพธ์พร้อมใช้งาน
GARFutureStateCancelled การดำเนินการถูกยกเลิกแล้ว

ตรวจสอบสถานะการยึดตามภูมิประเทศของผลลัพธ์ในอนาคต

GARTerrainAnchorState เป็นของการดำเนินการแบบไม่พร้อมกันและเป็นส่วนหนึ่งของผลลัพธ์ในอนาคตสุดท้าย

switch (future.resultTerrainAnchorState) {
  case GARTerrainAnchorStateSuccess:
    // Terrain anchor finished resolving.
    break;
  case GARTerrainAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARTerrainAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARTerrainAnchorState#garterrainanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARTerrainAnchorStateErrorInternal:
    // The Terrain anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

หมุดยึดบนหลังคา

รูปภาพหลักของจุดยึดบนหลังคา

ตัวยึดบนหลังคาเป็นตัวยึดประเภทหนึ่งและคล้ายกับตัวยึดภูมิประเทศด้านบนมาก ความแตกต่างคือ คุณจะระบุระดับความสูงเหนือชั้นดาดฟ้า แทนที่จะเป็นระดับความสูงเหนือภูมิประเทศ

สร้าง Anchor บน Rooftop โดยใช้ Async API ใหม่

หมุดจะไม่พร้อมใช้งานในทันทีและจำเป็นต้องแก้ไข

หากต้องการสร้างและวางหมุดยึดบนหลังคา ให้โทรหา GARSession.createAnchorWithCoordinate:altitudeAboveRooftop:eastUpSouthQAnchor:completionHandler:error: คุณจะเข้าถึง GARFutureState ของอนาคตได้ด้วย ซึ่งคล้ายกับจุดยึดของภูมิประเทศ จากนั้นคุณตรวจสอบผลลัพธ์ในอนาคตเพื่อเข้าถึง GARRooftopAnchorState ได้

GARCreateAnchorOnRooftopFuture *future = [self.garSession createAnchorWithCoordinate:coordinate
                                                                altitudeAboveRooftop:altitude
                                                                  eastUpSouthQAnchor:eastUpSouthQTarget
                                                                   completionHandler:^(GARAnchor *anchor, GARRooftopAnchorState state) {
                                                                     // handle completion
                                                                   }
                                                                               error:&error];

ดู "สถานะของอนาคต"

ส่วน "อนาคต" จะมี GARFutureState ที่เกี่ยวข้อง โปรดดูตารางด้านบน

ตรวจสอบสถานะ Anchor บนหลังคาของผลลัพธ์ในอนาคต

GARRooftopAnchorState เป็นของการดำเนินการแบบไม่พร้อมกันและเป็นส่วนหนึ่งของผลลัพธ์ Future สุดท้าย

switch (future.resultRooftopAnchorState) {
  case GARRooftopAnchorStateSuccess:
    // Rooftop anchor finished resolving.
    break;
  case GARRooftopAnchorStateErrorUnsupportedLocation:
    // The requested anchor is in a location that isn't supported by the Geospatial API.
    break;
  case GARRooftopAnchorStateErrorNotAuthorized:
    // An error occurred while authorizing your app with the ARCore API. See
    // https://developers.google.com/ar/reference/ios/group/GARRooftopAnchorState#garrooftopanchorstateerrornotauthorized
    // for troubleshooting steps.
    break;
  case GARRooftopAnchorStateErrorInternal:
    // The Rooftop anchor could not be resolved due to an internal error.
    break;
  default:
    break;
}

ขั้นตอนถัดไป