适用于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)