如何在 ARKit 的重建网格中获取顶点位置?

Posted

技术标签:

【中文标题】如何在 ARKit 的重建网格中获取顶点位置?【英文标题】:How to get a vertex position in ARKit's reconstructed mesh? 【发布时间】:2021-02-11 21:12:42 【问题描述】:

最近,我开始讨论激光雷达扫描项目。 这非常困难。我需要操纵顶点数据。 所以我尝试了这段代码

guard let meshAnchors = arView.session.currentFrame?.anchors.compactMap  $0 as? ARMeshAnchor  
else  return 

meshAnchors.first?.geometry.vertices // I want to get vertex position

没有顶点的位置,只有缓冲数据

我该怎么做?它是从缓冲区数据更改为数组吗? 请帮帮我。

【问题讨论】:

【参考方案1】:

我自己刚刚经历过这个,所以我想我会放弃我的解决方案。

首先从 Apple 的文档中获取 this extension 以获取特定索引处的顶点:

extension ARMeshGeometry  
    func vertex(at index: UInt32) -> SIMD3<Float> 
        assert(vertices.format == MTLVertexFormat.float3, "Expected three floats (twelve bytes) per vertex.")
        let vertexPointer = vertices.buffer.contents().advanced(by: vertices.offset + (vertices.stride * Int(index)))
        let vertex = vertexPointer.assumingMemoryBound(to: SIMD3<Float>.self).pointee
        return vertex
    

然后,要获取 ARKit 世界空间中的位置,您可以执行以下操作:

func getVertexWorldPositions(frame: ARFrame) 
    let anchors = frame.anchors.filter  $0 is ARMeshAnchor  as! [ARMeshAnchor]
    
    // Each mesh geometry lives in its own anchor
    for anchor in anchors 
        
        // Anchor's transform in world space
        let aTrans = SCNMatrix4(anchor.transform)
        
        let meshGeometry = anchor.geometry
        let vertices: ARGeometrySource = meshGeometry.vertices
        
        for vIndex in 0..<vertices.count 
            // This will give you a vertex in local (anchor) space
            let vertex = meshGeometry.vertex(at: UInt32(vIndex))
            // Create a new matrix with the vertex coordinates
            let vTrans = SCNMatrix4MakeTranslation(vertex[0], vertex[1], vertex[2])
            // Multiply it by the anchors's transform to get it into world space
            let wTrans = SCNMatrix4Mult(vTrans, aTrans)
            // Use the coordinates for something!
            let vPos = SCNVector3(wTrans.m41, wTrans.m42, wTrans.m43)
            print(vPos)
        
    

【讨论】:

以上是关于如何在 ARKit 的重建网格中获取顶点位置?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 ARKit 中平滑多边形网格?

将 ARKit 面部跟踪 3D 网格投影到 2D 图像坐标

ARKit3 如何使用 TrueDepth 相机进行人脸跟踪和其他人的面部网格?

无法获取 QR 码的正确坐标,ARKit - Swift

如何将 ARKit SCNNode 对象位置 SCNVector3 转换为纬度和经度? [关闭]

ARKit + SceneKit:将重建场景用于物理?