Якорь по умолчанию в Reality Composer

Когда вы создаете любую сцену с помощью Reality Composer, вы должны сначала выбрать, какой тип привязки "пол, стена, лицо, объект" это означает, что когда вы загружаете сцену, она автоматически устанавливает себя на указанную привязку.

Мой вопрос: есть ли способ установить его вручную из кода, чтобы я, например, провел проверку попадания, а затем привязал его к определенной точке вручную?

Спасибо.

2 ответа

В официальной документации нет ссылки на возможность изменения привязки по умолчанию во время выполнения, но из вашего описания похоже, что вы можете попробовать Select Object Anchoring to Place a Scene Near Detected Objectsкак описано здесь: https://developer.apple.com/documentation/realitykit/creating_3d_content_with_reality_composer/selecting_an_anchor_for_a_reality_composer_scene

Вы можете легко применить другой тип привязки (при реализации проверки попадания или преобразования лучей), используя следующий код (привязка по умолчанию в Reality Composer .horizontal):

import ARKit
import RealityKit

@IBAction func onTap(_ sender: UITapGestureRecognizer) {

    let estimatedPlane: ARRaycastQuery.Target = .estimatedPlane              
    let alignment: ARRaycastQuery.TargetAlignment = .vertical           
    let tapLocation: CGPoint = sender.location(in: arView)

    let result: [ARRaycastResult] = arView.raycast(from: tapLocation,
                                               allowing: estimatedPlane,
                                              alignment: alignment)

    guard let rayCast: ARRaycastResult = result.first
    else { return }

    let anchor = AnchorEntity(world: rayCast.worldTransform)
    anchor.addChild(myScene)
    arView.scene.anchors.append(anchor)
}

Или вы можете разместить якоря автоматически (например, как ARFaceAnchor для обнаруженного лица):

extension ViewController: ARSessionDelegate {

    func session(_ session: ARSession,didUpdate anchors: [ARAnchor]) {

        guard let faceAnchor = anchors.first as? ARFaceAnchor
        else { return }

        let anchor = AnchorEntity(anchor: faceAnchor)

        // RealityKit's Facial analog
        // AnchorEntity(.face).self

        anchor.addChild(glassModel)        
        arView.scene.anchors.append(anchor)
    }
}

... или вы можете разместить ARImageAnchor так же:

extension ViewController: ARSessionDelegate {

    func session(_ session: ARSession, didUpdate anchors: [ARAnchor]) {

         guard let imageAnchor = anchors.first as? ARImageAnchor,
               let _ = imageAnchor.referenceImage.name
         else { return }

        let anchor = AnchorEntity(anchor: imageAnchor)

        // RealityKit's image anchor analog
        // AnchorEntity(.image(group: "Group", name: "model")).self

        anchor.addChild(imageModel)        
        arView.scene.anchors.append(anchor)
    }
}
Другие вопросы по тегам