Создать ARRaycastQuery из 3d-объекта - PullRequest
1 голос
/ 29 февраля 2020

Я занимаюсь разработкой приложения с использованием ARKit и SceneKit.

Возможно ли создать запрос raycast с использованием ARRaycastQuery из объекта в сцене?

Scene

Как показано на картинке выше, я пытаюсь навести луч из [3d объекта] и найти плоскость в этом направлении.

Это то, что я пытаюсь:

    let location = objectNode.simdWorldPosition
    let startRayPoint = simd_float3(location.x, location.y, location.z + 2.0)
    let endRayPoint = simd_float3(location.x, location.y, location.z - 2.0)

    let query = ARRaycastQuery(origin: startRayPoint, direction: endRayPoint, allowing: .estimatedPlane, alignment: .any)
    timer =  Timer.scheduledTimer(withTimeInterval: 1.0, repeats: true) { (timer) in
        if let result = self.sceneView.castRay(for: query).first {
            print("castRay result: \(result)")
        } else {
            print("failed to cast ray")
        }
    }

Я попытался определить местоположение [объекта] и запустить луч с расстояния 2 м и направления на 2 м вперед, манипулируя осью «z». Однако запрос всегда терпит неудачу, что я делаю не так? Это вообще возможно?

1 Ответ

1 голос
/ 29 февраля 2020

Если вы используете ARKit, вы можете реализовать 3 различных метода приведения лучей :

  • raycast (_:)

Этот метод экземпляра проверяет один раз наличие пересечений между лучом (лучом, который вы создаете из интересующей вас точки экрана) и реальными поверхностями.

  • raycastQuery (from: позволить: alignment:)

Этот метод экземпляра создает запрос raycast, исходящий из точки на виде, выровненной по центру поля зрения камеры.

  • trackedRaycast (_: updateHandler:)

Этот метод экземпляра со временем повторяет запрос raycast, чтобы уведомить вас об обновленных поверхностях в физической среде.

Но, как я вижу, вам нужно реализовать метод, который создает луч из одного 3d-объекта, который должен попасть в другой 3d-объект в сцене. В этом случае вам нужно реализовать метод экземпляра RealityKit, который можно использовать внутри сцены ARView:

raycast(from:to:query:mask:relativeTo:)

Этот метод выполняет convex ray cast для всей геометрии сцены для луч между двумя конечными точками .

func raycast(from startPosition: SIMD3<Float>, 
                 to endPosition: SIMD3<Float>, 
                          query: CollisionCastQueryType = .all, 
                           mask: CollisionGroup = .all, 
     relativeTo referenceEntity: Entity? = nil) -> [CollisionCastHit]

В реальном коде это может выглядеть так:

import RealityKit

let raycasts: [CollisionCastHit] = arView.scene.raycast(from: [2, 2, 2], 
                                                          to: [9, 9, 9], 
                                                       query: .all,  
                                                        mask: .all, 
                                                  relativeTo: nil)

guard let rayCast: CollisionCastHit = raycasts.first
else { return }

print(rayCast.entity.name)
print(rayCast.distance)

Но помните!

Метод игнорирует объекты, у которых отсутствует CollisionComponent . Итак, перед использованием вышеупомянутого метода вам нужно назначить форму столкновения для будущей модели попадания.

...