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