向 ARKit 添加自定义视图

Posted

技术标签:

【中文标题】向 ARKit 添加自定义视图【英文标题】:Adding custom view to ARKit 【发布时间】:2017-06-23 14:58:29 【问题描述】:

我刚开始看苹果的 ARKitExample,我还在学习。我需要像交互式指南一样。例如,我们可以在那个区域检测到一些东西(比如 QRCode),我可以用 1 个标签显示吗?

是否可以将自定义视图(如 UIVIew、UIlabel)添加到表面?

编辑

我看到了一些添加行的示例。我需要找到如何添加额外的视图或图像。

    let mat = SCNMatrix4FromMat4(currentFrame.camera.transform)
    let dir = SCNVector3(-1 * mat.m31, -1 * mat.m32, -1 * mat.m33)
    let currentPosition = pointOfView.position + (dir * 0.1)

    if button!.isHighlighted 
        if let previousPoint = previousPoint 
            let line = lineFrom(vector: previousPoint, toVector: currentPosition)
            let lineNode = SCNNode(geometry: line)
            lineNode.geometry?.firstMaterial?.diffuse.contents = lineColor
            sceneView.scene.rootNode.addChildNode(lineNode)
        
    

我认为这段代码应该能够添加自定义图像。但我需要找到整个样本。

func updateRenderer(_ frame: ARFrame)
    drawCameraImage(withPixelBuffer:frame.capturedImage)
    let viewMatrix = simd_inverse(frame.came.transform)
    let prijectionMatrix = frame.camera.prijectionMatrix
    updateCamera(viewMatrix, projectionMatrix) 
    updateLighting(frame.lightEstimate?.ambientIntensity)
    drawGeometry(forAnchors: frame.anchors)

【问题讨论】:

【参考方案1】:

ARKit 不是渲染引擎——它不会为您显示任何内容。 ARKit 提供有关真实世界空间的信息,供渲染引擎使用,例如 SceneKit、Unity 以及您构建的任何自定义引擎(使用 Metal 等),以便它们可以显示似乎居住在真实世界空间中的内容。因此,对于 ARKit 的任何“我如何显示”问题实际上都是针对您与 ARKit 一起使用的任何渲染引擎的问题。

SceneKit 是使用 ARKit 显示 3D 内容的简单开箱即用、无需额外软件的方式,所以我想您是在问这个问题。

SceneKit 无法将 UIView 渲染为 3D 场景的一部分。但它可以将平面、立方体或其他形状以及纹理贴图 2D 内容渲染到它们上面。如果您想在 ARKit 检测到的平面上绘制文本标签,这就是研究的方向——按照示例的,嗯,示例创建与检测到的ARPlaneAnchors 对应的SCNPlane 对象,为自己获取一些文本的图像,并将该图像设置为平面几何的漫反射内容。

【讨论】:

啊谢谢。我将更多地研究 SceneKit、SCNPlane 和 SCNView。希望我可以生成动态内容。 查看最近几年来自 WWDC 的 SceneKit 演讲——几乎所有适用于 ARSCNVIew 的内容。包括有趣的动态纹理映射技巧,例如 2014 年演讲中展示的 SpriteKit 作为材质的东西。【参考方案2】:

是的,您可以在 ARKit 场景中添加自定义视图。 只需制作您的视图图像并将其添加到您想要的任何位置。 您可以使用以下代码获取 UIView 的图像

func image(with view: UIView) -> UIImage? 
    UIGraphicsBeginImageContextWithOptions(view.bounds.size, view.isOpaque, 0.0)
    defer  UIGraphicsEndImageContext() 
    if let context = UIGraphicsGetCurrentContext() 
        view.layer.render(in: context)
        let image = UIGraphicsGetImageFromCurrentImageContext()
        return image
    
    return nil

【讨论】:

以上是关于向 ARKit 添加自定义视图的主要内容,如果未能解决你的问题,请参考以下文章

向 XML 添加自定义视图...但使用 GENERIC 类型

在集合视图中使用自定义流布局时添加标题

python Django:向管理员更改列表视图添加自定义按钮

如何以编程方式使用自动布局添加自定义视图

如何以编程方式在 UITableViewCell 中添加自定义视图?

如何动态添加自定义视图xib文件