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

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

ประเภทของหมุดภูมิสารสนเทศเชิงพื้นที่

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

การสร้างหมุดแต่ละวิธีมีข้อดีข้อเสียที่ควรทราบดังนี้

  • เมื่อใช้ เรขาคณิตของภาพถนน ให้ใช้ Hit-Test เพื่อแนบเนื้อหากับอาคาร
  • เลือกใช้จุดยึดภูมิประเทศหรือหลังคาบนจุดยึด 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 ที่สร้างขึ้นแต่ละรายการ

วางหมุด 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 หมุดยึดจะอยู่ในระดับเดียวกับภูมิประเทศ

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

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

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

สร้างหมุดเทอร์เรนโดยใช้ 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 บน 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;
}

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