在 Android NDK 應用程式中執行命中測試

執行 hit-test,判斷場景中 3D 物件的正確位置。正確配置可確保 AR 內容以適當的 (透明) 大小顯示。

命中搜尋結果類型

命中測試可以產生四種不同的命中結果,如下表所示。

命中搜尋結果類型 說明 方向 用途 方法呼叫
厚度 (AR_TRACKABLE_DEPTH_POINT) 使用整個場景的深度資訊,判斷點的正確深度和方向 垂直 3D 表面 將虛擬物體放在任意表面上 (而不只是地板和牆壁) 您必須啟用 ArDepthMode,這項功能才能正常運作。

ArFrame_hitTest,請在退貨清單中尋找 ArDepthPoint
飛機 (AR_TRACKABLE_PLANE) 根據水平和/或垂直表面,決定點的正確深度和方向 垂直 3D 表面 使用飛機的完整幾何圖形將物體置於平面 (地板或牆壁) 上。需要立即取得正確的體重計。深度命中測試的備用方案 ArFrame_hitTest,請在退貨清單中尋找 ArPlane
地圖項目點 (AR_TRACKABLE_POINT) 仰賴使用者輕觸點周圍的視覺功能,決定點的正確位置和方向 垂直 3D 表面 將物體放在任意表面上 (而不只是地板和牆壁) ArFrame_hitTest,請在退貨清單中尋找 ArPoint
即時刊登位置 (AR_TRACKABLE_INSTANT_PLACEMENT_POINT) 使用螢幕空間放置內容。一開始會使用應用程式提供的預估深度。可立即運作,但只要 ARCore 能夠判斷實際的場景幾何圖形,姿勢和實際深度就會改變 + Y 指向上,與重力相反 使用飛機的完整幾何圖形將物體放在平面 (地板或牆壁) 上,由於速配位置是關鍵的,而這種做法可以容許未知的初始深度和比例。 ArFrame_hitTestInstantPlacement

執行標準命中測試

呼叫 ArFrame_hitTest 執行命中測試。

ArHitResultList* hit_result_list = NULL;
ArHitResultList_create(ar_session, &hit_result_list);
CHECK
(hit_result_list);
if (is_instant_placement_enabled) {
 
ArFrame_hitTestInstantPlacement(ar_session, ar_frame, x, y,
                                  k_approximate_distance_meters
,
                                  hit_result_list
);
} else {
 
ArFrame_hitTest(ar_session, ar_frame, x, y, hit_result_list);
}

根據感興趣的類型篩選命中結果。舉例來說,如果您想專注於 ArPlane

int32_t hit_result_list_size = 0;
ArHitResultList_getSize(ar_session, hit_result_list, &hit_result_list_size);

// Returned hit-test results are sorted by increasing distance from the camera
// or virtual ray's origin. The first hit result is often the most relevant
// when responding to user input.
ArHitResult* ar_hit_result = NULL;
for (int32_t i = 0; i < hit_result_list_size; ++i) {
 
ArHitResult* ar_hit = NULL;
 
ArHitResult_create(ar_session, &ar_hit);
 
ArHitResultList_getItem(ar_session, hit_result_list, i, ar_hit);

 
if (ar_hit == NULL) {
    LOGE
("No item was hit.");
   
return;
 
}

 
ArTrackable* ar_trackable = NULL;
 
ArHitResult_acquireTrackable(ar_session, ar_hit, &ar_trackable);
 
ArTrackableType ar_trackable_type = AR_TRACKABLE_NOT_VALID;
 
ArTrackable_getType(ar_session, ar_trackable, &ar_trackable_type);
 
// Creates an anchor if a plane was hit.
 
if (ar_trackable_type == AR_TRACKABLE_PLANE) {
   
// Do something with this hit result. For example, create an anchor at
   
// this point of interest.
   
ArAnchor* anchor = NULL;
   
ArHitResult_acquireNewAnchor(ar_session, ar_hit, &anchor);

   
// TODO: Use this anchor in your AR experience.

   
ArAnchor_release(anchor);
   
ArHitResult_destroy(ar_hit);
   
ArTrackable_release(ar_trackable);
   
break;
 
}
 
ArHitResult_destroy(ar_hit);
 
ArTrackable_release(ar_trackable);
}
ArHitResultList_destroy(hit_result_list);

使用任意射線和方向,進行命中測試

命中測試通常會視為裝置或裝置相機的射線,但您可以使用 ArFrame_hitTestRay,在世界空間座標 (而非螢幕空間點) 中使用任意光線進行命中測試。

將錨點附加至 HitResult

取得命中結果後,即可使用其姿勢做為輸入內容,在場景中放置 AR 內容。使用 ArHitResult_acquireNewAnchor 在命中位置建立新的「錨定」

後續步驟

  • 查看 GitHub 上的 hello_ar_c 範例應用程式。