ARKit - 使用世界射线而非屏幕点进行光线投射

5
我希望能够实现类似于ARCore的光线投射方法的功能,该方法可以使用世界坐标系中的任意光线而不是屏幕坐标点:
List<HitResult> hitTest (float[] origin3, int originOffset, float[] direction3, int directionOffset)

我看到ARKit本身并没有那样的方法,但无论如何,也许有人有想法!谢谢。
1个回答

6
在苹果的RealityKit和ARKit框架中,你可以找到三种主要类型的Raycast方法:ARView RaycastARSession RaycastScene 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()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接