我正在做一个学生项目,我想为我使用配备了新的LiDAR传感器的iPad扫描的网格添加纹理。
然而,要对网格进行纹理处理,我需要添加纹理坐标。我目前的计划是将扫描的网格转换为MDLMesh,并将所有子网格添加到MDLAsset容器中。然后,我使用foreach循环遍历MDLMeshes。在每次迭代中,我在当前网格上调用函数"MDLMesh.addUnwrappedTextureCoordinates“。不幸的是,它总是会导致崩溃。有时我可以在出现错误之前遍历两个网格,有时我甚至不会将UV添加到一个网格中。
我不是swift或Model IO的专家,但对我来说似乎很奇怪,当我可以很好地添加法线时,这个操作会崩溃。
我得到的错误如下所示:
Can't choose for edge creation
libc++abi.dylib: terminating with uncaught exception of type std::out_of_range: unordered_map::at: key not found
我使用的代码如下所示:
private func unwrapTextureCoordinates(asset: MDLAsset) -> MDLAsset{
let objects = asset.childObjects(of: MDLMesh.self)
for object in objects{
if let mesh = object as? MDLMesh{
mesh.addNormals(withAttributeNamed: MDLVertexAttributeNormal, creaseThreshold: 0.5)
mesh.addAttribute(withName: MDLVertexAttributeTextureCoordinate, format: .float2)
mesh.addUnwrappedTextureCoordinates(forAttributeNamed: MDLVertexAttributeTextureCoordinate)
}
}
return asset
}
希望有人能告诉我哪里出了问题,或者给我指明正确的方向。
发布于 2021-03-13 11:31:37
在我找不到导致这个问题的原因后,我求助于Unity和它的ARFoundation包装器,看看我是否能够在那里计算任何UV。我发现Unity相当于Model I/O的"addUnwrappedTextureCoordinates",即Unwrapping.GeneratePerTriangleUV,为每个三角形计算3个UV。
现在,当我在Unity中运行这个函数时,我的网格也得到了一个超出范围的异常,就像在Swift中一样。错误描述指出UV坐标的数量不能超过网格中的顶点数量-这是有意义的,因为我获得的UV坐标是网格中顶点数量的三倍。因此,我高度怀疑使用模型I/O的Swift中的超出范围异常具有相同的原因。
当然,有很多解决方法可以解决这个问题,但我采用了不同的解决方案,因为“解包”类无论如何都是"UnityEngine.Editor“命名空间的一部分,因此我不能在完成的构建中使用它(这正是我想要的)。
相反,我遇到了the function in this thread来为我的网格计算一组UV。我利用了它,它完全按照我想要的那样工作。代码是用C#编写的,因此我决定使用Unity引擎继续我的项目。然而,我不认为将函数转换成Swift会有很大的麻烦。
https://stackoverflow.com/questions/66603354
复制