我正在关注ARKit上较旧的WWDC视频之一,可在此处找到: https://developer.apple.com/videos/play/wwdc2017/602/
在此视频中,他们创建了一个AR应用程序,该应用程序侦听敲击手势并使用场景视图的快照创建图像平面。
这是视频中的相关代码:
但是,当我在设备上运行代码时,生成的平面始终相对于设备的方向顺时针旋转90度。 例如,将设备保持为纵向模式时,生成的平面如下所示:
类似地,如果我将设备以横向放置,图像平面的“顶部”将指向下方。
是否存在ARCamera变换相对于设备方向总是偏离90度的原因?
答案 0 :(得分:1)
默认情况下,iPhone或iPad的摄像头捕获的图像以摄像头传感器的自然横向方向编码。制作快照时(即使设备为纵向),iOS也会写入以下方向值:
CGImagePropertyOrientation.right
在生成的图像文件中。 ARKit应用程序会从文件的元数据中读取此值,然后应用
90° ClockWise
旋转来显示图像,以便您捕获的图像以预期的摄影师方向显示。
您需要执行相反的操作–旋转图像 90° CounterClockWise
。
因此,请阅读this post,以了解如何使用CVPixelBuffer
来制作它。
此外,以下扩展方法也可以为您提供帮助:
extension CGImagePropertyOrientation {
init(_ uiOrientation: UIImage.Orientation) {
switch uiOrientation {
case .up: self = .up
case .upMirrored: self = .upMirrored
case .down: self = .down
case .downMirrored: self = .downMirrored
case .left: self = .left
case .leftMirrored: self = .leftMirrored
case .right: self = .right
case .rightMirrored: self = .rightMirrored
@unknown default: fatalError()
}
}
}
extension UIImage.Orientation {
init(_ cgOrientation: UIImage.Orientation) {
switch cgOrientation {
case .up: self = .up
case .upMirrored: self = .upMirrored
case .down: self = .down
case .downMirrored: self = .downMirrored
case .left: self = .left
case .leftMirrored: self = .leftMirrored
case .right: self = .right
case .rightMirrored: self = .rightMirrored
@unknown default: fatalError()
}
}
}