【问题标题】:How to add a semi-transparent background on top of camera ARKit如何在相机 ARKit 顶部添加半透明背景
【发布时间】:2019-08-26 01:15:41
【问题描述】:

我正在尝试添加一个半透明的背景,以覆盖来自 ARKit 的相机视图。

我尝试不同的东西:

  • sceneView.scene 添加背景,但不支持透明度
  • 添加一个overlaySKScene,但我的场景中的节点也被覆盖了。
  • 使用会话中的 CIImage > captureImage 但太慢了。
  • 使用这个帖子:Reliable access and modify captured camera frames under SceneKit,可以转换为黑白,但我不明白如何保持颜色和混合灰色。
  • 在 OpenGL 或 Metal 上搜索,但我是菜鸟!

那么,您有想法在 ARKit 中实现该操作吗? 提前致谢。

【问题讨论】:

    标签: swift scenekit augmented-reality arkit metal


    【解决方案1】:

    你可以这样做:

    import ARKit
    
    class ViewController: UIViewController,
                          ARSCNViewDelegate {
    
        @IBOutlet var sceneView: ARSCNView!
    
        override func viewDidLoad() {
            super.viewDidLoad()
            sceneView.delegate = self
            sceneView.session.delegate = self
            let scene = SCNScene()
            sceneView.scene = scene
    
            let planeNode = SCNNode()
    
            planeNode.geometry = SCNPlane(width: 100, 
                                         height: 100)
    
            planeNode.geometry?.firstMaterial?.diffuse.contents = UIColor(white: 0,
                                                                          alpha: 0.9)
            planeNode.position.z = -5     // 5 meters away
    
            sceneView.pointOfView?.addChildNode(planeNode)      // PINNING TO CAMERA
        }
    
        override func viewWillAppear(_ animated: Bool) {
            super.viewWillAppear(animated)
            let configuration = ARWorldTrackingConfiguration()
            sceneView.session.run(configuration)
        }
        override func viewWillDisappear(_ animated: Bool) {
            super.viewWillDisappear(animated)
            sceneView.session.pause()
        }
    }
    

    ...或扩展:

    extension ViewController: ARSessionDelegate {
    
        func session(_ session: ARSession,
               didUpdate frame: ARFrame) {
    
            let planeNode = SCNNode()
    
            planeNode.geometry = SCNPlane(width: 100, 
                                         height: 100)
    
            planeNode.position.z = -5
    
            planeNode.geometry?.firstMaterial?.diffuse.contents = UIColor(white: 0, 
                                                                          alpha: 0.9)
    
            // var translation = matrix_identity_float4x4
            // translation.columns.3.z = -5
            // planeNode.simdTransform = matrix_multiply(translation,
            //                                           frame.camera.transform)
    
            sceneView.pointOfView?.addChildNode(planeNode)
        }
    }
    

    【讨论】:

    • 您好,感谢您的回复,但我需要一个始终覆盖相机的背景。实际上就像一个 2D 静态平面。这个平面不能移动,它必须放在相机视图和场景节点之间。
    • 很简单。将此平面固定到 ARCamera 的变换。所以无法追踪。
    • 是的,它的工作!很好的解决方案。如果有人对纯 OpenGL 或 Metal 中的相同技巧有想法,我很有趣。谢谢@ARGeo
    • @ARGeo,你能用一些示例代码解释一下“将这个平面固定到 ARCamera 的变换”是什么意思吗?
    • 您的意思是有效地将最后 3 行添加到 func session(_ session: ARSession, didUpdate frame: ARFrame) 吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-15
    • 1970-01-01
    • 2015-11-12
    • 2015-07-13
    • 1970-01-01
    相关资源
    最近更新 更多