【问题标题】:ARKit ARCamera transform incorrectly rotated 90 degrees clockwiseARKit ARCamera 变换错误地顺时针旋转了 90 度
【发布时间】:2019-12-21 09:39:36
【问题描述】:
我正在关注其中一个关于 ARKit 的较早的 WWDC 视频,可在此处找到:
https://developer.apple.com/videos/play/wwdc2017/602/
在此视频中,他们创建了一个 AR 应用程序,该应用程序可以侦听轻击手势并使用场景视图的快照创建图像平面。
以下是视频中的相关代码:
但是,当我在我的设备上运行代码时,生成的平面总是相对于我的设备方向顺时针旋转 90 度。
例如,当我的设备处于纵向模式时,生成的平面如下所示:
同样,如果我将设备横向放置在右侧,图像平面的“顶部”将指向下方。
ARCamera 变换似乎总是相对于设备方向偏离 90 度是否有原因?
【问题讨论】:
标签:
ios
swift
scenekit
augmented-reality
arkit
【解决方案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()
}
}
}