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

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

ประเภทของ Anchor เชิงพื้นที่

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

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

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

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

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

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

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

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

Anchor แต่ละประเภทมี API สำหรับสร้างโดยเฉพาะ ดูข้อมูลเพิ่มเติมได้ที่ประเภทของจุดยึดภูมิสารสนเทศ

สร้าง Anchor จากการทดสอบ Hit

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

รับการแปลงภูมิสารสนเทศจาก AR Transform

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

รับการแปลง AR จากการแปลงภูมิสารสนเทศ

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

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

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

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

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

การคำนวณละติจูดและลองจิจูดของตำแหน่งทำได้ 3 วิธีดังนี้

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

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

วางตำแหน่งโฆษณา Anchor ของ WGS84 ไว้ในชีวิตจริง

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

มีวิธีการ 2-3 วิธีในการระบุระดับความสูงของสถานที่สำหรับการวางตัวยึด:

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

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

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

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

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

สร้าง Anchor ภูมิประเทศโดยใช้ Async API ใหม่

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

โฆษณา Anchor จะไม่พร้อมใช้งานทันทีและต้องได้รับการแก้ไข เมื่อแก้ไขแล้ว คุณจะดูข้อมูลดังกล่าวได้ใน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 บนดาดฟ้า

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

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

โฆษณา Anchor จะไม่พร้อมใช้งานทันทีและต้องได้รับการแก้ไข

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

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

ตรวจสอบสถานะอนาคต

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

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

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

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

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