Posts

Post not yet marked as solved
4 Replies
2.5k Views
Hi community,I am basically trying to export the ARMeshGeometry generated by the new SceneReconstruction API on the latest iPad Pro to an .obj-file.ARMeshGeometry has an MTLBuffer to offer for the vertices and the indices which ultimately should be converted to an MDLMeshBuffer.The attached code successfully generates an obj file but it only has one vertex, can anybody help me?I am very new to Metal and Model I/O.Thanks and stay healthy 🙂guard let frame = arView.session.currentFrame else { return } let meshAnchors = frame.anchors.compactMap({ $0 as? ARMeshAnchor }) DispatchQueue.global().async { // Just the first mesh for testing purposes let anchor = meshAnchors[0] guard let device = MTLCreateSystemDefaultDevice() else { fatalError( "Failed to get the system's default Metal device." ) } let vertices = anchor.geometry.vertices let faces = anchor.geometry.faces let allocator = MTKMeshBufferAllocator(device: device) // Convert buffers to MDLMeshBuffer let data = Data.init(bytesNoCopy: vertices.buffer.contents(), count: vertices.count, deallocator: .none) let vertexBuffer = allocator.newBuffer(MemoryLayout<SIMD3<Float>>.stride * vertices.count, type: .vertex) vertexBuffer.fill(data, offset: vertices.offset) // Convert Index-Buffer to MDLMeshBuffer let indexData = Data.init(bytesNoCopy: anchor.geometry.faces.buffer.contents(), count: faces.count, deallocator:.none) let indexBuffer = allocator.newBuffer(MemoryLayout<UInt32>.stride * faces.count, type: .index) indexBuffer.fill(indexData, offset: 0) // Create submesh for indexes let submesh = MDLSubmesh(indexBuffer: indexBuffer, indexCount: faces.count, indexType: .uInt16, geometryType: .triangles, material: nil) let vertexFormat = MTKModelIOVertexFormatFromMetal(anchor.geometry.vertices.format) let vertexDescriptor = MDLVertexDescriptor() vertexDescriptor.attributes[0] = MDLVertexAttribute(name: MDLVertexAttributePosition, format: vertexFormat, offset: 0, bufferIndex: 0) let mdlMesh = MDLMesh(vertexBuffer: vertexBuffer, vertexCount: vertices.count, descriptor: vertexDescriptor, submeshes: [submesh]) let asset = MDLAsset() asset.add(mdlMesh) // Export MDLAsset to file let fileManager = FileManager.default var fileURL: URL do { let documentDirectory = try fileManager.url(for: .documentDirectory, in: .userDomainMask, appropriateFor:nil, create:false) fileURL = documentDirectory.appendingPathComponent("export.obj") try FileManager.default.removeItem(at: fileURL) try asset.export(to: fileURL) } catch let error as NSError { print("Error: \(error.domain)") } }
Posted
by sphira.
Last updated
.