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

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

ประเภทของจุดยึดภูมิสารสนเทศ

จุดยึดภูมิสารสนเทศมี 3 ประเภท ซึ่งแต่ละจุดระดับความสูงของแฮนเดิลมีลักษณะแตกต่างกัน ดังนี้

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

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

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

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

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

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

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

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

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

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

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

GARSession.geospatialTransformFromTransform:error: เป็นวิธีเพิ่มเติมในการกำหนดละติจูดและลองจิจูดด้วยการแปลง AR Transform เป็น Geospatial Transform ขึ้นมา

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

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

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

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

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

กำหนดละติจูดและลองจิจูดของสถานที่

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

  • ใช้ผู้สร้างภูมิสารสนเทศเพื่อดูและขยายโลกด้วยเนื้อหา 3 มิติโดยไม่ต้องไปยังสถานที่ใดก็ตาม ซึ่งช่วยให้คุณวางเนื้อหาที่สมจริงแบบ 3 มิติได้โดยใช้ Google Maps ในเครื่องมือแก้ไข Unity ระบบจะคำนวณละติจูด ลองจิจูด การหมุน และระดับความสูงของเนื้อหาให้คุณโดยอัตโนมัติ
  • ใช้ 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 แยกการวางแนวจาก Geospatial Transform และส่งเอาต์พุตเป็นควอเทิร์นที่แสดงเมทริกซ์การหมุนที่แปลงเวกเตอร์จากเป้าหมายเป็นระบบพิกัดแบบตะวันออก-ขึ้น-ใต้ (EUS) X+ จุดไปทางตะวันออก จุด Y+ ขึ้น และ Z+ จุดทางใต้ ค่าจะเขียนตามลำดับ {x, y, z, w}

พุก WGS84

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

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

วางสมอเรือ WGS84 ในชีวิตจริง

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

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

  • หากตำแหน่งของ Anchor อยู่ใกล้กับผู้ใช้ คุณจะใช้ระดับความสูงที่คล้ายกับระดับความสูงของอุปกรณ์ของผู้ใช้ได้
  • เมื่อทราบละติจูดและลองจิจูดแล้ว ให้ใช้ 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];

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

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

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

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

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

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

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

หากต้องการสร้างและวาง Anchor ภูมิประเทศ ให้เรียก 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 ใหม่

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

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

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

ตรวจสอบสถานะแห่งอนาคต

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

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

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

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