Тест удара 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()
Другие вопросы по тегам