You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

调用displayTransform后AR图像方向异常(竖屏旋转180°)求助

竖屏模式下ARFrame图像方向错误的原因及解决办法

这个问题我之前做AR项目时也踩过坑,核心是AR摄像头捕获的原始图像方向和UI显示方向的映射逻辑没对齐,咱们来一步步拆解原因和解决方法:

核心原因

  1. capturedImage的原始方向特性:ARSession捕获的capturedImage是CVImageBuffer格式,它的默认方向是横屏右侧朝上(landscape-right)——这是因为手机摄像头传感器本身是横置的。竖屏模式下,UI显示方向和传感器原始方向存在180度旋转差,但displayTransform的设计初衷是映射AR虚拟内容到屏幕,不是直接修正原始摄像头图像的方向,所以直接套用会出现翻转问题。
  2. 弃用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

火山引擎 最新活动