gpt4 book ai didi

swift - ARKit – 使用世界射线而不是屏幕点进行光线转换

转载 作者:行者123 更新时间:2023-12-03 23:13:31 38 4
gpt4 key购买 nike

我想实现类似的东西 ARCore's raycast method它采用世界空间坐标中的任意光线而不是屏幕空间点:

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

我看到 ARKit 本身没有那样的方法,但无论如何也许有人有想法!

谢谢。

最佳答案

在 Apple RealityKit 2.0 和 ARKit 4.0 框架中,您可以找到三种主要类型 Raycast方法:ARView Raycast , ARSession RaycastScene Raycast (或世界光线转换)。所有用 Swift 编写的方法:

ARView.raycast(来自:允许:对齐:)
此实例方法执行光线转换,其中光线从相机中心通过 View 中的一个点转换到场景中,并立即返回结果。您可以在 ARKit 中使用这种类型的光线转换。

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

ARView.scene.raycast(origin:direction:query:mask:relativeTo:)
世界广播
此实例方法针对给定原点、方向和长度的光线对场景中的所有几何体执行凸光线转换。
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 的实例方法也执行跟踪光线转换,但这里光线从相机的中心通过 View 中的一个点转换到场景中。
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()

关于swift - ARKit – 使用世界射线而不是屏幕点进行光线转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54842920/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com