我想实现类似ARCore's raycast method这样的功能,它可以在世界空间坐标中接收任意射线,而不是屏幕空间点:
List<HitResult> hitTest (float[] origin3, int originOffset, float[] direction3, int directionOffset)
我看到ARKit本身没有那样的方法,但无论如何有人可能有一个主意!
谢谢。
答案 0 :(得分:2)
在Apple RealityKit 2.0和ARKit 4.0框架中,您可以找到三种主要的Raycast
方法类型:ARView Raycast
,ARSession Raycast
和Scene Raycast
(或World Raycast) 。所有用Swift编写的方法:
此实例方法执行射线投射,其中将射线从相机中心通过视图中的点投射到场景中,并立即返回结果。您可以在ARKit中使用这种类型的raycast。
func raycast(from point: CGPoint,
allowing target: ARRaycastQuery.Target,
alignment: ARRaycastQuery.TargetAlignment) -> [ARRaycastResult]
此实例方法针对给定的原点,方向和长度的射线对场景中的所有几何体执行凸射线投射。
func raycast(origin: SIMD3<Float>,
direction: SIMD3<Float>,
query: CollisionCastQueryType,
mask: CollisionGroup,
relativeTo: Entity) -> [CollisionCastHit]
此实例方法会随着时间的推移重复射线投射查询,以通知您物理环境中的更新曲面。您可以在ARKit 3.5中使用这种类型的raycast。
func trackedRaycast(_ query: ARRaycastQuery,
updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?
此RealityKit的实例方法还执行跟踪的光线投射,但是这里是将光线从相机的中心通过视图中的点投射到场景中。
func trackedRaycast(from point: CGPoint,
allowing target: ARRaycastQuery.Target,
alignment: ARRaycastQuery.TargetAlignment,
updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?
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
}
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()