[ARKit使用世界射线而不是屏幕点的命中测试

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[ARKit使用世界射线而不是屏幕点的命中测试相关的知识,希望对你有一定的参考价值。

我想实现类似ARCore's raycast method之类的东西,它在世界空间坐标中接收任意射线,而不是屏幕空间点:

List<HitResult> hitTest (float[] origin3, int originOffset, float[] direction3, int directionOffset)

[我看到ARKit本身没有那样的方法,但是无论如何,也许有人有一个主意!

谢谢。

答案

在全新的Apple RealityKit 1.0框架中,您可以找到三种类型的Raycast方法:

ARView.raycast(from:allowing:alignment:)

此实例方法执行射线投射,其中将射线从相机中心通过视图中的点投射到场景中,并立即返回结果。您可以在ARKit 3.5中使用这种类型的raycast。

func raycast(from point: CGPoint, 
        allowing target: ARRaycastQuery.Target, 
              alignment: ARRaycastQuery.TargetAlignment) -> [ARRaycastResult]

ARView.scene.raycast(来源:方向:查询:遮罩:relativeTo:)

此实例方法针对给定的原点,方向和长度的射线对场景中的所有几何体执行凸射线投射。

func raycast(origin: SIMD3<Float>, 
          direction: SIMD3<Float>,
              query: CollisionCastQueryType, 
               mask: CollisionGroup, 
         relativeTo: Entity) -> [CollisionCastHit]

ARView.session.trackedRaycast(_:updateHandler:)

此实例方法会随着时间的推移重复射线广播查询,以通知您物理环境中的更新曲面。

func trackedRaycast(_ query: ARRaycastQuery, 
              updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?

以上是关于[ARKit使用世界射线而不是屏幕点的命中测试的主要内容,如果未能解决你的问题,请参考以下文章

了解 ARKit 世界变换矩阵

如何获得世界空间中二维点的射线方程

Unity 射线碰撞检测

Unity 射线碰撞检测

ARKit-1

OpenGL 射线 OBB 相交