ARKit ARCamera变换错误地将时钟顺时针旋转90度

时间:2019-08-14 20:04:19

标签: ios swift scenekit augmented-reality arkit

我正在关注ARKit上较旧的WWDC视频之一,可在此处找到: https://developer.apple.com/videos/play/wwdc2017/602/

在此视频中,他们创建了一个AR应用程序,该应用程序侦听敲击手势并使用场景视图的快照创建图像平面。

这是视频中的相关代码:

code

但是,当我在设备上运行代码时,生成的平面始终相对于设备的方向顺时针旋转90度。 例如,将设备保持为纵向模式时,生成的平面如下所示:

code2

类似地,如果我将设备以横向放置,图像平面的“顶部”将指向下方。

是否存在ARCamera变换相对于设备方向总是偏离90度的原因?

1 个答案:

答案 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()
        }
    }
}