首页 文章

是否可以同时运行两个ARSCNView?

提问于
浏览
1

我正在考虑对我现有的AR应用程序进行一些修改,我想拆分视图并以这种方式添加内部用户可以使用VR卡盒并拥有不同的体验,但Xcode总是回复我:

Session (0x102617d10): did fail with error: Error Domain=com.apple.arkit.error Code=102 "Required sensor failed."

那么,我'm supposing that I can' t同时运行2 ARSCNView 个会话,还是我错了?

1 回答

  • 1

    答案是: Yes, it's possible .

    使用以下代码完成它:

    import UIKit
    import SceneKit
    import ARKit
    
    class ViewController: UIViewController, ARSCNViewDelegate {
    
        @IBOutlet weak var sceneView: ARSCNView!
        @IBOutlet weak var sceneView2: ARSCNView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
    
            sceneView.delegate = self
            sceneView.showsStatistics = true
            let scene = SCNScene(named: "art.scnassets/ship.scn")!
            sceneView.scene = scene
            sceneView.isPlaying = true
    
            // Setup for sceneView2
            sceneView2.scene = scene
            sceneView2.showsStatistics = sceneView.showsStatistics
    
            // Now sceneView2 starts receiving updates
            sceneView2.isPlaying = true     
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            let configuration = ARWorldTrackingConfiguration()
            sceneView.session.run(configuration)
        }
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            sceneView.session.pause()
        }
        func renderer(_ renderer: SCNSceneRenderer, updateAtTime time: TimeInterval) {
            DispatchQueue.main.async {
                self.updateFrame()
            }
        }
        func updateFrame() {   
            // Clone pointOfView for Second View
            let pointOfView: SCNNode = (sceneView.pointOfView?.clone())!
    
            // Determine Adjusted Position for Right Eye
            let orientation: SCNQuaternion = pointOfView.orientation
            let orientationQuaternion: GLKQuaternion = GLKQuaternionMake(orientation.x, 
                                                                         orientation.y, 
                                                                         orientation.z, 
                                                                         orientation.w)
            let eyePos: GLKVector3 = GLKVector3Make(1.0, 0.0, 0.0)
            let rotatedEyePos: GLKVector3 = GLKQuaternionRotateVector3(orientationQuaternion, 
                                                                       eyePos)
            let rotatedEyePosSCNV: SCNVector3 = SCNVector3Make(rotatedEyePos.x, 
                                                               rotatedEyePos.y, 
                                                               rotatedEyePos.z)  
            let mag: Float = 0.064 // Interocular distance (in metres)
            pointOfView.position.x += rotatedEyePosSCNV.x * mag
            pointOfView.position.y += rotatedEyePosSCNV.y * mag
            pointOfView.position.z += rotatedEyePosSCNV.z * mag
    
            // Set PointOfView for SecondView
            sceneView2.pointOfView = pointOfView    
        }
    }
    

    有关更多详细信息,请在GitHub上查看此项目 .

相关问题