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

จุดยึดภูมิสารสนเทศเป็นแท็ก 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 แล้วแปลงเป็น 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 ให้ทำดังนี้

  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> ซึ่งระบุตำแหน่งกล้อง ไม่ใช่ตำแหน่ง

ไปที่สถานที่ตั้งจริง

คุณคำนวณระดับความสูงของสถานที่ได้โดยการไปที่นั่นด้วยตนเอง และสังเกตการณ์ในพื้นที่

รับควอเทอร์เนียนการหมุน

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 บนดาดฟ้า

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

สร้าง 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;
}

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