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

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

命中結果類型

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

命中結果類型 說明 方向 用途 方法呼叫
深度 使用整個場景的深度資訊,判斷點的正確深度和方向 垂直於 3D 表面 將虛擬物件放置在任意表面 (不限於地板和牆壁) 如要這麼做,您必須啟用 Depth

ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.Depth)
飛機 撞上水平和/或垂直表面,以判斷點的正確深度和方向 垂直於 3D 表面 使用平面完整的幾何圖形,將物件放置在平面 (地板或牆壁) 上。需要立即修正比例。Depth 命中測試的備用機制 ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.PlaneWithinPolygon)
特徵點 會根據使用者輕觸點周圍的視覺特徵,判斷點的正確位置和方向 垂直於 3D 表面 將物品放在任意表面上 (不限於地板和牆壁) ARRaycastManager.Raycast(Vector2 screenPoint, List<ARRaycastHit> hitResults, TrackableType trackableTypes TrackableType.FeaturePoint)
Persistent Raycast (即時刊登) 使用螢幕空間放置內容。一開始會使用應用程式提供的預估深度。雖然可以立即運作,但 ARCore 能夠判斷實際場景幾何形狀後,姿勢和實際深度就會改變。 +Y 向上,與重力相反 使用平面 (地板或牆壁) 的完整幾何圖形,將物件放置在平面上,此時快速放置至關鍵,且體驗可容許未知的初始深度和比例 ARRaycastManager.AddRaycast(Vector2 screenPoint, float estimatedDistance)

執行標準的光線投射

呼叫 ARRaycastManager.Raycast(Vector2, List<ARRaycastHit>, TrackableType) 即可執行光線投射 (命中測試)。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) 執行 Raycast,使用世界空間座標中的任意光線,而非螢幕空間點。

使用 ARRaycastHit 建立錨點

取得光線投射命中後,請使用 GameObject.AddComponent<ARAnchor> 建立 Anchor,並將其設為 GameObject 的元件,並使用光線投射命中結果做為輸入內容。ARAnchor 元件會持續更新遊戲物件的 Transform,讓遊戲物件持續連結至基礎 Trackable,以便取得命中結果。

持續性光線投射 (即時放置)

持久性光線投射會使用螢幕位置和與表面的預估距離做為輸入內容,以建立新的 ARRaycast,在場景中放置 AR 內容。在 ARCore 中,這稱為「即時放置」

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

ARRaycast 的距離一開始會是 AddRaycast() 呼叫中提供的距離。ARCore 對本機幾何圖形進行對應並找到交錯平面後,距離就會更新為實際距離。距離的變化可能會影響物件的「大小」或感知到的比例。

後續步驟