来自自定义数据的模型 I/O 网格

Posted

技术标签:

【中文标题】来自自定义数据的模型 I/O 网格【英文标题】:Model I/O mesh from custom data 【发布时间】:2018-01-12 00:58:02 【问题描述】:

我正在尝试使用从文件中解析的自定义数据创建 MDLMesh。该文件仅包含顶点位置和三角形索引;我将它们提取到两个 Swift Data 对象中,float3 格式用于顶点,uint32 格式用于索引。

我的问题是我的 MDLMesh 似乎无法正常工作,因为我无法将其导入 SceneKit(生成的 SCNGeometry 似乎“空”),也无法从中创建法线(崩溃)。

下面是 MDLMesh 的代码:

 let mesh = MDLMesh()
        mesh.vertexBuffers = [MDLMeshBufferData(type: .vertex, data: vertexData)]
        mesh.vertexCount = floats.count/3
        let vertexDescriptor = MDLVertexDescriptor()
        let attribute = MDLVertexAttribute(name: MDLVertexAttributePosition, format: .float3, offset: 0, bufferIndex: 0)
        let layout = MDLVertexBufferLayout(stride: MemoryLayout<float3>.stride)
        vertexDescriptor.attributes = [attribute]
        vertexDescriptor.layouts = [layout]  

然后我创建一个子网格(描述三角形):

let submesh = MDLSubmesh(indexBuffer:  MDLMeshBufferData(type: MDLMeshBufferType.index, data: indexData),
           indexCount: uint32Indexes.count-uint32Indexes.count/4,
           indexType: .uint32,
           geometryType: .triangles,
           material: nil)

mesh.submeshes = [submesh]

你看出什么不对了吗?还是只是我的数据不正确? 谢谢你

注意:请注意,indexCountvertexCount 都是正确的,即使没有更多上下文,它们的定义看起来也很奇怪:)

编辑:尝试制作法线时:

mesh.addNormals(withAttributeNamed: MDLVertexAttributeNormal, creaseThreshold: 0)

这是我得到的错误:

2017-08-04 09:39:24.078436+0200 MyAppName[506:70657] * 终止 应用程序由于未捕获的异常 'NSRangeException',原因:'* -[__NSArrayM objectAtIndexedSubscript:]: 索引 1 越界 [0 .. 0]'

【问题讨论】:

【参考方案1】:

Apple documentation 在此方法上声明:“在不包含顶点位置数据的网格上调用此方法会引发异常。”,我相信这正是这里的问题:您的 vertexData 似乎没有元素它。

【讨论】:

既然我解决了我的问题,我可能应该添加一个答案!问题显然是我在添加描述之前提供了数据,所以当我添加数据时,所有内容都被默认的描述值替换!【参考方案2】:

您应该从VertexDescriptor 中删除布局:

这些行:

let layout = MDLVertexBufferLayout(stride: MemoryLayout<float3>.stride)
vertexDescriptor.layouts = [layout]

并在设置VertexDescriptor的末尾添加这些行:

vertexDescriptor.setPackedOffsets()
vertexDescriptor.setPackedStrides()

【讨论】:

以上是关于来自自定义数据的模型 I/O 网格的主要内容,如果未能解决你的问题,请参考以下文章

如果我在 python 管道中有自定义的集成模型,如何进行交叉验证和网格搜索

如何为来自相关模型的聚合数据实现自定义 django 过滤器

R语言使用caret包对GBM模型自定义参数调优:自定义参数优化网格

Redis底层的I/O模型

给定自定义模型,网格搜索返回完全相同的结果

在派生自熊猫数据框的图中自定义图例