ARKit - добавить "SCNNode" к "ARAnchor"

Я не уверен, что подхожу к этому правильно. У меня есть длинная прямоугольная рамка, которую я хочу добавить -1,5 с камеры при запуске приложения. Но я хочу, чтобы он был стационарным, как корабль, который приходит по умолчанию в проекте ARKit. Но всякий раз, когда я добавляю его, объект остается относительно (относительно расстояния) камеры. то есть - двигаться к нему, он движется назад, двигаться назад, он движется вперед.

Хотя я бросил якорь на сцене, я бы решил эту проблему, но я все еще чувствую тот же эффект. Вот мой код Любая помощь будет оценена:

override func viewDidLoad() {
    super.viewDidLoad()

    // Set the view's delegate
    sceneView.delegate = self

    // Show statistics such as fps and timing information
    //sceneView.showsStatistics = true

    // Create a new scene
    let scene = SCNScene()//

    // Set the scene to the view
    sceneView.scene = scene 
}

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    // Create a session configuration
    let configuration = ARWorldTrackingConfiguration()

    //configuration.planeDetection = .horizontal

    // Run the view's session
    sceneView.session.run(configuration)

    print(#function, sceneView.session.currentFrame)
}

// MARK: - SCNSceneRendererDelegate
    func renderer(_ renderer: SCNSceneRenderer, didRenderScene scene: SCNScene, atTime time: TimeInterval) {
        print(#function, sceneView.session.currentFrame)

        if !hasPortalAnchor {

            //add anchor - this may take a second as the current frames are initially nil
            if let currentFrame = sceneView.session.currentFrame {
                var translation = matrix_identity_float4x4
                translation.columns.3.z = -1.3
                let transform = simd_mul(currentFrame.camera.transform, translation)

                if (arrAnchors.count < 1) {
                let portalAnchor = ARAnchor(transform: transform)
                sceneView.session.add(anchor: portalAnchor)
                arrAnchors.append(portalAnchor)
                print(arrAnchors)
                }
            }

        } else {
            hasPortalAnchor = true
        }          
    }

//this function gets called whenever we add an anchor to our scene
func renderer(_ renderer: SCNSceneRenderer, nodeFor anchor: ARAnchor) -> SCNNode? {

    let portalScene = SCNScene(named: "art.scnassets/portal.scn")! 
    return portalScene.rootNode.childNode(withName: "portal", recursively: true)   
}

1 ответ

Вы сознательно используете renderer(_:) функционировать? Если нет, то вы можете просто использовать следующее viewDidLoad:

override func viewDidLoad() {
    super.viewDidLoad()

    sceneView.delegate = self

    let scene = SCNScene(named: "art.scnassets/portal.scn")!

    sceneView.scene = scene

}

Это заменит ракету по умолчанию, которая появляется при запуске, вашей сценой портала. (Обратите внимание, что сцена может перемещаться, если отслеживание не было установлено. Например, если освещение слабое, или если вы находитесь в среде без многих функций (например, пустой или повторяющейся стены)).

Кроме того, похоже, что вы на самом деле не настройки hasPortalAnchor к правде? Это устанавливается где-то еще?

Другие вопросы по тегам