在 Unity (AR Foundation) 應用程式中執行光線投射

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

命中搜尋結果類型

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

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

ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.Depth)
飛機 根據水平和/或垂直表面,決定點的正確深度和方向 垂直 3D 表面 使用飛機的完整幾何圖形將物體置於平面 (地板或牆壁) 上。需要立即取得正確的體重計。深度命中測試的備用方案 ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.PlaneWithinPolygon)
地圖項目點 仰賴使用者輕觸點周圍的視覺功能,決定點的正確位置和方向 垂直 3D 表面 將物體放在任意表面上 (而不只是地板和牆壁) ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.FeaturePoint)
永久性 Raycast (即時放置) 使用螢幕空間放置內容。一開始會使用應用程式提供的預估深度。可立即運作,但只要 ARCore 能夠判斷實際的場景幾何圖形,姿勢和實際深度就會改變 + Y 指向上,與重力相反 使用飛機的完整幾何圖形將物體放在平面 (地板或牆壁) 上,由於速配位置是關鍵的,而這種做法可以容許未知的初始深度和比例。 ARRaycastManager.AddRaycast(Vector2 screenPoint, float estimatedDistance)

執行標準 raycast

呼叫 ARRaycastManager.Raycast(Vector2, List<ARRaycastHit>, TrackableType) 執行陣列動作 (hit-test)。ARRaycastManager 支援所有 TrackableType

var touch = Input.GetTouch(0);
if (touch.phase != TouchPhase.Began)
    return;

// Raycast against planes and feature points.
const TrackableType trackableTypes =
    TrackableType.FeaturePoint |
    TrackableType.PlaneWithinPolygon;
List<ARRaycastHit> hits = new List<ARRaycastHit>();
// Perform the raycast.
if (raycastManager.Raycast(touch.position, hits, trackableTypes))
{
    // Raycast hits are sorted by distance, so the first one will be the closest hit.
    var hit = hits[0];
    // Do something with hit.
}

使用任意的射線和方向進行光柵化

Raycast 通常會視為裝置或裝置相機中的射光,但你可以使用 Raycast(Ray, List<ARRaycastHit>, TrackableType) 在世界空間座標 (而非螢幕空間點) 中以任意光線的光線進行光照轉換

使用 ARRaycastHit 建立錨點

產生 raycast 命中後,請使用 GameObject.AddComponent<ARAnchor> 建立 Anchor,並將 raycast 命中做為輸入內容,將其新增為 GameObject 的元件。ARAnchor 元件會持續更新遊戲物件的 Transform,因此遊戲物件仍會連接至基礎 Trackable,以產生命中結果。

持續性光柵 (即時放置)

常駐光點會使用螢幕位置,以及預估與表面之間的距離,並據此建立新的 ARRaycast,以便在場景中放置 AR 內容。這在 ARCore 中稱為即時放置

呼叫 ARRaycastManager.AddRaycast() 即可建立 ARRaycast,會持續自動更新,直到您呼叫 ARRaycastManager.RemoveRaycast() 或停用 ARRaycastManager 為止。

一開始,ARRaycast 的距離會是 AddRaycast() 呼叫中提供的距離。一旦 ARCore 繪製出當地幾何圖形並找到一個相交的平面,距離就會更新為實際的距離。距離變化可能會影響明顯的「大小」或感知的縮放比例

後續步驟