在苹果的RealityKit和ARKit框架中,你可以找到三种主要类型的
Raycast
方法:
ARView Raycast
、
ARSession Raycast
和
Scene Raycast
(或World Raycast)。所有方法都是用Swift编写的。
ARView.raycast(from:allowing:alignment:)
这个实例方法执行射线投射,其中从相机的中心通过视图中的一个点向场景投射射线,并立即返回结果。您可以在ARKit中使用此类型的射线投射。
func raycast(from point: CGPoint,
allowing target: ARRaycastQuery.Target,
alignment: ARRaycastQuery.TargetAlignment) -> [ARRaycastResult]
ARView.scene.raycast(origin:direction:query:mask:relativeTo:)
WORLD RAYCAST
该实例方法针对给定起点、方向和长度的光线,在场景中针对所有几何图形执行凸射线检测。
func raycast(origin: SIMD3<Float>,
direction: SIMD3<Float>,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity) -> [CollisionCastHit]
ARView.session.trackedRaycast(_:updateHandler:)
这个实例方法会重复进行射线查询,以便通知您物理环境中更新的表面。您可以在 ARKit 3.5 中使用这种类型的射线投射。
func trackedRaycast(_ query: ARRaycastQuery,
updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?
ARView.trackedRaycast(from:allowing:alignment:updateHandler:)
这个RealityKit的实例方法也执行了一个跟踪射线,但是这里从相机中心通过视图中的一个点投射出一条射线到场景中。
func trackedRaycast(from point: CGPoint,
allowing target: ARRaycastQuery.Target,
alignment: ARRaycastQuery.TargetAlignment,
updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?
代码片段 01:
import RealityKit
let startPosition: SIMD3<Float> = [3,-2,0]
let endPosition: SIMD3<Float> = [10,7,-5]
let query: CollisionCastQueryType = .all
let mask: CollisionGroup = .all
let raycasts: [CollisionCastHit] = arView.scene.raycast(from: startPosition,
to: endPosition,
query: query,
mask: mask,
relativeTo: nil)
guard let rayCast: CollisionCastHit = raycasts.first
else {
return
}
代码片段 02:
import ARKit
let query = arView.raycastQuery(from: screenCenter,
allowing: .estimatedPlane,
alignment: .any)
let raycast = session.trackedRaycast(query) { results in
if let result = results.first {
object.transform = result.transform
}
}
raycast.stop()