จุดยึดภูมิสารสนเทศเป็นแท็ก Anchor ประเภทหนึ่งที่ให้คุณวางเนื้อหา 3 มิติในโลกจริงได้
ประเภทของ Anchor เชิงพื้นที่
ตัวยึดภูมิสารสนเทศมีสามประเภท ซึ่งแต่ละประเภทจะจัดการกับระดับความสูงแตกต่างกันไป ดังนี้
โฆษณา Anchor ของ WGS84:
จุดยึด WGS84 ช่วยให้คุณวางเนื้อหา 3 มิติที่ละติจูดใดๆ ก็ได้ ลองจิจูดและระดับความสูงตัวยึดภูมิประเทศ:
ตัวยึดภูมิประเทศช่วยให้คุณสามารถวางเนื้อหาโดยใช้เพียงละติจูดและลองจิจูด ที่มีความสูงสัมพัทธ์กับภูมิประเทศที่ตำแหน่งนั้น ระดับความสูงจะถูกกำหนดสัมพันธ์กับพื้นหรือพื้นตามที่ทราบ โดย VPSโฆษณา Anchor บนหลังคา:
โฆษณา Anchor บนหลังคาให้คุณวางเนื้อหาโดยใช้เพียงละติจูดและลองจิจูด ที่มีความสูงสัมพัทธ์กับหลังคาของอาคารในตำแหน่งนั้น ระดับความสูงจะถูกกำหนดแบบสัมพันธ์กับยอดอาคารตามที่ทราบ โดย Streetscape Geometry ค่าเริ่มต้นจะเป็นระดับความสูงตามภูมิประเทศ แต่ไม่ได้วางอยู่บนสิ่งปลูกสร้าง
WGS84 | ภูมิประเทศ | ติดหลังคา | |
---|---|---|---|
ตำแหน่งแนวนอน | ละติจูด ลองจิจูด | ละติจูด ลองจิจูด | ละติจูด ลองจิจูด |
ตำแหน่งแนวตั้ง | สัมพัทธ์กับระดับความสูง WGS84 | สัมพันธ์กับระดับภูมิประเทศที่กำหนดโดย Google Maps | สัมพันธ์กับระดับชั้นดาดฟ้าซึ่ง Google Maps กำหนด |
จำเป็นต้องแก้ไขเซิร์ฟเวอร์ไหม | ไม่ได้ | ได้ | ใช่ |
ข้อกำหนดเบื้องต้น
โปรดตรวจสอบว่าคุณเปิดใช้ Geospatial API ก่อนดำเนินการต่อ
วางจุดยึดภูมิสารสนเทศ
Anchor แต่ละประเภทมี API สำหรับสร้างโดยเฉพาะ ดูข้อมูลเพิ่มเติมได้ที่ประเภทของจุดยึดภูมิสารสนเทศ
สร้าง Anchor จากการทดสอบ Hit
คุณยังสร้างจุดยึดภูมิสารสนเทศจากผลลัพธ์ Hit ได้ด้วย
ใช้ท่าทางจากการทดสอบ Hit แล้วแปลงเป็น GeospatialPose
ให้ใช้ตำแหน่งเพื่อวาง Anchor ประเภทใดประเภทหนึ่งจาก 3 ประเภทที่อธิบายไว้
รับท่าทางภูมิสารสนเทศจากท่าทาง AR
Earth.getGeospatialPose()
แสดงวิธีเพิ่มเติมในการระบุละติจูดและลองจิจูดโดยการแปลงท่า AR เป็นโพสตามพื้นที่ทางภูมิศาสตร์
รับท่าทาง AR จากโพสทางภูมิสารสนเทศ
Earth.getPose()
แปลงตำแหน่งแนวนอน ระดับความสูง และการหมุนควอเทิร์นที่ระบุที่ 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 ให้ทำดังนี้
ไปที่ Google Maps บนคอมพิวเตอร์เดสก์ท็อป
ไปที่เลเยอร์ > เพิ่มเติม
เปลี่ยนประเภทแผนที่เป็นดาวเทียมและล้างช่องทำเครื่องหมายมุมมองโลกที่มุมซ้ายล่างของหน้าจอ
ซึ่งจะบังคับใช้มุมมอง 2 มิติ และขจัดข้อผิดพลาดที่อาจเกิดขึ้นจากมุมมอง 3 มิติ
บนแผนที่ ให้คลิกขวาที่ตำแหน่งและเลือกลองจิจูด/ละติจูดเพื่อคัดลอกไปยังคลิปบอร์ด
ใช้ Google Earth
คุณสามารถคำนวณละติจูดและลองจิจูดของตำแหน่งได้จาก Google Earth โดยคลิกที่ตำแหน่งใน UI และอ่านข้อมูลจากรายละเอียดของหมุด
หากต้องการทราบละติจูดและลองจิจูดของสถานที่โดยใช้ Google Earth ให้ทำดังนี้
ไปที่ Google Earth ในคอมพิวเตอร์เดสก์ท็อป
ไปที่เมนู 3 ขีด แล้วเลือกรูปแบบแผนที่
ปิดสวิตช์สิ่งปลูกสร้าง 3 มิติ
เมื่อปิดสวิตช์สิ่งปลูกสร้าง 3 มิติ ให้คลิกไอคอนหมุด เพื่อเพิ่มหมุดที่ตำแหน่งที่เลือก
ระบุโครงการที่จะมีหมุดของคุณ แล้วคลิกบันทึก
ในช่องชื่อของหมุด ให้ป้อนชื่อของหมุด
คลิกลูกศรย้อนกลับ ในแผงโปรเจ็กต์ แล้วเลือกเมนู การทำงานเพิ่มเติม
เลือกส่งออกเป็นไฟล์ KML จากเมนู
ไฟล์ KLM จะรายงานละติจูด ลองจิจูด และระดับความสูงสำหรับหมุดในแท็ก <coordinates>
โดยคั่นด้วยเครื่องหมายจุลภาค ดังนี้
<coordinates>-122.0755182435043,37.41347299422944,7.420342565583832</coordinates>
อย่าใช้ละติจูดและลองจิจูดจากแท็ก <LookAt>
ซึ่งระบุตำแหน่งกล้อง ไม่ใช่ตำแหน่ง
ไปที่สถานที่ตั้งจริง
คุณคำนวณระดับความสูงของสถานที่ได้โดยการไปที่นั่นด้วยตนเอง และสังเกตการณ์ในพื้นที่
รับควอเทอร์เนียนการหมุน
GeospatialPose.getEastUpSouthQuaternion()
จะแยกการวางแนวจากท่าทางภูมิสารสนเทศและแสดงผลเป็นควอเทอร์เนียนซึ่งแทนเมทริกซ์การหมุนซึ่งแปลงเวกเตอร์จากเป้าหมายเป็นระบบพิกัดแนวตะวันออก-ขึ้น-ใต้ (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 เพื่อเปรียบเทียบกับระดับความสูง
GeospatialPose
ดู GeoidEval ที่มีทั้งบรรทัดคำสั่งและอินเทอร์เฟซ HTML แผนที่ API จะรายงานละติจูดและลองจิจูดตามข้อกำหนด WGS84 ทันทีที่แกะกล่อง - คุณดูละติจูด ลองจิจูด และระดับความสูงของตำแหน่งได้จาก Google Earth ซึ่งจะทำให้คุณมีความคลาดเคลื่อนได้สูงสุดหลายเมตร ใช้ละติจูด ลองจิจูด และระดับความสูงจากแท็ก
<coordinates>
ไม่ใช่แท็ก<LookAt>
ในไฟล์ KML - หากจุดยึดที่มีอยู่อยู่ใกล้และถ้าคุณไม่ได้อยู่บนแนวเอียง คุณอาจใช้ระดับความสูงจาก
GeospatialPose
ของกล้อง โดยไม่ต้องใช้แหล่งข้อมูลอื่น เช่น Maps API
สร้าง Anchor
เมื่อมีละติจูด ลองจิจูด ระดับความสูง และควอเทิร์นการหมุน ให้ใช้ Earth.createAnchor()
เพื่อวางตำแหน่งเนื้อหา
ตามพิกัดทางภูมิศาสตร์ที่คุณระบุ
Java
if (earth != null && earth.getTrackingState() == TrackingState.TRACKING) { Anchor anchor = earth.createAnchor( /* Location values */ latitude, longitude, altitude, /* Rotational pose values */ qx, qy, qz, qw); // Attach content to the anchor specified by geodetic location and pose. }
Kotlin
if (earth.trackingState == TrackingState.TRACKING) { val anchor = earth.createAnchor( /* Location values */ latitude, longitude, altitude, /* Rotational pose values */ qx, qy, qz, qw ) // Attach content to the anchor specified by geodetic location and pose. }
ตัวยึดภูมิประเทศ
หมุดภูมิประเทศเป็นจุดยึดประเภทหนึ่งที่ให้คุณวางวัตถุ AR โดยใช้เพียงละติจูดและลองจิจูด โดยใช้ประโยชน์จากข้อมูลจาก VPS เพื่อค้นหาระดับความสูงที่แม่นยำเหนือพื้นดิน
แทนการป้อนระดับความสูงที่ต้องการ คุณต้องระบุระดับความสูงเหนือภูมิประเทศนั้น เมื่อค่านี้เป็นศูนย์ จุดยึดจะอยู่ในแนวเดียวกับภูมิประเทศ
ตั้งค่าโหมดหาเครื่องบิน
การหาเครื่องบินเป็นตัวเลือกที่ไม่บังคับและไม่จำเป็นต้องใช้ Anchor โปรดทราบว่าจะใช้เพียงระนาบแนวนอนเท่านั้น ระนาบแนวนอนจะช่วยจัดตำแหน่งแบบไดนามิกของตัวยึดภูมิประเทศบนพื้น
ใช้ Config.PlaneFindingMode
เพื่อเลือกวิธีที่แอปตรวจหาเครื่องบิน
สร้าง Anchor ภูมิประเทศโดยใช้ Async API ใหม่
หากต้องการสร้างและวางหมุดภูมิประเทศ โปรดเรียกใช้ Earth.resolveAnchorOnTerrainAsync()
โฆษณา Anchor จะไม่พร้อมใช้งานทันทีและต้องได้รับการแก้ไข เมื่อแก้ไขแล้ว คุณจะดูข้อมูลดังกล่าวได้ในResolveAnchorOnTerrainFuture
Java
final ResolveAnchorOnTerrainFuture future = earth.resolveAnchorOnTerrainAsync( latitude, longitude, /* altitudeAboveTerrain= */ 0.0f, qx, qy, qz, qw, (anchor, state) -> { if (state == TerrainAnchorState.SUCCESS) { // do something with the anchor here } else { // the anchor failed to resolve } });
Kotlin
var future = earth.resolveAnchorOnTerrainAsync( latitude, longitude, altitudeAboveTerrain, qx, qy, qz, qw, { anchor, state -> if (state == TerrainAnchorState.SUCCESS) { // do something with the anchor here } else { // the anchor failed to resolve } } )
ตรวจสอบสถานะอนาคต
ในอนาคตจะมี FutureState
ที่เชื่อมโยง
รัฐ | คำอธิบาย |
---|---|
FutureState.PENDING |
รอการดำเนินการ |
FutureState.DONE |
การดำเนินการดังกล่าวเสร็จสิ้นแล้วและผลลัพธ์พร้อมใช้งาน |
FutureState.CANCELLED |
ยกเลิกการดำเนินการแล้ว |
ตรวจสอบสถานะจุดยึดภูมิประเทศของผลลัพธ์ในอนาคต
Anchor.TerrainAnchorState
เป็นของการดำเนินการแบบไม่พร้อมกันและเป็นส่วนหนึ่งของผลลัพธ์ในอนาคตสุดท้าย
Java
switch (terrainAnchorState) { case SUCCESS: // A resolving task for this Terrain anchor has finished successfully. break; case ERROR_UNSUPPORTED_LOCATION: // The requested anchor is in a location that isn't supported by the Geospatial API. break; case ERROR_NOT_AUTHORIZED: // An error occurred while authorizing your app with the ARCore API. See // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.TerrainAnchorState#error_not_authorized // for troubleshooting steps. break; case ERROR_INTERNAL: // The Terrain anchor could not be resolved due to an internal error. break; default: // not reachable break; }
Kotlin
when (state) { TerrainAnchorState.SUCCESS -> { // A resolving task for this Terrain anchor has finished successfully. } TerrainAnchorState.ERROR_UNSUPPORTED_LOCATION -> { // The requested anchor is in a location that isn't supported by the Geospatial API. } TerrainAnchorState.ERROR_NOT_AUTHORIZED -> { // An error occurred while authorizing your app with the ARCore API. See // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.TerrainAnchorState#error_not_authorized // for troubleshooting steps. } TerrainAnchorState.ERROR_INTERNAL -> { // The Terrain anchor could not be resolved due to an internal error. } else -> { // Default. } }
ตัวยึดบนหลังคา
ตัวยึดบนหลังคาเป็นตัวยึดประเภทหนึ่งและคล้ายกับตัวยึดภูมิประเทศด้านบนมาก ความแตกต่างคือ คุณจะระบุระดับความสูงเหนือชั้นดาดฟ้า แทนที่จะเป็นระดับความสูงเหนือภูมิประเทศ
สร้าง Anchor บน Rooftop โดยใช้ Async API ใหม่
โฆษณา Anchor จะไม่พร้อมใช้งานทันทีและต้องได้รับการแก้ไข
หากต้องการสร้างและวางโฆษณา Anchor บนชั้นดาดฟ้า โปรดโทรหา Earth.resolveAnchorOnRooftopAsync()
เช่นเดียวกับแท็ก Anchor ภูมิประเทศ คุณจะเข้าถึง FutureState
ของ Future ได้ด้วย จากนั้นคุณตรวจสอบผลลัพธ์ในอนาคตเพื่อเข้าถึง Anchor.RooftopAnchorState
ได้
Java
final ResolveAnchorOnRooftopFuture future = earth.resolveAnchorOnRooftopAsync( latitude, longitude, /* altitudeAboveRooftop= */ 0.0f, qx, qy, qz, qw, (anchor, state) -> { if (state == RooftopAnchorState.SUCCESS) { // do something with the anchor here } else { // the anchor failed to resolve } });
Kotlin
var future = earth.resolveAnchorOnRooftopAsync( latitude, longitude, altitudeAboveRooftop, qx, qy, qz, qw, { anchor, state -> if (state == RooftopAnchorState.SUCCESS) { // do something with the anchor here } else { // the anchor failed to resolve } } )
ตรวจสอบสถานะอนาคต
ส่วน "อนาคต" จะมี FutureState
ที่เกี่ยวข้อง โปรดดูตารางด้านบน
ตรวจสอบสถานะ Anchor บนหลังคาของผลลัพธ์ในอนาคต
Anchor.RooftopAnchorState
เป็นของการดำเนินการแบบไม่พร้อมกันและเป็นส่วนหนึ่งของผลลัพธ์ในอนาคตสุดท้าย
Java
switch (rooftopAnchorState) { case SUCCESS: // A resolving task for this Rooftop anchor has finished successfully. break; case ERROR_UNSUPPORTED_LOCATION: // The requested anchor is in a location that isn't supported by the Geospatial API. break; case ERROR_NOT_AUTHORIZED: // An error occurred while authorizing your app with the ARCore API. // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.RooftopAnchorState#error_not_authorized // for troubleshooting steps. break; case ERROR_INTERNAL: // The Rooftop anchor could not be resolved due to an internal error. break; default: // not reachable break; }
Kotlin
when (state) { RooftopAnchorState.SUCCESS -> { // A resolving task for this Rooftop anchor has finished successfully. } RooftopAnchorState.ERROR_UNSUPPORTED_LOCATION -> { // The requested anchor is in a location that isn't supported by the Geospatial API. } RooftopAnchorState.ERROR_NOT_AUTHORIZED -> { // An error occurred while authorizing your app with the ARCore API. See // https://developers.google.com/ar/reference/java/com/google/ar/core/Anchor.RooftopAnchorState#error_not_authorized // for troubleshooting steps. } RooftopAnchorState.ERROR_INTERNAL -> { // The Rooftop anchor could not be resolved due to an internal error. } else -> { // Default. } }
ขั้นตอนถัดไป
- โปรดตรวจสอบว่าคุณเข้าใจโควต้าการใช้งาน API ของภูมิสารสนเทศ