调用displayTransform后AR图像方向异常(竖屏旋转180°)求助
竖屏模式下ARFrame图像方向错误的原因及解决办法
这个问题我之前做AR项目时也踩过坑,核心是AR摄像头捕获的原始图像方向和UI显示方向的映射逻辑没对齐,咱们来一步步拆解原因和解决方法:
核心原因
capturedImage的原始方向特性:ARSession捕获的capturedImage是CVImageBuffer格式,它的默认方向是横屏右侧朝上(landscape-right)——这是因为手机摄像头传感器本身是横置的。竖屏模式下,UI显示方向和传感器原始方向存在180度旋转差,但displayTransform的设计初衷是映射AR虚拟内容到屏幕,不是直接修正原始摄像头图像的方向,所以直接套用会出现翻转问题。- 弃用API的兼容性问题:你使用的
UIApplication.shared.statusBarOrientation在iOS 13之后已经被弃用,在多窗口/多场景应用中,这个值无法准确反映当前界面的实际方向,导致displayTransform计算出的变换矩阵不符合预期。
修正后的代码
结合ARFrame摄像头的图像方向和正确的界面方向来调整,代码如下:
if let currentFrame = sceneView.session.currentFrame { let imageBuffer = currentFrame.capturedImage // 获取当前界面的正确方向(适配iOS13+) let interfaceOrientation: UIInterfaceOrientation if #available(iOS 13.0, *) { interfaceOrientation = UIApplication.shared.windows.first?.windowScene?.interfaceOrientation ?? .portrait } else { interfaceOrientation = UIApplication.shared.statusBarOrientation } let viewportSize = sceneView.bounds.size // 获取AR内容到屏幕的显示变换 let displayTransform = currentFrame.displayTransform(for: interfaceOrientation, viewportSize: viewportSize) // 应用显示变换到原始图像 var ciImage = CIImage(cvPixelBuffer: imageBuffer).transformed(by: displayTransform) // 根据摄像头的实际图像方向修正竖屏的180度旋转 switch currentFrame.camera.imageOrientation { case .portraitUpsideDown: ciImage = ciImage.rotated(by: .pi) // 旋转180度修正 default: break } // 此时ciImage的方向在横竖屏模式下都正常了 }
关键细节解释
camera.imageOrientation:这个属性会根据设备物理姿态自动更新,直接返回摄像头捕获图像的实际方向,比依赖UI状态栏方向更准确。当设备处于竖屏倒转状态时,它会返回.portraitUpsideDown,此时我们需要额外旋转180度来对齐UI显示。- 替换弃用API:用
windowScene?.interfaceOrientation获取当前窗口的界面方向,在iOS13+的多场景应用中更可靠,避免方向判断错误。
内容的提问来源于stack exchange,提问作者rhcpfan




