[英]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 種不同的光線投射方法:
此實例方法檢查一次光線(您從您感興趣的屏幕點創建的光線)與真實世界表面之間的交點。
此實例方法創建一個光線投射查詢,該查詢源自視圖上的一個點,與相機視野的中心對齊。
此實例方法隨着時間的推移重復光線投射查詢,以通知您物理環境中的更新表面。
但正如我所見,您需要實現一種方法,該方法從一個 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.