【问题标题】:ARKit – Add a "SCNNode" to an "ARAnchor"ARKit – 将“SCNNode”添加到“ARAnchor”
【发布时间】:2018-09-04 18:32:53
【问题描述】:

我不确定我是否正确地处理了这个问题。我有一个长矩形框,我想在应用程序启动时从相机添加 -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)   
}

【问题讨论】:

    标签: scenekit augmented-reality arkit aranchor


    【解决方案1】:

    您是否故意使用renderer(_:) 函数?如果没有,那么您可以使用以下viewDidLoad

    override func viewDidLoad() {
        super.viewDidLoad()
    
        sceneView.delegate = self
    
        let scene = SCNScene(named: "art.scnassets/portal.scn")!
    
        sceneView.scene = scene
    
    }
    

    这会将启动时出现的默认火箭替换为您的门户场景。 (请注意,如果尚未建立跟踪,场景可能会四处移动。例如,如果光线不足,或者您处于没有很多特征的环境中(例如空白或重复的墙)。

    看起来你实际上并没有将hasPortalAnchor 设置为true?是否设置在其他地方?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 2018-01-30
      • 2019-08-11
      • 2019-01-30
      • 2021-12-25
      • 1970-01-01
      相关资源
      最近更新 更多