我一直在尝试使用以下代码从一组SCNVector3位置创建一个自定义SCNGeometry多边形:
private func polygonGeometry (vertices: [SCNVector3]) -> SCNGeometry {
var indices: [Int32] = [Int32(vertices.count)]
indices.append(contentsOf: generateIndices(max: vertices.count))
let vertexSource = SCNGeometrySource(vertices: vertices )
let indexData = Data(bytes: indices,
count: indices.count * MemoryLayout<Int32>.size)
let element = SCNGeometryElement(data: indexData,
primitiveType: .polygon,
primitiveCount: 1,
bytesPerIndex: MemoryLayout<Int32>.size)
return SCNGeometry(sources: [vertexSource], elements: [element])
}
使用此helperMethod可以生成正确数量的索引:
private func generateIndices(max maxIndexValue: Int) -> [Int32]{
var counter: Int = 0
var output: [Int32] = []
while counter < maxIndexValue {
output.append(Int32(counter))
counter += 1
}
return output
}
该代码对于某些多边形可以正常工作。但是,有时在尝试创建自定义几何图形时在控制台中出现以下错误,并且程序崩溃。
[MTLDebugDevice validateNewBufferArgs:options:]:467: failed assertion Cannot create buffer of zero length.
有人知道为什么会这样吗?代码中是否有任何缺陷?
[EDIT]:我相信当第一个位置和最后一个位置具有相同的x,y,z值时会发生问题。只需从位置数组中删除最后一个位置,多边形就会按预期呈现!