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

时间:2017-08-04 07:37:46

标签: ios swift scenekit metal arkit

我正在尝试从我自己从文件中解析的自定义数据创建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] *终止   应用程序由于未捕获的异常&#39; NSRangeException&#39;,原因:&#39; *    - [__ NSArrayM objectAtIndexedSubscript:]:索引1超出界限[0 .. 0]&#39;

2 个答案:

答案 0 :(得分:0)

关于此方法的

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

答案 1 :(得分:0)

您应该从VertexDescriptor删除布局:

这些行:

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

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

vertexDescriptor.setPackedOffsets()
vertexDescriptor.setPackedStrides()