執行 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
範例應用程式。