Тест удара ARKit с использованием World Ray вместо экрана
Я хочу добиться чего-то похожего на метод лучевой трансляции ARCore, который принимает произвольный луч в координатах мирового пространства вместо точки пространства экрана:
List<HitResult> hitTest (float[] origin3, int originOffset, float[] direction3, int directionOffset)
Я вижу, что сам ARKit не имеет такой метод, но в любом случае, может быть, у кого-то есть идея!
Благодарю.
0 ответов
В совершенно новых фреймворках Apple RealityKit 1.0 и ARKit 3.5 вы можете найти три основных типа Raycast
методы: ARView Raycast
, ARSession Raycast
а также Scene Raycast
(или World Raycast). Все методы написаны на Swift:
ARView.raycast(от: позволяя: выравнивание:)
Этот метод экземпляра выполняет приведение лучей, при котором луч отбрасывается в сцену из центра камеры через точку обзора, и результаты немедленно возвращаются. Вы можете использовать этот тип raycast в ARKit 3.5.
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:)
Этот метод экземпляра повторяет запрос на преобразование лучей с течением времени, чтобы уведомить вас об обновленных поверхностях в физической среде. Вы можете использовать этот тип raycast в ARKit 3.5.
func trackedRaycast(_ query: ARRaycastQuery,
updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?
ARView.trackedRaycast(от: позволяя: выравнивание: updateHandler:)
Этот метод экземпляра RealityKit также выполняет отслеживаемое приведение лучей, но здесь луч отбрасывается в сцену из центра камеры через точку обзора.
func trackedRaycast(from point: CGPoint,
allowing target: ARRaycastQuery.Target,
alignment: ARRaycastQuery.TargetAlignment,
updateHandler: @escaping ([ARRaycastResult]) -> Void) -> ARTrackedRaycast?
КОД СНОВА 1:
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
}
КОД СНОВА 2:
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()