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

3

最近,我在进行激光雷达扫描项目。 这非常困难。我需要操作顶点数据。 所以我尝试使用以下代码:

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

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

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

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

enter image description here

1个回答

4

我自己也经历了这个问题,所以我想把我的解决方案分享给你。

首先,请从苹果的文档中获取 此扩展,以获取特定索引处的顶点:

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)
        }
    }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接