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

标签 swift augmented-reality arkit realitykit lidar

最近,我做了一个激光雷达扫描项目。 这非常困难。我需要操作顶点数据。 所以我尝试了这段代码

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

最佳答案

我自己经历过这个,所以我想我会把我的解决方案交给你。

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

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

关于swift - 如何在 ARKit 的重建网格中获取顶点位置?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64590893/

相关文章:

swift - 在 Swift 中使用 UserDefaults 保存 SCNVector3 的值

swift - 通过按下按钮快速停止 for 或 Repeat-while 循环

rotation - 使用getRotationMatrix()和getOrientation()查找方向

swift - 让 AR 视频适应背景

java - 如何在 ARCore 中叠加二维图像?

android - 使用 Vuforia SDK 在 Android 增强现实应用程序中绘制文本

ios - 实现返回节点子树中满足测试的所有节点的 passingTest

ios - 幽灵 View Controller

swift - 以编程方式在 tvOS 上设置顶级镜像?

ios - ios 中的 Twitterkit 3.0 'TWTRInvalidInitializationException' 错误