В чем реальная выгода от использования Raycast в ARKit и RealityKit?

Для чего нужна трансляция лучей в ARKit и RealityKit?

И когда мне нужно использовать метод экземпляра makeRaycastQuery:

func makeRaycastQuery(from point: CGPoint, 
                 allowing target: ARRaycastQuery.Target, 
                       alignment: ARRaycastQuery.TargetAlignment) -> ARRaycastQuery?

Любая помощь приветствуется.


person Andy Fedoroff    schedule 05.06.2019    source источник


Ответы (1)


Simple Ray-Casting, как и Hit-Testing, помогает найти трехмерное положение на реальной поверхности, проецируя воображаемый луч из точки экрана на обнаруженную плоскость. В документации Apple (2019) есть следующее определение ray-casting:

Приведение лучей - предпочтительный метод для поиска позиций на поверхностях в реальной среде, но функции проверки попадания остаются в наличии для совместимости. Используя отслеживаемую трансляцию лучей, ARKit и RealityKit продолжают улучшать результаты, чтобы повысить точность позиционирования виртуального контента, который вы размещаете с помощью лучевой трансляции.

Когда пользователь хочет поместить виртуальный контент на обнаруженную поверхность, неплохо иметь подсказку для этого. Многие приложения AR рисуют фокусный круг или квадрат, которые дают пользователю визуальное подтверждение формы и выравнивания поверхностей, о которых известно ARKit. Итак, чтобы узнать, где разместить круг фокусировки или квадрат в реальном мире, вы можете использовать ARRaycastQuery, чтобы спросить ARKit, где какие-либо поверхности существуют в реальном мире.

Вот пример, где вы могли увидеть, как реализовать методы преобразования лучей makeRaycastQuery() и raycast():

import UIKit
import RealityKit

class ViewController: UIViewController {
    
    @IBOutlet var arView: ARView!
    let model = try! Entity.loadModel(named: "usdzModel")
    
    override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
        self.raycasting()
    }

    fileprivate func raycasting() {
            
        guard let query = arView.makeRaycastQuery(from: arView.center,
                                              allowing: .estimatedPlane,
                                             alignment: .horizontal)
        else { return }

        guard let result = arView.session.raycast(query).first
        else { return }

        let raycastAnchor = AnchorEntity(raycastResult: result)
        raycastAnchor.addChild(model)
        arView.scene.anchors.append(raycastAnchor)
    }
}

Если вы хотите узнать, как использовать Convex-Ray-Casting в RealityKit, прочтите ЭТО ЗАПИСЬ.

Если вы хотите узнать, как использовать Hit-Testing в RealityKit, прочтите ЭТО ЗАПИСЬ.

person Andy Fedoroff    schedule 05.06.2019
comment
Спасибо! Откуда нам вызывать методы переделки? От ARSessionDelegate - func session(_ session: ARSession, didUpdate frame: ARFrame)? Выполнение этого с помощью trackedRaycast приводит к условиям проводной гонки, пытающимся обновить привязку корня сцены в моем случае. - person HelloTimo; 17.09.2019
comment
Большое спасибо! Я забыл добавить, что я пытался, чтобы результат преобразования постоянно следовал за положением камеры. Попытка получить из примера кода Apple iOS13 ARKit3 + SceneKit Размещение объектов и обработка трехмерного взаимодействия I получил мои реквизиты здесь, действительно поместив вызов к raycast в session(_ session: ARSession, didUpdate frame: ARFrame). Фактически, очевидно, это не trackedRaycast(). Ваш код вызывается постоянно? Я собираюсь попробовать еще раз. - person HelloTimo; 17.09.2019
comment
Можете протестировать только через 4 дня)) - person Andy Fedoroff; 17.09.2019
comment
@HelloTimo, вы не должны вызывать trackedRaycast () из session:didUpdateFrame:, потому что это создаст trackedRaycast со скоростью 60 раз в секунду, а это много отслеживаемых raycast. Вместо этого вы должны вызывать его из таких мест, как жест касания, но это зависит от того, что вы пытаетесь сделать со своим raycast. - person Praveen Gowda I V; 26.09.2019