จุดยึดภูมิสารสนเทศเป็นแท็ก 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 แล้วแปลงเป็น ArGeospatialPose
ให้ใช้ตำแหน่งเพื่อวาง Anchor ประเภทใดประเภทหนึ่งจาก 3 ประเภทที่อธิบายไว้
รับท่าทางภูมิสารสนเทศจากท่าทาง AR
ArEarth_getGeospatialPose()
แสดงวิธีเพิ่มเติมในการระบุละติจูดและลองจิจูดโดยการแปลงท่า AR เป็นโพสตามพื้นที่ทางภูมิศาสตร์
รับท่าทาง AR จากโพสทางภูมิสารสนเทศ
ArEarth_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>
ซึ่งระบุตำแหน่งกล้อง ไม่ใช่ตำแหน่ง
ไปที่สถานที่ตั้งจริง
คุณคำนวณระดับความสูงของสถานที่ได้โดยการไปที่นั่นด้วยตนเอง และสังเกตการณ์ในพื้นที่
รับควอเทอร์เนียนการหมุน
ArGeospatialPose_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 เพื่อเปรียบเทียบกับระดับความสูง
ArGeospatialPose
ดู GeoidEval ที่มีทั้งบรรทัดคำสั่งและอินเทอร์เฟซ HTML แผนที่ API จะรายงานละติจูดและลองจิจูดตามข้อกำหนด WGS84 ทันทีที่แกะกล่อง - คุณดูละติจูด ลองจิจูด และระดับความสูงของตำแหน่งได้จาก Google Earth ซึ่งจะทำให้คุณมีความคลาดเคลื่อนได้สูงสุดหลายเมตร ใช้ละติจูด ลองจิจูด และระดับความสูงจากแท็ก
<coordinates>
ไม่ใช่แท็ก<LookAt>
ในไฟล์ KML - หากจุดยึดที่มีอยู่อยู่ใกล้และถ้าคุณไม่ได้อยู่บนแนวเอียง คุณอาจใช้ระดับความสูงจาก
ArGeospatialPose
ของกล้อง โดยไม่ต้องใช้แหล่งข้อมูลอื่น เช่น Maps API
สร้าง Anchor
เมื่อมีละติจูด ลองจิจูด ระดับความสูง และควอเทิร์นการหมุน ให้ใช้ ArEarth_acquireNewAnchor()
เพื่อวางตำแหน่งเนื้อหา
ตามพิกัดทางภูมิศาสตร์ที่คุณระบุ
float eus_quaternion_4[4] = {qx, qy, qz, qw}; if (ar_earth != NULL) { ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED; ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth, &earth_tracking_state); if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) { ArAnchor* earth_anchor = NULL; ArStatus status = ArEarth_acquireNewAnchor(ar_session, ar_earth, /* location values */ latitude, longitude, altitude, eus_quaternion_4, &earth_anchor); // Attach content to the anchor specified by geodetic location and // pose. } }
ตัวยึดภูมิประเทศ
หมุดภูมิประเทศเป็นจุดยึดประเภทหนึ่งที่ให้คุณวางวัตถุ AR โดยใช้เพียงละติจูดและลองจิจูด โดยใช้ประโยชน์จากข้อมูลจาก VPS เพื่อค้นหาระดับความสูงที่แม่นยำเหนือพื้นดิน
แทนการป้อนระดับความสูงที่ต้องการ คุณต้องระบุระดับความสูงเหนือภูมิประเทศนั้น เมื่อค่านี้เป็นศูนย์ จุดยึดจะอยู่ในแนวเดียวกับภูมิประเทศ
ตั้งค่าโหมดหาเครื่องบิน
การหาเครื่องบินเป็นตัวเลือกที่ไม่บังคับและไม่จำเป็นต้องใช้ Anchor โปรดทราบว่าจะใช้เพียงระนาบแนวนอนเท่านั้น ระนาบแนวนอนจะช่วยจัดตำแหน่งแบบไดนามิกของตัวยึดภูมิประเทศบนพื้น
ใช้ ArPlaneFindingMode
เพื่อเลือกวิธีที่แอปตรวจหาเครื่องบิน
สร้าง Anchor ภูมิประเทศโดยใช้ Async API ใหม่
หากต้องการสร้างและวางหมุดภูมิประเทศ โปรดเรียกใช้ ArEarth_resolveAnchorOnTerrainAsync()
โฆษณา Anchor จะไม่พร้อมใช้งานทันทีและต้องได้รับการแก้ไข เมื่อแก้ไขแล้ว คุณจะดูข้อมูลดังกล่าวได้ในArResolveAnchorOnTerrainFuture
ตรวจสอบสถานะแท็ก Anchor ของภูมิประเทศโดยใช้ ArResolveAnchorOnTerrainFuture_getResultTerrainAnchorState()
รับ Anchor ที่แก้ไขแล้วโดยใช้ ArResolveAnchorOnTerrainFuture_acquireResultAnchor()
float eus_quaternion_4[4] = {qx, qy, qz, qw}; void* context = NULL; ArResolveAnchorOnTerrainCallback callback = NULL; ArResolveAnchorOnTerrainFuture* future = NULL; if (ar_earth != NULL) { ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED; ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth, &earth_tracking_state); if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) { ArStatus status = ArEarth_resolveAnchorOnTerrainAsync( ar_session, ar_earth, /* location values */ latitude, longitude, altitude_above_terrain, eus_quaternion_4, context, callback, &future); } }
ตรวจสอบสถานะอนาคต
ในอนาคตจะมี ArFutureState
ที่เชื่อมโยง
รัฐ | คำอธิบาย |
---|---|
AR_FUTURE_STATE_PENDING |
รอการดำเนินการ |
AR_FUTURE_STATE_DONE |
การดำเนินการดังกล่าวเสร็จสิ้นแล้วและผลลัพธ์พร้อมใช้งาน |
AR_FUTURE_STATE_CANCELLED |
ยกเลิกการดำเนินการแล้ว |
ตรวจสอบสถานะจุดยึดภูมิประเทศของผลลัพธ์ในอนาคต
ArTerrainAnchorState
เป็นของการดำเนินการแบบไม่พร้อมกันและเป็นส่วนหนึ่งของผลลัพธ์ในอนาคตสุดท้าย
switch (terrain_anchor_state) { case AR_TERRAIN_ANCHOR_STATE_SUCCESS: // A resolving task for this anchor has been successfully resolved. break; case AR_TERRAIN_ANCHOR_STATE_ERROR_UNSUPPORTED_LOCATION: // The requested anchor is in a location that isn't supported by the // Geospatial API. break; case AR_TERRAIN_ANCHOR_STATE_ERROR_NOT_AUTHORIZED: // An error occurred while authorizing your app with the ARCore API. See // https://developers.google.com/ar/reference/c/group/ar-anchor#:~:text=from%20this%20error.-,AR_TERRAIN_ANCHOR_STATE_ERROR_NOT_AUTHORIZED,-The%20authorization%20provided // for troubleshooting steps. break; case AR_TERRAIN_ANCHOR_STATE_ERROR_INTERNAL: // The Terrain anchor could not be resolved due to an internal error. break; default: break; }
ตัวยึดบนหลังคา
ตัวยึดบนหลังคาเป็นตัวยึดประเภทหนึ่งและคล้ายกับตัวยึดภูมิประเทศด้านบนมาก ความแตกต่างคือ คุณจะระบุระดับความสูงเหนือชั้นดาดฟ้า แทนที่จะเป็นระดับความสูงเหนือภูมิประเทศ
สร้าง Anchor บน Rooftop โดยใช้ Async API ใหม่
โฆษณา Anchor จะไม่พร้อมใช้งานทันทีและต้องได้รับการแก้ไข
หากต้องการสร้างและวางโฆษณา Anchor บนชั้นดาดฟ้า โปรดโทรหา ArEarth_resolveAnchorOnRooftopAsync()
เช่นเดียวกับแท็ก Anchor ภูมิประเทศ คุณจะเข้าถึง ArFutureState
ของ Future ได้ด้วย จากนั้นคุณตรวจสอบผลลัพธ์ในอนาคตเพื่อเข้าถึง ArRooftopAnchorState
ได้
ใช้ ArEarth_resolveAnchorOnRooftopAsync()
เพื่อสร้าง ArResolveAnchorOnRooftopFuture
ตรวจสอบสถานะแท็ก Anchor บนชั้นดาดฟ้าโดยใช้ ArResolveAnchorOnRooftopFuture_getResultRooftopAnchorState()
รับ Anchor ที่แก้ไขแล้วโดยใช้ ArResolveAnchorOnRooftopFuture_acquireResultAnchor()
float eus_quaternion_4[4] = {qx, qy, qz, qw}; void* context = NULL; ArResolveAnchorOnRooftopCallback callback = NULL; ArResolveAnchorOnRooftopFuture* future = NULL; if (ar_earth != NULL) { ArTrackingState earth_tracking_state = AR_TRACKING_STATE_STOPPED; ArTrackable_getTrackingState(ar_session, (ArTrackable*)ar_earth, &earth_tracking_state); if (earth_tracking_state == AR_TRACKING_STATE_TRACKING) { ArStatus status = ArEarth_resolveAnchorOnRooftopAsync( ar_session, ar_earth, /* location values */ latitude, longitude, altitude_above_rooftop, eus_quaternion_4, context, callback, &future); } }
ตรวจสอบสถานะอนาคต
ส่วน "อนาคต" จะมี ArFutureState
ที่เกี่ยวข้อง โปรดดูตารางด้านบน
ตรวจสอบสถานะ Anchor บนหลังคาของผลลัพธ์ในอนาคต
ArRooftopAnchorState
เป็นของการดำเนินการแบบไม่พร้อมกันและเป็นส่วนหนึ่งของผลลัพธ์ในอนาคตสุดท้าย
switch (rooftop_anchor_state) { case AR_ROOFTOP_ANCHOR_STATE_SUCCESS: // A resolving task for this anchor has been successfully resolved. break; case AR_ROOFTOP_ANCHOR_STATE_ERROR_UNSUPPORTED_LOCATION: // The requested anchor is in a location that isn't supported by the // Geospatial API. break; case AR_ROOFTOP_ANCHOR_STATE_ERROR_NOT_AUTHORIZED: // An error occurred while authorizing your app with the ARCore API. See // https://developers.google.com/ar/reference/c/group/ar-anchor#:~:text=from%20this%20error.-,AR_ROOFTOP_ANCHOR_STATE_ERROR_NOT_AUTHORIZED,-The%20authorization%20provided // for troubleshooting steps. break; case AR_ROOFTOP_ANCHOR_STATE_ERROR_INTERNAL: // The Rooftop anchor could not be resolved due to an internal error. break; default: break; }
ขั้นตอนถัดไป
- โปรดตรวจสอบว่าคุณเข้าใจโควต้าการใช้งาน API ของภูมิสารสนเทศ