适用于iOS的简单立体声和ARKit

希望为希望利用iOS 11新型基于ARKit SLAM的世界跟踪器将SceneKit游戏扩展到Google Cardboard的用户提供一些快速模板代码。

主要组件是SLAMRunner,它在您和ARKit的ARSession之间进行中介。

第二个是一个简单的StereoViewController,它将您的SCScene附加到立体声“头节点”上。 可以根据自己的喜好调整摄像机的值,但普通用户对启动器的内在功能感到满意。

DualViewController.swift是一个示例类,它以100倍的喷射量实现了入门级XCode场景。

这是存储库:

mikezucc / SimpleStereoARKit
SimpleStereoARKit –关于在没有ARScene的情况下使用ARKit的简单参考指南,以及用于附加的简单便捷类…… github.com

SLAMRunner.swift

裸露的简单对象即可运行基础ARKit SLAM。 这将以matrix_float4x4的形式向matrix_float4x4提供更新,该更新是matrix_float4x4的类型别名。 您可以使用诸如headNode?.simdTransform = transform这样的值来更新SCNode的位置。

像这样附加:

 tracker = SLAMRunner() 
tracker?.delegate = self

像这样接收更新:

 protocol SLAMRunnerDelegate { 
func updatedTransform(_ transform: matrix_float4x4, imagePixelBuffer: CVPixelBuffer) // plz lock up your buffers necessarily
func trackingBadState(_ status: SLAMRunnerStatus, trackingState: ARCamera.TrackingState, error: Error?)
}

比较跟踪状态,如下所示:

 if case ARCamera.TrackingState.normal = frame.camera.trackingState { . . . 

使用将像素缓冲区转换为UIImage(您可能需要手动锁定和释放像素缓冲区):

 func pixelBufferToUIImage(_ buffer: CVPixelBuffer, options: [String: Any]? = nil) -> UIImage { 
let image = CIImage(cvPixelBuffer: buffer, options: options)
return UIImage(ciImage: image)
}

StereoscopicViewController.swift

这是作为参考模板。 它并排创建两个SCNView。 它将单个场景附加到每个视图。 然后,它为每只眼睛创建一个带有摄像机的节点,并将其附加到“头节点”。 每个场景都将视点设置到各个摄像机。

注意:zNear和眼睛间距必须非常小。 值0.01等于现实生活中的约0.125-0.25米。

 enum StereoEye { 
case left, right
}
func camera(for eye: StereoEye) -> SCNNode {
let cameraNode = SCNNode()
cameraNode.name = eye == .left ? "stereoLeft" : "stereoRight"
cameraNode.position = SCNVector3(eye == .left ? -0.1 : 0.1, 0, 0)
let camera = SCNCamera()
camera.zNear = 0.01
camera.zFar = 1000
cameraNode.camera = camera
return cameraNode
}

您可以将其附加到如下视图:

 let scene = SCNScene(named: "art.scnassets/ship.scn")! 
stereoView = StereoscopicSceneViewMaker()
stereoView?.attachStereoView(on: view, with: scene)