swift - ARKit – 如何使用 LiDAR 从 iPhone/iPad 导出 OBJ?
问题描述
如何将最新 iPad Pro 上ARMeshGeometry
的新 API 生成的文件导出到文件中?SceneReconstruction
.obj
这是SceneReconstruction文档。
解决方案
从 Apple 的Visualizing Scene Scemantics示例应用程序开始,您可以从帧中的第一个锚点检索ARMeshGeometry对象。
导出数据最简单的方法是首先将其转换为 MDLMesh:
extension ARMeshGeometry {
func toMDLMesh(device: MTLDevice) -> MDLMesh {
let allocator = MTKMeshBufferAllocator(device: device);
let data = Data.init(bytes: vertices.buffer.contents(), count: vertices.stride * vertices.count);
let vertexBuffer = allocator.newBuffer(with: data, type: .vertex);
let indexData = Data.init(bytes: faces.buffer.contents(), count: faces.bytesPerIndex * faces.count * faces.indexCountPerPrimitive);
let indexBuffer = allocator.newBuffer(with: indexData, type: .index);
let submesh = MDLSubmesh(indexBuffer: indexBuffer,
indexCount: faces.count * faces.indexCountPerPrimitive,
indexType: .uInt32,
geometryType: .triangles,
material: nil);
let vertexDescriptor = MDLVertexDescriptor();
vertexDescriptor.attributes[0] = MDLVertexAttribute(name: MDLVertexAttributePosition,
format: .float3,
offset: 0,
bufferIndex: 0);
vertexDescriptor.layouts[0] = MDLVertexBufferLayout(stride: vertices.stride);
return MDLMesh(vertexBuffer: vertexBuffer,
vertexCount: vertices.count,
descriptor: vertexDescriptor,
submeshes: [submesh]);
}
}
拥有 MDLMesh 后,导出到 OBJ 文件是轻而易举的事:
@IBAction func exportMesh(_ button: UIButton) {
let meshAnchors = arView.session.currentFrame?.anchors.compactMap({ $0 as? ARMeshAnchor });
DispatchQueue.global().async {
let directory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)[0];
let filename = directory.appendingPathComponent("MyFirstMesh.obj");
guard let device = MTLCreateSystemDefaultDevice() else {
print("metal device could not be created");
return;
};
let asset = MDLAsset();
for anchor in meshAnchors! {
let mdlMesh = anchor.geometry.toMDLMesh(device: device);
asset.add(mdlMesh);
}
do {
try asset.export(to: filename);
} catch {
print("failed to write to file");
}
}
}
推荐阅读
- entity-framework - .net Core EF 尝试通过查询创建组
- amazon-web-services - 如何将 aws 实例制作为托管实例?
- python-3.x - Django:如果模型尚不存在,序列化程序会在迁移中引发异常
- r - 在 LDA 中查找数据已分配到的三个类别的均值
- r - futile.logger 警告标准错误
- reactjs - 如何使用 React 路由器 v6 将参数传递到链接中?
- java - 带有 Spring Boot Java Validation 类型错误的 FieldUndefined 的 GraphQL
- tinymce - TinyMCE 内联拖放图像上传不起作用
- html - 在Angular中访问另一个对象数组中的对象时出现问题
- kubernetes - 如何从 Kubernetes 仪表板添加“副本”?