執行光線投射或命中測試,判斷 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 對本機幾何圖形進行對應並找到交錯平面後,系統就會將距離更新為實際距離。距離的變化可能會影響物件的「大小」或感知到的比例。