簡體   English   中英

從 3d 對象創建 ARRaycastQuery

[英]Create ARRaycastQuery from 3d object

我正在使用 ARKit 和 SceneKit 開發一個應用程序。

是否可以使用 ARRaycastQuery 從場景中的對象創建光線投射查詢?

場景

根據上圖,我試圖從 [3d object] 投射光線並在該方向找到一個平面。

這就是我正在嘗試的:

    let location = objectNode.simdWorldPosition
    let startRayPoint = simd_float3(location.x, location.y, location.z + 2.0)
    let endRayPoint = simd_float3(location.x, location.y, location.z - 2.0)

    let query = ARRaycastQuery(origin: startRayPoint, direction: endRayPoint, allowing: .estimatedPlane, alignment: .any)
    timer =  Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (timer) in
        if let result = self.sceneView.castRay(for: query).first {
            print("castRay result: \(result)")
        } else {
            print("failed to cast ray")
        }
    }

我試圖通過操縱“z”軸來獲取 [object] 的位置,並從 2m 遠的方向和向前 2m 的方向開始射線。 但是,查詢總是失敗,我做錯了什么? 甚至有可能嗎?

如果您使用的是 ARKit,您可以實現 3 種不同的光線投射方法

  • 光線投射(_:)

此實例方法檢查一次光線(您從您感興趣的屏幕點創建的光線)與真實世界表面之間的交點。

  • raycastQuery(來自:允許:對齊:)

此實例方法創建一個光線投射查詢,該查詢源自視圖上的一個點,與相機視野的中心對齊。

  • trackedRaycast(_:updateHandler:)

此實例方法隨着時間的推移重復光線投射查詢,以通知您物理環境中的更新表面。

但正如我所見,您需要實現一種方法,該方法從一個 3d 對象創建一條射線,該射線必須擊中場景中的另一個 3d 對象。 在這種情況下,您需要實現可在 ARView 場景中使用的 RealityKit 實例方法:

raycast(from:to:query:mask:relativeTo:)

此方法對場景中的所有幾何體執行convex ray cast ,以獲取兩個端點之間的光線

func raycast(from startPosition: SIMD3<Float>, 
                 to endPosition: SIMD3<Float>, 
                          query: CollisionCastQueryType = .all, 
                           mask: CollisionGroup = .all, 
     relativeTo referenceEntity: Entity? = nil) -> [CollisionCastHit]

在實際代碼中,它可能如下所示:

import RealityKit

let raycasts: [CollisionCastHit] = arView.scene.raycast(from: [2, 2, 2], 
                                                          to: [9, 9, 9], 
                                                       query: .all,  
                                                        mask: .all, 
                                                  relativeTo: nil)

guard let rayCast: CollisionCastHit = raycasts.first
else { return }

print(rayCast.entity.name)
print(rayCast.distance)

但要記住!

該方法會忽略缺少CollisionComponent 的實體 因此,在使用上述方法之前,您需要為未來的命中模型分配碰撞形狀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM